2016-04-05 5 views
0

Ich versuche, eine Message Box zu bekommen, die die Regeln meines Spiels erklärt, um aus einer Menüleiste zu füllen. Ich kann es richtig füllen, wenn ich einen JFrame benutze, aber wenn ich auf Ok oder X klicke, bleibt es auch außerhalb meines Spiels geöffnet. Und ich muss es wieder schließen, um das Spiel wieder zu benutzen. Ich lese, dass ich JFrame nicht verwenden möchte, dass ich JDialog verwenden müsste, aber ich habe Probleme damit.Wie verwende ich JDialog in einem JFrame aus einem anderen Paket?

Ich versuche herauszufinden, wie man einen JDialog verwendet und ihn in einem JFrame aus einem anderen Paket zentriert. Ich denke nicht, dass ich JDialog richtig verwende, da ich es nicht in erster Linie erreichen kann. Mein Hauptspiel läuft von einem anderen Paket namens Simonish und hat eine eigene Klasse namens MainGame. Und in MainGame gibt es einen privaten variablen JFrame-Rahmen.

public class MainGame implements MouseListener, ActionListener{ 
    private JFrame frame = new JFrame("Simonish"); 
    private MenuBar menuBar = new MenuBar(); 
} 

Natürlich ist dies nicht der gesamte Code, aber das ist in dem Paket Simonish.

Jetzt habe ich ein anderes Paket namens Component, und im Inneren ich eine Klasse namens MenuBar haben: public class MenuBar erweitert JMenuBar implementiert menuListener Action {

JMenuBar menuBar; 
JMenu settings, stats, help; 
JMenuItem chooseColor, chooseMode, highScoreList, history, about, rules; 

public MenuBar() { 

    //adding help to the menu bar 
    help = new JMenu("Help"); 
    help.addMenuListener(this); 
    this.add(help); 

    //sub categories for help 
    about = new JMenuItem("About"); 
    about.addActionListener(this); 
    help.add(about); 

    rules = new JMenuItem("Rules"); 
    rules.addActionListener(this); 
    help.add(rules); 


    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     if(e.getSource().equals(about)){ 
      new PopupMenu(); 
     } 
     if(e.getSource().equals(rules)){ 
      new RulesPopup(); 
     } 
    } 
} 

Ich weiß, eine Menge Sachen fehlen, aber ich versuche um es kurz zu halten.

Und in der gleichen Komponente Ordner habe ich eine Klasse namens PopUpMenu, es ist ein schrecklicher Name, den ich PopUpAbout nennen werde, aber hier ist der Code.

public class PopupMenu { 

    JFrame Popup; 

    public PopupMenu(){ 
     Popup = new JFrame(); 
     Popup.pack(); 
     Popup.setVisible(true); 


     JOptionPane.showMessageDialog(Popup, "Version 2\n\n" + "Added new features: \n\n" + "Color Customization\n" + "Different Game Modes\n" + 
      "Menu Bar\n" + "Images\n" + "Sound Effects\n" + "History of Score", "About", JOptionPane.PLAIN_MESSAGE); 
    } 
} 

So liegt es mein Problem, ich war zu verwirren versuchen, um in der Klasse PopUpMenu, aber ich kann überhaupt kein JDialog zur Arbeit zu kommen scheinen. Ich habe versucht, diese in JDialog zu ändern und die Argumente darin zu ändern, aber ich kann nicht erreichen, dass sie auffüllt, oder sie im Hauptspiel auffüllen.

Muss es im MainGame aufgerufen werden? Oder muss es in PopUpMenu aufgerufen werden?

+1

Warum brauchen Sie "Popup"?Du kannst 'null' als ersten Parameter an' showMessageDialog' übergeben, oder passier deine Instanz von 'MenuBar' an sie und benutze stattdessen – MadProgrammer

+0

@MadProgrammer Ich habe Popup benutzt, weil ich Democode verfolgt habe, den ich online gelesen habe. Ich werde versuchen, null oder MenuBar. – Sailanarmo

Antwort

1

Sie können Komponenten zu JDialogs wie in JFrames hinzufügen/entfernen. Schauen Sie sich das Beispiel an, Sie können das Design ändern, wie Sie möchten.

import java.awt.BorderLayout; 
import java.awt.FlowLayout; 
import java.awt.Frame; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

public class JDialogDemo extends JFrame { 

    public JDialogDemo() { 

     final MyDialog dialog = new MyDialog(this); 

     JButton button = new JButton("Show Dialog"); 
     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       dialog.pack(); 
       dialog.setLocationRelativeTo(JDialogDemo.this); 

       dialog.setVisible(true); 
      } 
     }); 

     setLayout(new FlowLayout()); 
     add(button); 

     setSize(400, 400); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     new JDialogDemo(); 
    } 
} 

class MyDialog extends JDialog { 
    public MyDialog(Frame owner) { 
     super(owner, true); 

     setTitle("About"); 

     add(new JLabel("<html>Version 2<br><br>" + "Added new features: <br><br>" + "Color Customization<br>" 
       + "Different Game Modes<br>" + "Menu Bar<br>" + "Images<br>" + "Sound Effects<br>" 
       + "History of Score")); 

     JButton okButton = new JButton("Ok"); 
     okButton.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       setVisible(false); 
      } 
     }); 

     add(okButton, BorderLayout.SOUTH); 
    } 

} 
+0

Oder, wie das OP macht, könnten Sie eine 'JOptionPane' verwenden, je nachdem, was Sie erreichen möchten. – MadProgrammer

+0

Genau, das ist ein anderer Weg. – rdonuk

1

Das Problem ist, du bist ein zweites JFrame zu schaffen, die Sie entsorgen sind nicht, wenn Sie mit ihm fertig sind ...

public class PopupMenu { 

    JFrame Popup; 

    public PopupMenu(){ 
     Popup = new JFrame(); 
     Popup.pack(); 
     Popup.setVisible(true); 


     JOptionPane.showMessageDialog(Popup, "Version 2\n\n" + "Added new features: \n\n" + "Color Customization\n" + "Different Game Modes\n" + 
      "Menu Bar\n" + "Images\n" + "Sound Effects\n" + "History of Score", "About", JOptionPane.PLAIN_MESSAGE); 
    } 
} 

JOptionPane kein Component Referenz benötigt arbeiten (obwohl es helfen kann), so müssen Sie nicht wirklich die JFrame

public class PopupMenu { 
    public PopupMenu(){ 
     JOptionPane.showMessageDialog(null, "Version 2\n\n" + "Added new features: \n\n" + "Color Customization\n" + "Different Game Modes\n" + 
      "Menu Bar\n" + "Images\n" + "Sound Effects\n" + "History of Score", "About", JOptionPane.PLAIN_MESSAGE); 
    } 
} 

Ihr generelles Problem lösen würde.

Sie auch einen Verweis auf einige übergeordnete Komponente passieren könnte, die auf dem übergeordneten Fenster angezeigt wird

public class PopupMenu { 
    public PopupMenu(JComponent parent){ 
     JOptionPane.showMessageDialog(parent, "Version 2\n\n" + "Added new features: \n\n" + "Color Customization\n" + "Different Game Modes\n" + 
      "Menu Bar\n" + "Images\n" + "Sound Effects\n" + "History of Score", "About", JOptionPane.PLAIN_MESSAGE); 
    } 
} 

die Sie dann wie etwas nennen könnte mit ...

@Override 
public void actionPerformed(ActionEvent e) { 
    if(e.getSource().equals(about)){ 
     new PopupMenu(this); 
    } 
    if(e.getSource().equals(rules)){ 
     new RulesPopup(); 
    } 
}