执行操作后,int和boolean不会更改

时间:2015-05-21 17:10:23

标签: java swing

我复制了下面的所有相关代码,我的问题是在执行了所执行的操作(连接到按钮)之后,我尝试在执行的操作中更改的值实际上没有改变。

我在执行的动作结束时放了一个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);
    }
}

1 个答案:

答案 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()的调用。