我复制了下面的所有相关代码,我的问题是在执行了所执行的操作(连接到按钮)之后,我尝试在执行的操作中更改的值实际上没有改变。
我在执行的动作结束时放了一个sout(ques),我可以看到值的变化但是当我移出它时,它会恢复为0;
public class GameRunner extends JPanel implements ActionListener{
private int x=50,y=600;
private Ball b = new Ball(x,y);
private Timer timer;
private boolean correct , incorrect;
private JButton button;
private JTextField f;
private int ques = 0;
private String[][] math = {{"2X^2","4x"},{"q2","a2"},{"q3","a3"},{"q4","a4"},{"q5","a5"},
{"q6","a6"},{"q7","a7"},{"q8","a8"}};
public void actionPerformed(ActionEvent actionEvent) {
if (f.getText().equals(math[ques][1])) {
correct = true;
} else {
incorrect = true;
}
f.setText("");
if(ques<7)
ques++;
else
ques = 0;
System.out.println(ques);
//I can see the change here
}
public void paint(Graphics g){//called whenever refreshed...
System.out.println(ques);
// But now outside of the action performed the ques and the correct incorrect do not change
if(correct)
b.move();
if(incorrect)
b.move2();
}
public static void main(String[] args) {
GameRunner gui = new GameRunner ();
gui.go();
}
public void go(){
button = new JButton("Guess");
f = new JTextField(15);
button.addActionListener(this);
JFrame frame = new JFrame("Derivative Game");
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
frame.setPreferredSize(new Dimension(700, 700));
JPanel pan = new JPanel(new BorderLayout());
JPanel pan2 = new GameRunner();
JPanel pan3 = new JPanel();
pan3.add( f);
pan3.add(button);
pan3.setBackground(new Color(80, 218, 213));
pan.add( pan3,BorderLayout.CENTER);
pan.setBackground(new Color(80, 218, 213));
frame.add(pan2);
frame.getContentPane().add(BorderLayout.SOUTH, pan);
frame.setSize(700, 760);
frame.setVisible(true);
frame.setResizable(false);
}
}
答案 0 :(得分:0)
基本问题是,您实际上在GameRunner
实际拥有两个个实例:您在main()
中创建的实例,以及您添加到的另一个实例JFrame。由于您只在JFrame中的而非上调用go()
,因此永远不会调用该实例的paint()
方法。
您需要重构代码以消除第二个离群GameRunner
实例。在你做到这一点的同时,你也应该使用paintComponent()
而不是paint()
,你应该采取任何&#34;业务逻辑&#34; (就像那些对move()
的调用)来自你的绘画代码。
换句话说,摆脱这一行:
JPanel pan2 = new GameRunner();
因为你已经&#34;在&#34; GameRunner
的一个实例,您不应该创建另一个实例。然后使用&#34;当前&#34; GameRunner
的实例,您可以使用此关键字:
frame.add(this);
编辑 - 在点击按钮后,您也无法告诉GameRunner
JPanel
重绘自己。您可能希望在repaint()
方法中添加对actionPerformed()
的调用。