Java 在操作事件期间设置标签中的文本

Java 在操作事件期间设置标签中的文本,java,swing,text,jbutton,jlabel,Java,Swing,Text,Jbutton,Jlabel,可能重复: 我正在使用JavaSwing开发一个GUI,其中使用了两个组件JButton和JLabel。JLabel的文本最初设置为“单击按钮”。单击按钮后,我希望JLabel的文本更改为“正在处理”,最后更改为“已处理” 因此,当我单击按钮时,控件转到ActionPerformed,在这里我使用setText()方法将JLabel的文本设置为“Processing”。ActionPerformed中的最后一条语句是使用setText()将JLabel的文本设置为“已处理” 当我运行程序时,标

可能重复:

我正在使用JavaSwing开发一个GUI,其中使用了两个组件JButton和JLabel。JLabel的文本最初设置为“单击按钮”。单击按钮后,我希望JLabel的文本更改为“正在处理”,最后更改为“已处理”

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

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

设置“正在处理”和“已处理”之间必须有延迟
JLabel
text,否则文本中的更改将太快而无法观察到

一种方法是在2个
setText
调用之间使用一个。您的
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();
}

它现在不工作的原因是处理GUI刷新的Java线程也处理侦听器的事件。因此,当您调用
setText()
方法时,它会告诉GUI线程(称为事件分派线程的EDT)更新组件,但现在无法完成,因为EDT当前在执行代码的
actionPerformed()
方法中

因此,我认为您应该将执行任何工作的代码放在一个新线程中,并更改JLabel的文本。因此,EDT会在
actionPerformed()
中启动它,然后在JLabel的文本更改时可以自由更新GUI

类似这样的内容:(您必须实现run方法)

理想情况下,必须从EDT本身调用
setText()
方法和其他更改组件的方法,以避免出现错误。。。我给你的例子不是这样的。如果要执行此操作,请使用以下方法:

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