java - 线程在 actionPerformed 方法内部 hibernate

标签 java swing event-dispatch-thread thread-sleep

首先我想说我知道这种方法是错误的所以我问这个问题纯粹是出于好奇。假设我有一个这样的 swing 应用程序:

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

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

public class ThreadSleeping {
    JFrame frame = new JFrame();
    JPanel panel = new JPanel();
    JButton button = new JButton("Load");
    JLabel label = new JLabel();

    public ThreadSleeping() {
        panel.add(button);

        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                label.setIcon(new ImageIcon(
                        "C:/Users/Public/Pictures/Sample Pictures/Tulips.jpg"));
                System.out.println("Tulips painted");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                label.setIcon(new ImageIcon(
                        "C:/Users/Public/Pictures/Sample Pictures/Koala.jpg"));
                System.out.println("Koala painted");

            }
        });

        frame.add(panel, BorderLayout.NORTH);
        frame.add(label, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setSize(1024, 768);
        // frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new ThreadSleeping();
            }
        });
    }
}

基本上,当我单击 Load 按钮时,我希望显示 Tulips.jpg 图像,然后 GUI 卡住 2 秒,之后我希望显示 Koala。 jpg 图像显示。但发生的事情是:我点击按钮,GUI 卡住 2 秒,然后显示 Koala.jpg。在此之前没有 Tulips.jpg。但让我感到困惑的是,当我将那些 System.out.println("Tulips painted");System.out.println("Koala painted"); 放在一起时。因此,当我单击按钮时,它会打印“Tulips painted”,2 秒后“Koala painted”。有人能告诉我这是怎么回事吗?问候。

最佳答案

  1. 在这种情况下有效,because you programatically freeze ouf Swing GUI, but there is/aren't another update(s),不是另一个 JComponent(s)

  2. 在 Swing GUI 有一些其他更新的情况下不起作用,Thread.sleep(int) freeze Event Dispatch Thread,

  3. 默认情况下,JComponents XxxModels 的所有更新永远不会显示在 JComponents View

  4. example until sleep ended you'll lost all updated to the GUI

关于java - 线程在 actionPerformed 方法内部 hibernate ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15600203/

相关文章:

java - 将 GUI 作为线程启动

java - Java Swing中如何实现空闲任务

java - Ehcache中的复合键/通过部分键从缓存中删除

java - 我如何正确 Autowiring 此类和 applicationContext.xml?

java - ActiveMQ:如果内存/数据存储已满,则进行故障转移

java - 调用 JScrollPane 时未调用 PaintComponent

java - 为什么缺少 Java 权限时会出现 NPE?以及如何找出哪个权限?

java - Android:如何将可绘制资源附加到电子邮件?

java - 为小型桌面应用程序构建 GUI

java - JScrollPane 困惑