摆动窗口冻结,不显示内容

时间:2013-11-23 11:37:41

标签: java swing

public class Main extends JFrame{

JLabel lb1,lb2,lb3,lb4;
Button b,b1;
public Main()
{
    setLayout(null);
    Container c=getContentPane();
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    getContentPane().setBackground(Color.red);

    setVisible(true);





    b1=new Button("CONTINUE");
    b1.setFont(new Font("Algerian", 1, 20));
    b1.setForeground(Color.black);  
    b1.setBounds(550, 480, 200,40);
    b1.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent ae)
      {  setVisible(false);       
           try {
            new Frame();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


      }
    });




    c.add(b1);

    setSize(1290,900);

}

public static void main(String...s) throws InterruptedException
{
    new Main();


}
}

这是主要的类..这就是它调用的框架类..

public class Frame extends JFrame{


Frame() throws InterruptedException
{ 
JFrame f=new JFrame();
f.setVisible(true);
f.setLayout(null);
f.setBounds(0,0,200,200);

Container p=f.getContentPane();

p.setBackground(Color.GREEN);
f.setResizable(false);

Thread.sleep(5000);

    setVisible(false);
    new Frame1();

}

}

主类调用帧类...需要保持一定时间然后移动到另一帧... 但是会发生的事情是主类调用它,框架出现,但是没有内容。没有显示任何内容。然后它移动到frame1()//

但如果我像

一样跑
  

new Frame();

然后它成立,显示内容,然后移动..

那么为什么当Main()调用Frame()时它不起作用?

即使这段代码也没有'工作..而不是Thread.sleep()......这样我就不会阻止任何线程......我是吗?

for(double i=0;i<30;i++)
{


    for(double j=0;j<10000;j++)
    {


    }
}

new Frame1();

1 个答案:

答案 0 :(得分:3)

  1. Swing在称为Event Dispatch Thread(EDT)的单个线程中执行GUI渲染任务。你做的任何可能需要一段时间的事情都会阻止EDT,你的挥杆应用程序将被冻结。你正在通过以下陈述做出这样的事情:

    Thread.sleep(5000);
    
  2. 始终建议不要使用NullLayout。通过他们的努力学习Swing开发人员为我们创建的正确layout mangers。让我们为他们的努力付出一些价值。

  3. 使用frame功能将您的GUI渲染任务(包括setVisible(true)的{​​{1}})放入EDT中。例如:

    SwingUtilities.invokeLater
  4. 您正在使用多帧。由Stack Overflow的Swing家族提供的It is also prohibited。家庭使用SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new MyWindow().setVisible(true); } }); 显示了许多工作,您可以轻松采用这些工作来避免不必要地使用多个帧。在给定链接的Card Layout的答案中给出了一些示例。