JWindow不会重新绘制,直到JFrame从while循环返回

时间:2015-04-15 16:23:37

标签: java swing

假设我有一个JWindow和一个名为TestWindow和TestFrame的JFrame,它们都应该同时显示,为什么TestWindow只绘制一个没有标签的空白灰色窗口,而TestFrame在while(true)内? ?

为什么我删除了while(true),TestWindow正确显示?

这是一个更复杂的程序示例,我需要在主应用程序启动时显示启动画面需要1或2秒。 在此期间,无论主应用程序的状态如何,都应显示启动画面,而只有当主应用程序已经完成时才会显示启动画面,invokeAndWait实际上并没有等待初始化启动画面。

TestFrame.java

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class TestFrame extends JFrame
{
    public static void main(String args[])
    {
        try
        {
           SwingUtilities.invokeAndWait(new Runnable()
           {
               @Override
               public void run()
               {
                   new TestWindow();
               }
           });
        }
        catch (Exception ex)
       {
           Logger.getLogger(TestFrame.class.getName()).log(Level.SEVERE, null, ex);
       }
       SwingUtilities.invokeLater(new Runnable()
       {
           @Override
           public void run()
           {
               new TestFrame();
           }
        });
    }

    public TestFrame()
    {
        super("TestFrame");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().add(new JLabel("sss"), BorderLayout.CENTER);
        setSize(500, 120);
        setVisible(true);
        while(true)
        {
            //this makes the other not show
        }
    }
}

TestWindow.java

import java.awt.BorderLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JWindow;

public class TestWindow
{
    public TestWindow()
    {
        JWindow jWindow = new JWindow();
        JPanel contentPanel = new JPanel();
        final JLabel label = new JLabel("Test Window");
        contentPanel.add(label, BorderLayout.CENTER);
        jWindow.add(contentPanel);
        jWindow.setSize(300, 200);
        jWindow.setAlwaysOnTop(true);
        jWindow.setVisible(true);
    }
}

修改

顺便说一句,我意识到要放一个

catch (Exception ex)
        {
            Logger.getLogger(TestFrame.class.getName()).log(Level.SEVERE, null, ex);
        }
        try
        {
            Thread.sleep(1000);
        }
两个TestWindow和TestFrame创建之间的

实际上解决了这个问题,是不是没有比这更少的hacky ???

1 个答案:

答案 0 :(得分:3)

正在Swing事件调度线程或EDT上调用您的while (true)循环,将其绑定并阻止此线程执行必要的操作,包括绘制所有GUI并与用户交互。解决方案很简单 - 1)摆脱while循环(正如你已经想到的那样),或者2)如果循环是绝对必要的,那就在后台线程中完成。

有关Swing线程的更多详细信息,请查看Lesson: Concurrency in Swing