Netbeans で 'Guess the Number' プログラムをコンパイルしようとすると、プログラムは実行を続けているように見えますが、プログラムは実行されていません。ユーザーが 'Play' JButton をクリックすると、playGame メソッドが実行されますが、何も起こらず、例外もスローされません。
コードは以下です。ありがとうシアラン
/*
* chpter 11 GUI programmong questions
* 11.15
*/
package Chapter11GUI;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionListener;
import java.awt.ActiveEvent;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JFrame;
import javax.swing.ImageIcon;
import javax.swing.Icon;
import javax.swing.SwingConstants;
import java.util.Random;
public class GuessGame extends JFrame {
//instance varibles/files
private JLabel intro;
private JLabel highorlow;
private JButton play;
private JTextField enterAnswer;
private int answer1;
private int answer2;
private ImageIcon icon1;
private ImageIcon icon2;
private JPanel panel;
private Random numberGenerator;
private int correctAnswer;
//constructor willll create GUI o a JFrame and register event handlers
public GuessGame() {
super("GuessGAme");
setLayout(new BorderLayout());
Icon icon1 = new ImageIcon(getClass().getResource("bug1.gif"));
Icon icon2 = new ImageIcon(getClass().getResource("travelbug.gif"));
//JtextField to get user input
enterAnswer = new JTextField(5);
//enterAnswer.addActionListener(handler);
enterAnswer.setText("Guess");
enterAnswer.setEditable(false);
//JLabel to display heading
intro = new JLabel("Press Play to begin....", icon1, SwingConstants.CENTER);
highorlow = new JLabel();
//place componments on a panel useing flowlayout manager to hold text aea only
panel = new JPanel();
panel.add(enterAnswer);
panel.add(highorlow);
//JButton to play again and use anoumonus class to call gameMethod
play = new JButton("Play");
add(panel, BorderLayout.CENTER);
add(intro, BorderLayout.NORTH);
add(play, BorderLayout.SOUTH);
play.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//if button clicked then setart game
play.setText("Enjoy");
playGame();
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}//end actionPerfomred
});//end annmous class ActionListener call from addAcionlistener method
}//end construtor
//a method to play the game
public void playGame() {
//generate randown number bewteen 1 and 100
numberGenerator = new Random();
correctAnswer = numberGenerator.nextInt(100);
panel.setBackground(Color.magenta);
answer1 = 0;
answer2 = 0;
enterAnswer.setEditable(true);
enterAnswer.setText("");
while ((answer1 != correctAnswer) && (answer2 != correctAnswer)) {
intro.setText("I have a number bewteen 1 and a 100."
+ "Can you guess my number?");
enterAnswer.setEditable(true);
enterAnswer.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == enterAnswer) {
answer1 = Integer.parseInt(enterAnswer.getText());
}
//set background as red as it is first guess
panel.setBackground(Color.red);
//noe set wether too high or two low
if (answer1 > correctAnswer) {
highorlow.setText("Guess Too High");
highorlow.setIcon(icon2);
} else if (answer1 < correctAnswer) {
highorlow.setText("You are gussing too low");
highorlow.setIcon(icon2);
}//end esle if statement
}//end actionPerfomred
});//end ActionListener
//get answer number 2
intro.setText("Try Again...");
enterAnswer.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == enterAnswer) {
answer2 = Integer.parseInt(enterAnswer.getText());
}
//check if gettingb hot or cold
//2nd answer is closer than first so turn red
if ((Math.abs(answer2 - correctAnswer)) > (Math.abs(answer2 - correctAnswer))) {
panel.setBackground(Color.red);
} else {
panel.setBackground(Color.BLUE);
}
//now add too hihg ot tewo low
//noe set wether too high or two low
if (answer2 > correctAnswer) {
highorlow.setText("Guess Too High");
highorlow.setIcon(icon2);
} else if (answer2 < correctAnswer) {
highorlow.setText("You are gussing too low");
highorlow.setIcon(icon2);
}//end esle if statement
}//end actionPerformed
});//end ActionLIstener
}//end while loop when answer is correct
//what to do if answer is correct
panel.setBackground(Color.orange);
enterAnswer.setText("Correct!!");
enterAnswer.setEditable(false);
play.setText("PLay Again?");
}//end method playGame
}//end class
/*
*chapter 11
* porgramming question 11.14
*/
package Chapter11GUI;
import javax.swing.JFrame;
public class GuessGameTest {
public static void main(String[] args) {
// instanistae frame form GuessGAme
GuessGame frame = new GuessGame();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(350, 350);
}//end main
}//end clas test
ありがとう。while ループが削除され、プログラムが実行されるようになりましたが、意図したとおりではありません。netbeans デバッガーを使用してトラブルシューティングを行っていますが、問題は、playGame() メソッドにステップインして何が問題なのかを正確に確認できないことです。匿名 ActionListener 内部クラス アソシエーションで JButton にステップ イン (F7) を使用して playGame() にアクセスしようとしました。どちらの場合も、デバッガーはテスト アプリケーションのメイン クラスに戻ります。それが理にかなっていることを願っています...
playGame() にブレークポイントを挿入しようとしましたが、アクセスできませんでした。これは、playGame() メソッドが Java のメイン クラスの一部ではないことに関係しているのでしょうか?? 問題のクラスがインスタンス化されている場合にのみ、メインクラスからクラスのコンストラクターにアクセスできるようです.....