我有一个主要的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的正确方法。希望我已经提供了足够的信息来帮助解决这个问题。
答案 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。