I 2 jframes haben machen, 1 ist ein bisschen wie das Hauptmenü,
Sie sollten nicht mehr als 2 JFrames für diese. Das abhängige Unterfenster, wahrscheinlich Ihr Hauptmenüfenster, sollte tatsächlich ein JDialog sein, wahrscheinlich ein nicht-modales Dialogfeld von dem Aussehen her.
Ich möchte ein Attribut in der Ebene JFrame ändern, wenn eine Taste gedrückt wird, so habe ich versucht:
SpeelVeld frame = new SpeelVeld();
frame.level = 1;
System.out.println(frame.level);
und hier ist ein großes Problem. Verstehen Sie, dass Sie in diesem Code ein neues SpeelVeld-Objekt erstellen, wobei die Betonung auf dem Wort neu liegt. Das Ändern des Status dieses Objekts hat keine Auswirkungen auf das andere SeelVeld-Objekt, das gerade angezeigt wird. Tun Sie dies, Ihr zweites Fenster wird einen gültigen Verweis auf das angezeigte SeelVeld-Objekt benötigen. Wie dies zu tun ist, hängt alles von Code ab, der noch nicht gezeigt wird, aber oft kann es einfach durch Übergeben des angezeigten SpeelVeld-Objekts in das Hauptmenü-Objekt unter Verwendung eines Konstruktor-Parameters oder einer Setter-Methode durchgeführt werden.
Zum Beispiel:
import java.awt.Dialog.ModalityType;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
// JPanel for our main GUI
public class SpeelVeldFoo {
private static void createAndShowGui() {
// JPanel used by the main JFrame
SpeelVeldPanel speelVeldPanel = new SpeelVeldPanel();
// JPanel used by the main menu JDialog. Pass the above into it
MainMenuPanel mainMenuPanel = new MainMenuPanel(speelVeldPanel);
// create your JFrame
JFrame frame = new JFrame("Speel Veld");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(speelVeldPanel); // add the JPanel
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
// create your non-modal JDialog
JDialog menuDialog = new JDialog(frame, "Main Menu", ModalityType.MODELESS);
menuDialog.add(mainMenuPanel); // add the JPanel that holds its "guts"
menuDialog.pack();
menuDialog.setLocationByPlatform(true);
menuDialog.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
createAndShowGui();
});
}
}
@SuppressWarnings("serial")
class SpeelVeldPanel extends JPanel {
private int level = 1; // simple example just has a level int
private JLabel levelLabel = new JLabel("1"); // and displays it in a JLabel
public SpeelVeldPanel() {
add(new JLabel("Level:"));
add(levelLabel);
int ebGap = 50;
setBorder(BorderFactory.createEmptyBorder(ebGap, 2 * ebGap, ebGap, 2 * ebGap));
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
// whenever level is changed, update the display
this.level = level;
levelLabel.setText(String.valueOf(level));
}
}
// class for the JPanel held by the JDialog
@SuppressWarnings("serial")
class MainMenuPanel extends JPanel {
private JSpinner levelSpinner = new JSpinner(new SpinnerNumberModel(1, 1, 5, 1));
private SpeelVeldPanel speelVeldPanel = null; // reference to the main GUI
// note the parameter.... you pass in the displayed main GUI so you can
// change it
public MainMenuPanel(final SpeelVeldPanel speelVeldPanel) {
this.speelVeldPanel = speelVeldPanel; // set the field
// respond when the spinner's data changes
levelSpinner.addChangeListener(new LevelListener());
add(new JLabel("Set the Speel Veld's level:"));
add(levelSpinner);
int ebGap = 10;
setBorder(BorderFactory.createEmptyBorder(ebGap, ebGap, ebGap, ebGap));
}
private class LevelListener implements ChangeListener {
@Override
public void stateChanged(ChangeEvent e) {
// when the spinner's data changes
int level = (int) levelSpinner.getValue(); // get the data
speelVeldPanel.setLevel(level); // and send it to the main GUI
}
}
}
Sie werden bemerken, dass Ich mag es nicht JFrame oder JDialog erstreckt, wenn ich es vermeiden kann. Mein Gefühl ist, dass man sich in eine Ecke malen kann, indem man seine Klasse JFrame erweitert und Sie zwingt, JFrames zu erstellen und anzuzeigen, wenn oft mehr Flexibilität gefragt ist. Häufiger sind Ihre GUI-Klassen darauf ausgerichtet, JPanels zu erstellen, die dann in JFrames oder JDialogs oder JTabbedPanes eingefügt oder über CardLayouts ausgetauscht werden können, wo immer dies erforderlich ist. Dies erhöht die Flexibilität Ihrer GUI-Codierung erheblich.
See (http://stackoverflow.com/q/9554636/ 418556) –