2016-08-04 14 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ゲームを作ることですが、最初のステップは選手の数を決定することです。これは私がこれを行う方法を知っている唯一の方法です、そしてこれは私がグラフィックスでやった2番目のプログラムなので、私は決してJavaの専門家ではありません。私は数日間立ち往生しているので、私が得ることができる助けを感謝します。

+0

いつ 'valid'の値を変更すると思いますか? (ヒント:無限ループのためにCPUをcooptedしたので、決して呼び出すことのできないイベントハンドラにあります) –

+0

上記のvalid宣言を追加するのを忘れました。私はそれを 'private static boolean valid = false;と宣言しました。それはあなたの意味ですか? – matthew65456

+0

私はその詳細を逃しましたが、実際の問題とは無関係です。下の私の答えを見てください。 –

答えて

0

問題は、イベントハンドラに自分の仕事をするチャンスを与えていないことです。あなたのwhileループはイベントハンドラを継続的に作成します。ただし、whileループはCPUの制御を持ち、ボタンはクリックに応答しないため、actionPeformed()メソッドは呼び出すことはできません。

イベント処理についてもう少し学ぶことをお勧めします。あなたは、あなたが望む行動を得るためにあなたのコードを再設計する必要があります。ほとんどの場合、whileループを完全に削除し、ボタンがクリックされたときにコードを実行するイベントハンドラを作成する必要があります。将来の参照のため


一般に、ブール値と等しいかどうかをチェックは不要です。 ==の結果はブールですが、検査する変数はすでにboolです。直接使用する:while (valid == false)の代わりにwhile (!valid)を使用できます。 !を「not」と読んだ場合、これは実際にはかなり意味があります。

whileループを完全に削除する必要があるため、この場合は問題がありません。しかし、これは将来のあなたの役に立つ情報になるかもしれません。

関連する問題