2016-08-04 100 views
-1

當我嘗試運行此操作時,我一直收到一個無法關閉的空幀,並且必須從eclipse中終止該程序。我相當肯定,問題是while循環(約的一路下跌的代碼塊2/3)的結果,但我一直沒能想出一個辦法來解決這個Java JFrame在while循環中無法正常工作

public Draw() 
{ 
    super("Uno"); 

    JMenuBar bar = new JMenuBar(); // create menu bar 
    JMenu gameMenu = new JMenu("Play Game"); 
    JMenu quitMenu = new JMenu("Quit"); //Quit Program 
    bar.add(gameMenu); // add Add menu to menu bar 
    bar.add(quitMenu); // add quit button to menu bar 
    setJMenuBar(bar); // set menu bar for this application 

    window = new JDesktopPane(); 
    add(window); 

    gameMenu.addMouseListener(
     new MouseListener() 
     { 
      public void mouseClicked(MouseEvent e) 
      { 
       Dimension size = window.getSize(); 
       double height = size.getHeight(); 
       double width = size.getWidth(); 
       JInternalFrame frame = new JInternalFrame("Uno", true, true, true, true); 


       JFrame input = new JFrame(); 
       input.setTitle(" "); 
       input.setSize(350, 155); 
       input.setLayout(new FlowLayout()); 
       input.setLocationRelativeTo(null); 
       input.setVisible(true); 
       JLabel label1 = new JLabel("How many total players? (2-10)"); 
       final JTextField text1 = new JTextField(3); 
       JLabel label2 = new JLabel("How many computer players? *"); 
       final JTextField text2 = new JTextField(3); 
       JLabel label3 = new JLabel("* Computer players must be <= total number of players"); 
       JButton confirm = new JButton("OK"); 

       label1.setVisible(true); 
       label2.setVisible(true); 
       label3.setVisible(true); 
       text1.setVisible(true); 
       text2.setVisible(true); 
       confirm.setVisible(true); 

       input.add(label1); 
       input.add(text1); 
       input.add(label2); 
       input.add(text2); 
       input.add(label3); 
       input.add(confirm); 

       while(valid == false) 
       { 
        confirm.addActionListener(new ActionListener() 
        { 
         public void actionPerformed(ActionEvent e) 
         { 
          String players = text1.getText(); 
          String computers = text2.getText(); 
          int temp1 = Integer.parseInt(players); 
          System.out.println("Number of players = " + temp1); 
          int temp2 = Integer.parseInt(computers); 
          System.out.println("Number of computers = " + temp2); 
          if (temp1 >= 2 && temp1 <= 10) 
           if (temp2 <= temp1 && temp2 >= 0) 
            valid = true; 

         } //close actionPerformed 
        }); //close ActionListener 
       } //close while loop 
      } //close mouseClicked 
    } //close mouseListener 
} //close Draw 

最初,我遇到了一個問題,它無限地將框架繪製在本身之上,因爲while循環不斷返回false。通過從while循環中刪除組件並將它們放在它之前,解決了該問題。現在,當我運行它時,我得到的全部是:picture

該程序的目標是製作Uno遊戲,但第一步是確定玩家人數。這是我知道如何做到這一點的唯一方式,這只是我用圖形完成的第二個程序,所以我絕不是Java的專家。我會很感激我能得到的任何幫助,因爲我現在已經堅持了幾天。

+0

你什麼時候期望'valid'的值改變? (提示:它是在一個事件處理程序中,因爲您已經將CPU用於無限循環而無法調用)。 –

+0

我忘了在上面添加有效聲明。在繪製之外,我把它聲明爲'private static boolean valid = false;'這是你的意思嗎? – matthew65456

+0

我錯過了這個細節,但它與真正的問題無關。請參閱下面的答案。 –

回答

0

問題是,你沒有給事件處理程序任何機會去完成他們的工作。您的while循環不斷創建事件處理程序。但是,actionPeformed()方法永遠不會被調用,因爲while循環控制着CPU,並且按鈕不會響應任何點擊。

我建議你多瞭解一些事件處理。你需要重新設計你的代碼才能得到你想要的行爲。很可能您需要完全刪除while循環,並創建一個事件處理函數,該函數將在點擊按鈕時執行代碼。


以供將來參考:

一般而言,檢查與一個布爾值相等是不必要的。 ==的結果是一個布爾值,但是您檢查的變量已經是bool。所以直接使用它:而不是while (valid == false),你可以做while (!valid)。如果您將!讀爲「不」,這實際上很有意義。

在這種情況下,由於您需要完全刪除while循環,所以這一點是無意義的。但是,這可能會在未來的某個時間爲您提供有用的信息。