我正在使JLabel显示一个计时器,所以它每秒都在更新,我在一个线程的帮助下更新它,我正在使用SwingWorker来更新JLabel,但它无法正常工作。 这是我的代码......
long pos=-1;
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
try
{
pos=...value of timer....
jLabel1.setText("in function");
jLabel3.setText("in function");
timer=new Thread(new adsa());
timer.start();
}
catch(Exception e)
{
System.out.println("EXCEPTION CAUGHT");
}
}
/**
*
*/
public void run()
{
try
{
System.out.println(pos);
while(pos!=0 && clip.isRunning())
{
label1.setText(String.valueOf(pos));
System.out.println(pos);
pos--;
timer.sleep(1000);
SwingWorker worker = new SwingWorker() {
@Override
public Object doInBackground(){
try
{
jLabel3.setText(String.valueOf(pos));
jLabel3.setText("ghfdxhc");
label1.setText("hvgjh");
System.out.println("zxc");
return null;
}
catch(Exception e)
{
return null;
}
}
};
worker.execute();
}
}
catch(Exception e)
{
System.out.println("Error in run");
}
}
所有println语句都正常工作,即使是在SwingWorker内部,但jLabel没有更新,“in function”会在两个标签上显示,而且不会改变。 如果可能,请建议另一种方法......
答案 0 :(得分:3)
对于这类工作,您应该使用Swing Timer。 SwingWorker通常用于繁重的任务,并且不会阻止gui(Event Dispatch Thread)导致在不同线程中运行。
我不确定在doInBackground()
中更新您的gui是否会反映出来,如果您知道,它会在另一个线程中运行。确保你可以
1)在SwingUtilities.invokeLater(..)
2)使用publish(..)
并在此处更新。
但我建议用于此任务 Swing Timer
答案 1 :(得分:2)
也许您可以使用Timer
来执行此操作,但您需要在setText
中运行Event dispatch thread
或任何回转功能。
如果你想使用SwingWorker,你需要在EDT中调用swing函数。 你可以尝试这样的事情:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
pos=...value of timer....
jLabel1.setText("in function");
jLabel3.setText("in function");
Ctimer timer = new CTimer(pos, jLabel1, jLabel2, jLabel3);
timer.execute();
}
class CTimer extends SwingWorker<Void, Long> {
private long pos;
private JLabel jLabel1, jLabel2, jLabel3;
public CTimer(long pos, JLabel jLabel1, JLabel jLabel2, JLabel jLabel3) {
this.pos = pos;
this.jLabel1 = jLabel1;
this.jLabel2 = jLabel2;
this.jLabel3 = jLabel3;
}
@Override
protected Void doInBackground() throws Exception {
while (pos != 0 && clip.isRunning()) {
publish(pos);
pos--;
Thread.sleep(1000);
}
}
@Override
protected void process(List<Long> times) {
for (Long time : times) {
jLabel1.setText("xyz");
jLabel2.setText("ababa");
jLabel3.setText("" + time);
}
}
}