preyMedlem sedan jan. 2002369 inlägg
Jag håller på att programmera ett GUI till ett luffarschack spel.
Jag har kommit fram till hur paint() metoden bör se ut, men vilken class ska jag bygga bilden/brädet av? Hittills har jag lyckats rita bilden, men som komponent får denb storleken 0x0 och hamnar under andra komponenter, t.ex. JLabel.
Jag kör Swing.
Snälla hjälp!
Jag behöver kunna göra. drawLine(...) motsv. samt ävenm läsa in en liten bild (spelpjäs) och lägga till på enviss plats i brädet.
missModestyMedlem sedan apr. 2005228 inlägg
Lite vag förklaring om hur du implementerat spelet hittills och därför svårt att svara, men jag svarar lika allmänt som du frågade... ;)
För att läsa in den lilla bilden på en knapp:
ImageIcon i = new ImageIcon("bilden.gif");
JButton b = new JButton(i);
För att läsa in den lilla bilden på en panel sätter du in detta i panelens paintComponent-metod:
ImageIcon i = new ImageIcon("bilden.gif");
Image j = i.getImage();
g.drawImage(j, 20, 20, this);
Detta ritar bilden vid position 20,20 från övre vänstra hörnet.
Sen hade du kunnat bygga upp spelet med knappar där man väljer var man vill sätta nästa kryss genom att trycka på vald ruta.
missModestyMedlem sedan apr. 2005228 inlägg
En vag fortsättning är:
Container cp = getContentPane();
cp.setGridlayout(new GridLayout(size, size));
for (int i =0; i != size; i++)
{
for (int j = 0; j != size; j++)
{
button[i][j] = new BoardButton(board, this);
button[i][j].setBackground(Color.white);
cp.add(button[i][j]);
}
}
BoardButton skrivs sen på lämpligt sätt för att hantera ett klick osv...
preyMedlem sedan jan. 2002369 inlägg
Ska försöka förklara lite bättre:
Fönstret till vänster i bild är hur det ser ut när jag startar upp guit. Tyvärr får rutnätet ingen riktig plats, vilket tydligt syns när man förminskar fönstret (knapparna och texten lägger sig över). Om rutnätet skulle bli tilldelad en plats skulle helt enkelt knappen och texten försvinna urt bild istället. Ett annat symptom är att jag inte kan kösa setBackground på rutnätet (som för övrigt är en JPanel med en paint() funktion) [rättare sagt, jag kan köra funktionen, men inget resultat syns - eftersom att komponenten, enligt java, är 0x0 pixlar]..
Nån som vet hur jag kan fixa?
jmeMedlem sedan maj 20011 967 inlägg
Du har en klass som ärver från JPanel vars storlek ser ut att vara 0x0?
Pröva att anropa metoden setPreferredSize() i konstruktören.
preyMedlem sedan jan. 2002369 inlägg
det funkade, dock så blir det konstigt när man resizar fönsret (text hamnar under spelplanen). Det tycktes dock bli så även om man bara hade 2 st regelrätta JLabels.
Jag får lösa det genom att sätta fasta storlekar och resize-false.
Tack för svaren!
LimeMedlem sedan sep. 2001837 inlägg
Jag tycker iofs att du gör det onödigt svårt för dig...
en liten början till GUI-klass så som jag hade implementerat det:
/*
* Created on Apr 26, 2005
*
*/
package com.lime.crisscross;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JPanel;
/**
* @author Lime
*
*/
public class CrissCrossGUI extends JFrame implements ActionListener {
private javax.swing.JPanel jContentPane = null;
private JButton jButton = null;
private JPanel jPanel = null;
private static final int SIZE_X = 10;
private static final int SIZE_Y = 10;
private static final int CRISS = 1;
private static final int CROSS = 2;
private int whoIsNext = CRISS;
/**
* This is the default constructor
*/
public CrissCrossGUI() {
super();
initialize();
}
/**
* This method initializes this
*
* @return void
*/
private void initialize() {
this.setSize(300,200);
this.setContentPane(getJContentPane());
this.setTitle("CrissCross");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
/**
* This method initializes jContentPane
*
* @return javax.swing.JPanel
*/
private javax.swing.JPanel getJContentPane() {
if(jContentPane == null) {
jContentPane = new javax.swing.JPanel();
jContentPane.setLayout(new java.awt.BorderLayout());
jContentPane.add(getJButton(), java.awt.BorderLayout.EAST);
jContentPane.add(getJPanel(), java.awt.BorderLayout.CENTER);
}
return jContentPane;
}
/**
* This method initializes jButton
*
* @return javax.swing.JButton
*/
private JButton getJButton() {
if (jButton == null) {
jButton = new JButton();
jButton.setText("Rensa");
jButton.setActionCommand("RENSA");
}
return jButton;
}
/**
* This method initializes jPanel
*
* @return javax.swing.JPanel
*/
private JPanel getJPanel() {
if (jPanel == null) {
jPanel = new JPanel(new GridLayout(SIZE_X, SIZE_Y));
for(int x = 0; x < SIZE_X; x++)
{
for(int y = 0; y < SIZE_Y; y++)
{
jPanel.add(getButton());
}
}
}
return jPanel;
}
private JButton getButton()
{
JButton b = new JButton(" ");
//b.setSize(10,10);
b.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
b.addActionListener(this);
return b;
}
/* (non-Javadoc)
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
public void actionPerformed(ActionEvent e) {
JButton b = (JButton) e.getSource();
String text = "X";
if(whoIsNext == CRISS)
{
text = "O";
whoIsNext = CROSS;
}
else
{
whoIsNext = CRISS;
}
b.setText(text);
b.setEnabled(false);
}
}
Kan dock säg att om man även ska ha in automatiskt rättning i detta så skulle jag överlagra JButton i en egen klass Marker och sedan ha två subklasser CrissMarker och CrossMarker... Detta för att man skall kunna lämna över till Marker att kolla om det i angränsande rutor finns likadana Markers och om dessa isf gör 5-i-rad... kräver lite tänkande på hur det skall gå till... :D