我程序的想法是从以前保存在其他JFrame中的列表中选择一个名称。我想在标签中一个接一个地打印所有名称,它们之间的间隔很小,然后停在其中一个名称上。问题是,lbl.setText("String");如果有多个setText代码,则无法正常工作。
lbl.setText("String");
setText
这是我的代码的一部分:
public void actionPerformed(ActionEvent e) { if (RandomNames.size != 0) { for (int i = 0; i < 30; i++) { int rand = (int)(Math.random() * RandomNames.size); stars.setText(RandomNames.list.get(rand)); try { Thread.sleep(100); } catch (InterruptedException err) { err.printStackTrace(); } } int rand2 = (int)(Math.random() * RandomNames.size); stars.setText(RandomNames.list.get(rand2)); RandomNames.list.remove(rand2); RandomNames.size = RandomNames.list.size(); } if (RandomNames.list.size() == 0) { last.setText("\u062A\u0645 \u0638\u0647\u0648\u0631 \u062C\u0645\u064A\u0639 \u0627\u0644\u0623\u0633\u0645\u0627\u0621 \u0627\u0644\u062A\u064A \u0641\u064A \u0627\u0644\u0642\u0627\u0626\u0645\u0629 !"); } }
不要使用循环或Thread.sleep。只需使用即可javax.swing.Timer。以下将导致每1000毫秒发生30 次迭代 。您可以相应地调整代码,使其适应actionPerformed每隔毫秒发生一次的情况。
Thread.sleep
javax.swing.Timer
actionPerformed
int count = 0; ... Timer timer = new Timer(1000, new ActionListener(){ @Override public void actionPerformed(ActionEvent e){ if (count == 30) { ((Timer)e.getSource()).stop(); } else { int rand = (int) (Math.random()* RandomNames.size); stars.setText(RandomNames.list.get(rand)); count++; } } }); timer.start();
如果需要,您可以Timer在构造函数中设置,并start()在actionPerformed另一个按钮的侦听器的中设置它。
Timer
start()
在如何使用Swing计时器中查看更多信息