我的java程序存在很大问题。 我尝试实现一个简单的软件。 有一个标签,我想在这个标签上盖章,但这必须分开2秒。
我看到线程和Swing有问题,我实现了这段代码但结果没有改变。 你能帮我吗 感谢
public void stampChips1(int numberDecrement){
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
jLabel1.setText("L'avversario ha deciso di togliere : . ");
}
};
new javax.swing.Timer(2000, taskPerformer).start();
ActionListener taskPerformer2 = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
jLabel1.setText("L'avversario ha deciso di togliere : . . ");
}
};
new javax.swing.Timer(2000, taskPerformer2).start();
ActionListener taskPerformer3 = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
jLabel1.setText("L'avversario ha deciso di togliere : . . .");
}
};
new javax.swing.Timer(2000, taskPerformer3).start();
jLabel1.setText("L'avversario ha deciso di togliere : " + numberDecrement);
}
答案 0 :(得分:2)
每次在代码中调用javax.swing.Timer.start()时,它将每2秒继续触发一次事件(在构造函数中设置)。在几个时间间隔之后,您最终有三个不同的计时器尝试(并成功)在同一标签中设置文本。标签的文本将取决于Timer的ActionListener上次执行完毕。如果你想让一个Timer触发一次并停止你应该像这样设置:
javax.swing.Timer tmr = new javax.swing.Timer(2000, taskPerformer);
tmr.setRepeats(false);
tmr.start();
现在每个计时器只会触发一次,从而消除了标签上的任何覆盖问题。
在评论中添加了每个请求:
设置每个计时器时,将其设置为仅触发一次(并且显示为camickr),将每个计时器设置为不同的间隔。
第一个计时器应该是:
javax.swing.Timer tmr1 = new javax.swing.Timer(2000, taskPerformer);
tmr1.setRepeats(false);
tmr1.start();
第二个计时器应该类似:tmr2 = new ... (4000, taskPerformer2);
第三个计时器应该类似:tmr3 = new ... (6000, taskPerformer3);
初始代码的问题在于,当您的stampChips1(int)
方法执行时,首先设置三个定时器来触发事件每两秒钟,然后写入标签。
时间
0s - jLabel1 =“L'avversario ha deciso di togliere:”+ numberDecrement
~2s - jLabel1 =“L'Avversario ha deciso di togliere:。”
~2s - jlabel1 =“L'avversario ha deciso di togliere:..”
~2s - jlabel1 =“L'Avversario ha deciso di togliere:...”
~4s - jLabel1 =“L'Avversario ha deciso di togliere:。”
~4s - jlabel1 =“L'Avversario ha deciso di togliere:..”
~4s - jlabel1 =“L'avversario ha deciso di togliere:...”
你的所有计时器同时触发关闭,直到你调用Timer.stop()或者告诉它只用Timer.setRepeats(false)触发一次它们不会停止
答案 1 :(得分:0)
同样使用基本代码,你需要有不同的间隔(2000,4000,6000),否则所有的定时器都会同时发射。
答案 2 :(得分:0)
void uiFunction(JLabel label) {
new Thread() {
public void run() {
final jLabel1=label;
SwingUtilities.invokeLater(new Runnable() {
jLabel1.setText("L'avversario ha deciso di togliere : . ");
jLabel1.repaint();
}
Thread.sleep(2000);
SwingUtilities.invokeLater(new Runnable() {
jLabel1.setText("L'avversario ha deciso di togliere : .. ");
jLabel1.repaint();
}
Thread.sleep(2000);
SwingUtilities.invokeLater(new Runnable() {
jLabel1.setText("L'avversario ha deciso di togliere : ... ");
jLabel1.repaint();
}
}
}.run();
}
我面对着类似的problem。如果你希望这种情况永远发生,你可以在无限循环中调用这个函数......