在动作事件期间在标签中设置文本

时间:2012-11-05 19:04:07

标签: java swing text jbutton jlabel

  

可能重复:
  several times change label text by clicking button in swing not work

我正在使用Java Swing开发一个GUI,其中我使用两个组件JButton和JLabel。 JLabel的文本最初设置为“单击按钮”。单击按钮后,我希望JLabel的文本更改为“Processing”。最后到“Processed”

因此,当我单击按钮时,控件转到ActionPerformed,其中我使用setText()方法将JLabel的文本设置为“Processing”。 ActionPerformed中的最后一个语句是使用setText()将JLabel的文本设置为“Processed”。

当我运行程序时,标签显示“单击按钮”。最后它变为“已处理”。但是,它从不显示“正在处理”。

2 个答案:

答案 0 :(得分:9)

因为它现在不能正常工作的原因是处理GUI刷新的Java线程也处理监听器的事件。因此,当您调用setText()方法时,它会告诉GUI线程(称为EDT for Event Dispatch Thread)更新Component,但由于EDT当前位于actionPerformed(),因此无法立即完成执行代码的方法。

所以我认为你应该把代码做任何工作,并在新线程中更改JLabel的文本。因此,EDT在actionPerformed()中启动它,然后在JLabel文本发生更改时自由更新GUI。

这样的事情:(你必须实现run方法)

public void actionPerformed(ActionEvent e) {
    Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            myLabel.setText("Processing");
            //Do the job
            myLabel.setText("Processed");
        }     
    });
    t.start();
}

理想情况下,必须从EDT本身调用setText()方法和其他改变组件的方法以避免错误......在我给你的例子中并非如此。如果你想这样做,请使用以下方法:

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        myLabel.setText("my text");
    }
});

答案 1 :(得分:1)

在“处理”和“已处理”JLabel文字的设置之间必须有延迟,否则文字的更改将太快无法观察。

一种方法是在2 setText次来电之间使用Swing Timer。您的JButton ActionListener可能如下所示:

public void actionPerformed(ActionEvent e) {
    label.setText("Processing...");

    ActionListener taskPerformer = new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            label.setText("Processed");
        }
    };
    Timer timer = new Timer(1000, taskPerformer); // delay one sec
    timer.setRepeats(false);
    timer.start();
}