2016-04-05 2 views
0

Я пытаюсь получить окно сообщения, которое объясняет правила моей игры для заполнения из строки меню. Я могу заставить его правильно заполнять, когда я использую JFrame, однако, когда я нажимаю Ok или X, он по-прежнему остается открытым за пределами моей игры. И я снова должен закрыть его, чтобы снова использовать игру. Я читал, что я не хочу использовать JFrame, что мне нужно будет использовать JDialog, но у меня проблемы с ним.Как использовать JDialog внутри JFrame из другого пакета?

Я пытаюсь выяснить, как использовать JDialog и получить его в центре JFrame из другого пакета. Я не думаю, что я правильно использую JDialog, поскольку я не могу заставить его заселить в первую очередь. Моя основная игра выполняется из другого пакета, называемого simonish, и имеет собственный класс под названием MainGame. А в MainGame есть частный фрейм JFrame.

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

Конечно, это еще не все код, но это внутри пакета Simonish.

Теперь у меня есть еще один пакет под названием компонента, а внутри у меня есть класс с именем MenuBar: общественного класса MenuBar расширяет JMenuBar реализует MenuListener, ActionListener {

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(); 
     } 
    } 
} 

Я знаю, много недостающих вещей, но при попытке чтобы он был коротким.

И в той же папке Component, у меня есть класс PopUpMenu, это ужасное имя, которое я буду называть PopUpAbout, но вот код.

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); 
    } 
} 

Так лежит моя проблема, я пытался возиться в классе POPUPMENU, но я не могу показаться, чтобы получить JDialog работать вообще. Я попытался изменить их на JDialog и изменить аргументы внутри, но я не могу заставить его заполнить или заставить его заполнить основную игру.

Нужно ли его вызывать внутри MainGame? Или это нужно вызвать в PopUpMenu?

+1

Зачем вам нужно 'Popup'?Вы можете передать 'null' в качестве первого параметра' showMessageDialog', который или передать ваш экземпляр 'MenuBar', и использовать это вместо – MadProgrammer

+0

@MadProgrammer. Я использовал Popup, потому что я следил за демо-кодом, который я читал онлайн. Я попробую null или MenuBar. – Sailanarmo

ответ

1

Вы можете добавить/удалить компоненты в JDialogs, как в JFrames. Посмотрите пример ниже, вы можете изменить дизайн, как хотите.

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

Или, как это делает OP, вы можете использовать 'JOptionPane', в зависимости от того, чего вы хотите достичь. – MadProgrammer

+0

Точно, это другой способ. – rdonuk

1

Проблема в том, вы создаете второй JFrame, который вы не УТИЛИЗАЦИИ, когда вы сделали с ним ...

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 не нужна Component ссылка работать (хотя это может помочь), так что вы на самом деле не нужны 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); 
    } 
} 

бы решить общую проблему.

Вы также можете передать ссылку на какой-то родительский компонент, который отображается на вашем родительском окне

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); 
    } 
} 

, который вы могли бы назвать, используя что-то вроде ...

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