1

我正在尝试制作一个简单的 JButton,单击它会导致简单的 JLabel 将其文本更改为“第二个文本”,之后我希望当前线程休眠几秒钟,最后让 JLabel 再次更改其文本,这个“第三个文本”的时间。我想我已经在这里完成了,但它并没有按照我想要的方式工作。下面提供的代码使 JButton 在指定的时间范围内冻结,就好像它被按住一样,然后标签变为其第三状态。换言之,“秒文字”不会出现。

请告诉我应该怎么做。

谢谢你。

package testPackage;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Demo {

    public static void main(String[] args) throws InterruptedException {
        JFrame frame = new JFrame();
        JButton button = new JButton("Click me!");
        final JLabel label = new JLabel("first text");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 600);
        JPanel panel = new JPanel();
        panel.add(button);
        panel.add(label);
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                label.setText("second text");
                try {
                    Thread.currentThread();
                    Thread.sleep(4000);
                } catch (InterruptedException exc) {
                    System.out.println("Erorrrrr");
                }

            }
        });

        frame.add(panel);
        frame.setVisible(true);
    }

}
4

4 回答 4

2

当您考虑 Java 的内部结构时,更改文本属性并不是唯一要查看结果的事情。该控件还必须重新绘制(可能无效)。

通过调用 sleep 您实际上阻止了 java GUI 内部工作人员重绘您更改的控件。它只能在睡眠结束后发生。

于 2013-03-05T13:51:32.627 回答
0

如果您在事件调度线程(处理 GUI 事件的线程)上休眠,那么 GUI 将冻结。您可以从动作侦听器开始一个后台线程并在那里睡觉。

公共无效actionPerformed(ActionEvent e)
{
    label.setText("文本 1");
    新线程(新可运行()
    {
        公共无效运行()
        {
            尝试 {
                线程.sleep(1000);
            }catch(InterruptedException 忽略){}

            // 排队 Swing 代码以在 EDT 上执行
            EventQueue.invokeLater(new Runnable()
            {
                公共无效运行()
                {
                    label.setText("text2");
                }
            });
        }
    })。开始();
}
于 2013-03-05T13:53:20.370 回答
0

您的 GUI 在线程上运行。当您将该线程休眠 x 秒时,您的 GUI 将冻结 x 秒。

正如 Marko 在评论中指出的那样,“您必须改为使用 javax.swing.Timer 安排延迟事件”

于 2013-03-05T13:50:06.117 回答
0

在执行的操作方法中,您需要释放主 GUI 线程以使更改发生:

因此,如果您在 actionPerformed 方法中打开一个新线程,它将释放主 GUI 线程,然后在睡眠调用 label.setText("third text") 之后,这会将标签更改为第二个文本,首先等待 4 秒,然后将其更改为第三个文本

       @Override
        public void actionPerformed(ActionEvent e) {
            label.setText("second text");
            new Thread(){
              public void run(){
                try {
                  //Thread.currentThread();
                  Thread.sleep(4000);
                  label.setText("third text");
               } catch (InterruptedException exc) {
                System.out.println("Erorrrrr");
             }
           }
         }.start();

        }
于 2013-03-05T14:04:52.217 回答