更改java

时间:2016-03-29 20:47:29

标签: java swing jlabel

我有一个主要的gui类,它是在NetBeans gui builder中创建的。我正在创建一个迷你游戏,其中JLabel计时器停止运行。 JLabel位于主gui中,计时器位于名为timer的单独类中。当定时器的循环循环时,我希望位于主gui中的JLabel改变(Timer = 10,Timer = 9,...等)。

查看下面的示例代码以便更好地理解。

这是计时器所在的类:

public class ShapeGame {

Timer timer;
int counter = 10;

ShapeGame() {

    ActionListener a = new ActionListener() {
        public void actionPerformed(ActionEvent e) {

            System.out.println("Counter = " + counter);
            labTimer.setText("Timer: " + counter);
            if (--counter < 0) {
                timer.stop();
                System.exit(0);
            }
        }
    };

    timer = new Timer(1000, a);
    timer.start();
    }
}

这是JLabel所在位置的修正代码:

(注意:并非所有代码都是为JLabel和JFrame添加的,仅用于阅读目的)

public class mainGui extends JFrame {

labTimer = new javax.swing.JLabel();

    private void gameStartStopActionPerformed(java.awt.event.ActionEvent evt) {                                              
        ShapeGame sg = new ShapeGame();
    }
}

我知道这不是从另一个类labTimer.setText("Timer: " + counter);调用Label的正确方法。希望我已经提供了足够的信息来帮助解决这个问题。

1 个答案:

答案 0 :(得分:2)

一种可能的简单(但不是干净)解决方案是将JLabel传递给ShapeGame类,以便它可以直接改变其状态。

如,

public class ShapeGame {
    Timer timer;
    int counter = 10;

    // note change to constructor parameter
    public ShapeGame(final JLabel label) {
        ActionListener a = new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.println("Counter = " + counter);

                // note changes
                // labTimer.setText("Timer: " + counter);
                label.setText("Timer: " + counter);

                if (--counter < 0) {
                    timer.stop();
                    System.exit(0);
                }
            }
        };

        timer = new Timer(1000, a);
        timer.start();
    }
}

然后在创建ShapeGame类时,将JLabel传递给它的构造函数调用。 Cleaner将把你的程序构建成MVC。