ich hab zwar die präsentation jetzt rum, aber zum spaß noch weiter damit rumprogrammiert. jetzt hab ich ein problem: im hauptmenü kann man ein frame öffnen, in dem man die anzahl der startschiffe einstellen kann (per JSlider). Das hat soweit auch funktioniert, aber mMn zuviel Platz verbraucht, deswegen wollte ich jetzt - als ich auch 3er, 4er und 5er Schiffe einbauen wollte - das ganze durch ne for-Schleife laufen lassen und dabei überprüfen, ob die Komponente die entsprechende Klasse besitzt (JTextArea oder JSlider). Leider funktioniert das ganze nicht so, wie es sollte; hier mal der Code:
public void chooseShips() {
if (!shipChooserOpened) {
shipChooser.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
shipChooser.setLayout(null);
shipChooser.setVisible(true);
shipChooser.setBounds(100,100,400,400);
panel.setBounds(0,0,400, 400);
ships1.setBounds(50,50,80,150);
ships1Lbl.setBounds(40,225,100,100);
ships2.setBounds(180,50,80,150);
ships2Lbl.setBounds(170,225,100,100);
panel.add(ships1);
panel.add(ships2);
panel.add(ships1Lbl);
panel.add(ships2Lbl);
for (int i = 0; i < panel.getComponentCount(); i++) {
Class type = panel.getComponent(i).getClass();
if (type == javax.swing.JSlider.class) {
System.out.println(i+"_"+type);
((JSlider)panel.getComponent(i)).addChangeListener(this);
((JSlider)panel.getComponent(i)).setMajorTickSpacing(5);
((JSlider)panel.getComponent(i)).setMinorTickSpacing(1);
((JSlider)panel.getComponent(i)).setPaintTicks(true);
((JSlider)panel.getComponent(i)).createStandardLabels(1);
((JSlider)panel.getComponent(i)).setPaintLabels(true);
((JSlider)panel.getComponent(i)).setToolTipText("Choose how many 1x"+1+" ships you have to place.");
panel.getComponent(i).setVisible(true);
} else if (type == javax.swing.JTextArea.class) {
System.out.println(i+"_"+type);
((JTextArea) panel.getComponent(i)).setEditable(false);
((JTextArea) panel.getComponent(i)).setFont(new Font("Arial", Font.BOLD, 13));
((JTextArea) panel.getComponent(i)).setBackground(null);
((JTextArea) panel.getComponent(i)).setBorder(BorderFactory.createEmptyBorder());
((JTextArea) panel.getComponent(i)).setText("Choose how\nmany ships of\nsize 1x"+1+" have\nto be placed.");
panel.getComponent(i).setVisible(true);
}
}
shipChooser.add(panel);
shipChooserOpened = true;
} else {
shipChooser.setVisible(true);
}
}
Alles anzeigen
in der konsole wird ausgegeben:
0_class javax.swing.JSlider
1_class javax.swing.JSlider
2_class javax.swing.JTextArea
3_class javax.swing.JTextArea
wenn ich das ganze jetzt starte, habe ich aber das falsche layout:
eigentlich sollte oben die beiden JSlider sein, und mittig darunter jeweils das zugehörige JTextField.
Hat irgendjemand eine Idee, warum das nicht so funktioniert, wie es sollte?
Danke im Voraus
//edit: shipChooser ist ein einfaches JFrame, mit dem außer der Deklaration bislang nichts getan wurde