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

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++) { } } 

新的Frame1();

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

     Thread.sleep(5000); 
  2. 始终建议不要使用NullLayout 。 学习Swing开发人员为他们辛勤工作创建的合适的布局管理器 。 让我们为他们的努力付出一些价值。

  3. 使用SwingUtilities.invokeLater函数将您的GUI渲染任务(包括framesetVisible(true)放入EDT中。 例如:

     SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new MyWindow().setVisible(true); } }); 
  4. 您正在使用多帧。 它也被Swing系列Stack Overflow 禁止 。 家庭使用Card Layout显示了许多工作,您可以轻松采用这些工作,以避免不必要地使用多个帧。 一些例子在Andrew Thompson的答案中给出了给定的链接。