Hallo,
ich bin dabei mit ein JButton Spielfeld für Schiffeversenken zu erstellen.
Ich schreib mal einen ganz kurzen Überblick über meine GUI, damit man den Aufbau besser nachvollziehen kann. Meine View(Hauptklasse) erbt von JFrame. View bekommt ein JPanel mit Cardlayout , damit zwischen den einzelnen Spielfeldern gewechselt werden kann. Dieses JPanel bekommt zum Umschalten zwei JPanels. Darin ist jeweils der Titel des Spielfeldes und das Spielfeld enthalten. Das Spielfeld ist selber ein JPanel mit Gridlayout. In dieses werden 12*12 JButtons eingefügt. Alle JButton haben ein ImageIcon. Das ganze soll so gestaltet sein, dass das Spielfeld bis zur Erstellung eines neuen Spiels zwar sichtbar, aber deaktiviert sein soll. Dafür benutze ich setIcon(imageicon) und setDisabledIcon(imageicon).
Mein Problem:
-Wenn ich die JButtons in der Initialisierung deaktiviere, wird nur der erste JButton dargestellt. Ich vermutte, dass alle JButtons übereinander gelagert werden.
- Wenn ich die JButtons aktiviert lassen, dann werden sie richtig platziert, aber erscheinen erst, wenn man mit dem Mouszeiger darüber fährt.
ich bin dabei mit ein JButton Spielfeld für Schiffeversenken zu erstellen.
Ich schreib mal einen ganz kurzen Überblick über meine GUI, damit man den Aufbau besser nachvollziehen kann. Meine View(Hauptklasse) erbt von JFrame. View bekommt ein JPanel mit Cardlayout , damit zwischen den einzelnen Spielfeldern gewechselt werden kann. Dieses JPanel bekommt zum Umschalten zwei JPanels. Darin ist jeweils der Titel des Spielfeldes und das Spielfeld enthalten. Das Spielfeld ist selber ein JPanel mit Gridlayout. In dieses werden 12*12 JButtons eingefügt. Alle JButton haben ein ImageIcon. Das ganze soll so gestaltet sein, dass das Spielfeld bis zur Erstellung eines neuen Spiels zwar sichtbar, aber deaktiviert sein soll. Dafür benutze ich setIcon(imageicon) und setDisabledIcon(imageicon).
Mein Problem:
-Wenn ich die JButtons in der Initialisierung deaktiviere, wird nur der erste JButton dargestellt. Ich vermutte, dass alle JButtons übereinander gelagert werden.
- Wenn ich die JButtons aktiviert lassen, dann werden sie richtig platziert, aber erscheinen erst, wenn man mit dem Mouszeiger darüber fährt.
Der Übersichtshalber habe ich die Klassen, Methoden und Variablen dargestellt, die für mein Problem relvant sind. Controller und Modell sind nicht dargestellt, da das einzige was man dzu wissen muss ist, dass ein Controller ein Modell hat und ein Modell zwei GamefieldPanel (Für Player A und PlayerB) hat.
Java:
public class View extends JFrame {
//Controller
private Controller controller;
//Gui Initialisierung
private JButton umschalt= new JButton("umschalt");
private Umschalter umschalter;
private JPanel fensteraufteilung = new JPanel();
private JPanel fensteraufteilung2 = new JPanel();
private JPanel fensteraufteilung3 = new JPanel();
private CardLayout cardLayout;
private Wechsler wechsler;
private JLabel titel1 = new JLabel("PlayerA");
private JLabel titel2 = new JLabel("PlayerB");
private JLabel consolelabel1 = new JLabel("Mitteilung");
private JLabel consolelabel2 = new JLabel("Eingabe");
private JTextArea textfeld = new JTextArea(6,100);
private JScrollPane scrollpane = new JScrollPane(textfeld);
private int gamecount =0;
private int playerSchiffe =9;
public View(){
controller = new Controller();
cardLayout= new CardLayout();
this.setSize(1500, 900);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
umschalt.setPreferredSize(new Dimension(100,400));
umschalter = new Umschalter();
umschalt.addActionListener(umschalter);
umschalt.setBounds(800, 50, 200, 50);
titel1.setVisible(true);
titel1.setSize(new Dimension(50, 10));
titel2.setVisible(true);
titel2.setSize(new Dimension(50, 10));
fensteraufteilung2.setLayout(new BorderLayout());
fensteraufteilung3.setLayout(new BorderLayout());
fensteraufteilung2.add(titel1,BorderLayout.PAGE_START);
fensteraufteilung2.add(controller.getModell().getFieldA(),BorderLayout.CENTER);
fensteraufteilung3.add(titel2,BorderLayout.PAGE_START);
fensteraufteilung3.add(controller.getModell().getFieldB(),BorderLayout.CENTER);
fensteraufteilung.setLayout(cardLayout);
fensteraufteilung.add(fensteraufteilung2);
fensteraufteilung.add(fensteraufteilung3);
fensteraufteilung.setPreferredSize(new Dimension(800, 800));
fensteraufteilung.setBounds(30, 50, 700, 750);
textfeld.setVisible(true);
textfeld.setEditable(false);
consolelabel1.setVisible(true);
consolelabel1.setBounds(800, 100, 100, 20);
consolelabel2.setVisible(true);
consolelabel2.setBounds(800, 650, 100, 20);
scrollpane.setVisible(true);
scrollpane.setBounds(800, 150, 600, 500);
JTextfieldprinterstream writer = new JTextfieldprinterstream(textfeld,System.out);
System.setOut(writer);
System.setErr(writer);
this.setLayout(null);
this.add(fensteraufteilung);
this.add(umschalt);
this.add(scrollpane);
this.add(start);
this.add(bestaetigung);
this.add(consolelabel1);
this.add(consolelabel2);
this.setVisible(true);
wechsler = new Wechsler(cardLayout, umschalter,fensteraufteilung);
wechsler.umschalter.addObserver(wechsler);
wechsler.setDaemon(true);
wechsler.run();
this.revalidate();
this.repaint();
this.setVisible(true);
}
Java:
public class GamefieldPanel extends JPanel {
private HashMap buttons = new HashMap();
private GridLayout gridlayout = new GridLayout();
private String[] buttonletter = new String[]{"WN","J","I","H","G","F","E","D","C","B","A","WS"};
private String[] buttonnumbers = new String[]{"0","1","2","3","4","5","6","7","8","9","10","11"};
public GamefieldPanel() {
gridlayout.setRows(12);
this.setLayout(gridlayout);
this.setPreferredSize(new Dimension(700, 700));
createButtonfield();
this.validate();
this.repaint();
this.setVisible(true);
}
private void createButtonfield(){
for ( int i = 0; i < 12; i++ ) {
for ( int j = 0; j < 12; j++ ) {
Buttonsquare temp;
if (i ==0){
temp =new Buttonsquare(new ImageIcon(Imagecontrol.getStone()),i,j);
buttons.put(new String(buttonletter[i]+buttonnumbers[j]),temp);
this.add(temp);
}else if (i ==11){
if (j == 0 || j == 11){
temp =new Buttonsquare(new ImageIcon(Imagecontrol.getStone()),i,j);
}else {
temp =new Buttonsquare(new ImageIcon(Imagecontrol.getZahlen(j-1)),i,j);
}
buttons.put(new String(buttonletter[i]+buttonnumbers[j]),temp);
this.add(temp);
}else {
if (j==0){
temp =new Buttonsquare(new ImageIcon(Imagecontrol.getBuchstaben(i-1)),i,j);
}else if (j==11){
temp =new Buttonsquare(new ImageIcon(Imagecontrol.getStone()),i,j);
} else {
temp =new Buttonsquare(new ImageIcon(Imagecontrol.getWater()),i,j);
}
buttons.put(new String(buttonletter[i]+buttonnumbers[j]),temp);
this.add(temp);
}
}
}
this.revalidate();
this.repaint();
}
}
Java:
public class Buttonsquare extends JButton {
private Squarestatus squarestatus;
private ImageIcon imageicon;
private int x;
private int y;
private boolean chooseable = true;
private static boolean gamerun = false;
private boolean selectet = false;
private Buttomlistner buttomlistner;
public Buttonsquare(ImageIcon imageIcon, int x, int y) {
buttomlistner = new Buttomlistner();
this.imageicon = imageIcon;
this.setIcon(imageicon);
this.setDisabledIcon(imageicon);
setVisible(true);
setEnabled(false);
this.addActionListener(buttomlistner);
this.x = x;
this.y = y;
this.validate();
this.repaint();
}
public void setImageicon(ImageIcon imageicon){
this.setIcon(imageicon);
}
public void chanceStatusAndImage(Squarestatus squarestatus)throws IllegalArgumentException {
switch ( squarestatus ){
case BLOCKED:break;
case DESTROYED: this.imageicon = new ImageIcon(Imagecontrol.getTreffer());break;
case WATER: this.imageicon = new ImageIcon(Imagecontrol.getWater());break;
case WASSERTREFFER: this.imageicon = new ImageIcon(Imagecontrol.getWassertreffer());break;
case SHIP: this.imageicon = new ImageIcon(Imagecontrol.getShip());break;
case NEBEL: this.imageicon = new ImageIcon(Imagecontrol.getNebel());
this.setDisabledIcon(imageicon);
break;
case WALL:
case EDGE:break;
default: throw new IllegalArgumentException();
}
this.squarestatus = squarestatus;
this.revalidate();
this.repaint();
}
}