摆动窗口被冻结,不显示内容
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();
-
Swing在一个名为
Event Dispatch Thread(EDT)
线程中执行GUI渲染任务。 你做的任何可能需要一段时间的事情都会阻止EDT,你的挥杆应用程序将被冻结。 你正在通过以下陈述做这件事:Thread.sleep(5000);
-
始终建议不要使用
NullLayout
。 学习Swing开发人员为他们辛勤工作创建的合适的布局管理器 。 让我们为他们的努力付出一些价值。 -
使用
SwingUtilities.invokeLater
函数将您的GUI渲染任务(包括frame
的setVisible(true)
放入EDT中。 例如:SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new MyWindow().setVisible(true); } });
-
您正在使用多帧。 它也被Swing系列Stack Overflow 禁止 。 家庭使用
Card Layout
显示了许多工作,您可以轻松采用这些工作,以避免不必要地使用多个帧。 一些例子在Andrew Thompson
的答案中给出了给定的链接。