2012-10-14 85 views
0

我已經做了一個Java的小數猜測遊戲。我的主要JFrame(主菜單)有三個JButtons,Play,Sound和Exit。如何從JOptionPane返回主菜單(JFrame)

按下播放按鈕開始我的遊戲,一系列JOptionPanes出現要求用戶輸入數字。它工作正常,遊戲運行正常。但是當我按下播放按鈕來玩遊戲時,我無法按下游戲中的退出按鈕或聲音按鈕或任何其他按鈕。我甚至無法按下主JFrame窗口的X(關閉)按鈕,直到我完全玩完遊戲,或關閉JOptionPane以關閉當前遊戲。

我可以按退出按鈕,當我已經按下聲音按鈕啓動背景聲音。當我已經按下聲音按鈕時,我可以按播放按鈕。

有什麼建議嗎?

我的問題是,假設我正在使用JOptionPanes如何按即存在於我的主要的JFrame(主菜單)Jbutton將在 一個的JOptionPane已經打開

這裏的一個小遊戲是我SSCCE

import javax.swing.*; 
import java.awt.event.*; 

class Test2 { 
    static JFrame frame; 
    static JPanel jp; 

    static JButton b1; 
    static JButton b2; 
    static JButton b3; 

    public static void main(String[] args) { 
     final long startTime = System.currentTimeMillis(); 
     frame=new JFrame("Game "); 
     jp=new JPanel(); 
     b1=new JButton("Play"); 
     b1.addActionListener (new Action()); 
     b2=new JButton("Exit"); 
     b2.addActionListener (new Action1()); 
     b3=new JButton("Sound"); 
     b3.addActionListener (new Action2()); 

     jp.add(b1); 
     jp.add(b2); 
     jp.add(b3); 

     frame.add(jp); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(300,400); 
     frame.setVisible(true); 
    } 

    static class Action implements ActionListener { // For (game) Play button 
     public void actionPerformed (ActionEvent e) { 
      Thread bb=new Thread(new Runnable(){ 
       public void run(){ 
        new Test2().start(); 
       }}); 
      bb.setPriority(1); 
      bb.start(); 
     } 
    } 

    static class Action1 implements ActionListener { // For Exit button 
     public void actionPerformed (ActionEvent e) { 

      Thread tt=new Thread(new Runnable(){ 
       public void run(){ 
        int response = JOptionPane.showConfirmDialog(
          null, 
          "Exit application?", 
          "Confirm", 
          JOptionPane.YES_NO_OPTION, 
          JOptionPane.QUESTION_MESSAGE); 
        if (response == JOptionPane.NO_OPTION) { 

        } 
        else if (response == JOptionPane.YES_OPTION) { 
         System.exit(0); 
        } 
       } 
      }); 
      tt.setPriority(10); 
      tt.start(); 
     } 
    } 

    static class Action2 implements ActionListener { //For Sound Button 
     public void actionPerformed (ActionEvent e) { 

      try { 
       /* Code to play sound */ 
      } 
      catch(Exception ex) { 
       ex.printStackTrace(); 
      } 
     } 
    } 

    void start() { // sample game 
     JOptionPane.showMessageDialog(null,"Step 1 ..click OK to continue"); 
     JOptionPane.showMessageDialog(null,"Step 2 ..click OK to continue"); 
     JOptionPane.showMessageDialog(null,"Step 3 ..click OK to continue"); 
     JOptionPane.showMessageDialog(null,"Step 4 ..click OK to continue"); 
     JOptionPane.showMessageDialog(null,"Step 5 ..click OK to continue"); 
     JOptionPane.showMessageDialog(null,"Step 6 ..click OK to continue"); 
     JOptionPane.showMessageDialog(null,"Step 7 ..click OK to continue"); 
     JOptionPane.showMessageDialog(null,"Step 8 ..click OK to continue"); 
    } 
} 

在我的新的代碼只有start()方法已經改變

void start()       // sample game 
{ 

JOptionPane pane = new JOptionPane(); 
// Configure via set methods 
dialog = pane.createDialog(null,"exp 1"); 
// the line below is added to the example from the docs 

dialog.setSize(300, 200); 

dialog.setModal(false); // this says not to block background components 

JButton nextButton = new JButton("Go to Dialog2"); 


dialog.add(nextButton); 
nextButton.setBounds(25,25,20,20); 


dialog.show(); 

JOptionPane pane2 = new JOptionPane(); 
// Configure via set methods 
dialog2 = pane2.createDialog(null,"exp 2"); 
// the line below is added to the example from the docs 
dialog2.setModal(false); // this says not to block background components 
// dialog2.show(); 






nextButton.addActionListener(new ActionListener() { 
public void actionPerformed(ActionEvent arg0) { 

dialog2.setVisible(true); 
dialog.setVisible(false); 

} 
}); 





} 
+0

* 1 )問一個*特定*問題。 2)爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 3)不要在'JOptionPane'中放置'遊戲'。請參閱[本答案](http://stackoverflow.com/a/9554657/418556)瞭解將遊戲**置入**框架的其他策略的提示。 –

+0

編輯我的問題 –

回答

4

不幸的是,JOptionPane的是一個模式對象,你不能LEAV直到你通過所有的對話。 從製作,所有對話框都是模態的。每個showXxxDialog方法都會阻止當前線程,直到用戶的交互完成。

您可以通過創建非模態對話框來解決您的問題。 Example to create non-modal dialog

相反,的JDialog類似於的JFrame,你可以在它裏面添加按鈕,事件偵聽器。 A Simple Example

您可以爲自己創建一個定製的JDialog類:)

an example of customized JDialog

我編輯你的代碼只是想: 「有什麼建議」

void start() { // sample game 
    MyDialog dialog7 = new MyDialog(null); 
    MyDialog dialog6 = new MyDialog(dialog7); 
    MyDialog dialog5 = new MyDialog(dialog6); 
    MyDialog dialog4 = new MyDialog(dialog5); 
    MyDialog dialog3 = new MyDialog(dialog4); 
    MyDialog dialog2 = new MyDialog(dialog3); 
    MyDialog dialog1 = new MyDialog(dialog2); 

    dialog1.setVisible(true); 
} 
+0

這是一個相關的[示例](http://stackoverflow.com/a/12451673/230513)。 – trashgod

+0

@ user1022209 ..這個工作,我可以返回到主菜單,但所有的對話框同時彈出,它不允許程序運行,因爲我想它 –

+0

由於對話框是非模態的,他們將不阻止用於彈出對話框的線程。當用戶通過前一個對話框時,您可以讓下一個對話框彈出作爲觸發事件。 :) – code4j