2016-04-05 9 views
0

Ich habe 2 Jframes, 1 ist ein bisschen wie das Hauptmenü, ich möchte ein Attribut in der Ebene Jframe ändern, wenn eine Taste gedrückt wird, also habe ich versucht:Ändern Sie Attribut in anderen Jframe, wenn eine Schaltfläche in einem anderen JFrame geklickt wird

Ich habe die Sout verwendet, um zu sehen, was wirklich passiert, weil es nicht funktionierte, aber ich sehe, dass das Niveau von 0 zu 1 zurück zu 0 geht und weiter geht, weiß jemand, warum und wie zu beheben?

SpeelVeld frame = new SpeelVeld(); 


    frame.setBounds(0,0,519,591); 
    frame.setLocationRelativeTo(null); 
    frame.getContentPane().setBackground(Color.WHITE); 
    frame.setTitle("RWINA"); 
    frame.setVisible(true); 
    frame.setLevel(1); 

Dies ist in der Hauptmethode meiner ursprünglichen GameProject-Datei.

Wie kann ich eine JDialog

+1

See (http://stackoverflow.com/q/9554636/ 418556) –

Antwort

3

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.

+0

Wie könnte ich ein Hauptmenü mit jdialog erstellen? – user1806846

+0

@ user1806846: unmöglich für Ihren spezifischen Fall zu beantworten, da ich keine Ahnung habe, wie Sie einen JFrame erstellen. Aber wenn es mein Code wäre, würde ich Google JDialog, überprüfen Sie die API, die Tutorials, und erstellen Sie es. –

+0

Ich hatte ursprünglich kein Hauptmenü, nur das Spiel selbst, das ich in der Haupt-Java-Datei aufgerufen habe, warte ich werde meine Frage bearbeiten, können Sie bitte einen Blick darauf werfen? – user1806846

1

Sie möchten wahrscheinlich, dass der JFrame der Container der obersten Ebene ist, dann haben Sie ein JPanel, das Ihr Menü enthält. Das Menü könnte beliebig sein, ich benutze eine JTextArea. Dann benötigen Sie einen JButton für den JPanel oder JFrame, der bei einem Druck den Text in der JTextArea ändert. Hier ist eine Implementierung, von der aus Sie arbeiten könnten.Ich bin mit der Action als Auslöser für die, wenn zu Chaos mit dem JTextArea: [? Die Verwendung von mehreren JFrames, Gut-/Schlecht-Praxis]

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 

public class SimpleSwing { 
    public static void main(String[] args) { 
     JFrame mainFrame = new JFrame(); 
     JPanel mainMenuPanel = new JPanel(); 
     JTextArea textAttribute = new JTextArea("Original Text"); 
     JButton changeAttributeButton = new JButton("Change Attribute"); 

     changeAttributeButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       textAttribute.setText("Whatever new text you want"); 
      } 
     }); 

     mainMenuPanel.add(textAttribute); 
     mainMenuPanel.add(changeAttributeButton); 
     mainFrame.add(mainMenuPanel); 

     mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainFrame.setSize(500, 500); 
     mainFrame.setVisible(true); 
    } 
} 
Verwandte Themen