[英]Java GUI/Swing, stopping the thread, passing integers between classes
我正在尝试使用GUI / Swing对即将举行的考试进行轮盘游戏的模拟。 我有两个类,一个叫做GUI,实际上是用于组件的代码,例如JFrame,JOptionPane,JButtons等。另一类扩展了Thread,并应该在一个小的JLabel上显示随机数,然后运行方法像这样的东西:
public void run() {
int k = 0;
for (int i = 0; i < 50; i++) {
k = (new Random().nextInt(37));
label.setText(k + " ");
label.setFont(new Font("Tahoma", Font.BOLD, 56));
label.setForeground(Color.yellow);
try {
sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
在GUI类中,我只想从上述循环的最后一次迭代中获取数字,然后将其传递给新的int,我将在稍后的GUI类中使用它。 有任何想法吗?
使用Swing Timer而不是Thread.sleep
,它有时会挂起整个swing应用程序。
请看看如何使用Swing计时器
Timer timer = new Timer(50, new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
//next call from here
}
});
timer.setRepeats(false);
timer.start();
我只想从上述循环的最后一次迭代中获取数字,然后将其传递给新的int,我将在稍后的GUI类中使用它。
只需在另一个接受int的类中创建一个方法(setter),然后从该类中对其进行调用即可进行最后一次调用。
样例代码:
private int counter = 0;
private Timer timer;
...
final JLabel label = new JLabel();
label.setFont(new Font("Tahoma", Font.BOLD, 56));
label.setForeground(Color.yellow);
Thread thread = new Thread(new Runnable() {
public void run() {
timer = new Timer(50, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (counter++ < 50) {
int k = (new Random().nextInt(37));
label.setText(k + " ");
} else {
timer.stop();
label.setText("next call");
}
}
});
timer.setRepeats(true);
timer.start();
}
});
thread.start();
快照:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.