2017-09-30 153 views
3

我有使用swing的这个简单的java应用程序。然而,当我执行程序的时候,框架会出现,但我不能在任何地方点击,而按钮只会在几秒钟后出现。我对javas Swing库非常陌生,所以我可能会错过一些东西,但是从我读过的代码中不应该引起任何问题。Java JFrame冻结

import java.awt.Graphics; 
import java.awt.image.BufferStrategy; 
import java.awt.FlowLayout; 
import javax.swing.*; 

public class Game { 

    public static void main(String[] args) { 

     JFrame frame = new JFrame("JFrame Example"); 
     JPanel panel = new JPanel(); 
     panel.setLayout(new FlowLayout()); 
     JLabel label = new JLabel("This is a label!"); 
     JButton button = new JButton(); 

     button.setText("Press me"); 

     panel.add(label); 
     panel.add(button); 

     frame.add(panel); 
     frame.setSize(300, 300); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 

    } 
} 

编辑 所以我重新安装了JDK,但发现这样的:如果我的浏览器运行时,我执行上面的代码将挂起和冻结,​​但是如果我关闭浏览器,它运行正常。但是我不能启动我的浏览器,直到我杀了我的应用程序,所以看起来我的安装有问题,因为它们不应该使用相同的资源?

编辑 解决我的问题:有JDK的多个版本和JRE安装这样既解除停止,然后安装最新版本,一切似乎是工作!

+0

Java版本,操作系统,CPU,RAM? – PeterMmm

+0

我在Windows 10,i5-6600k和16GB内存上使用java 8。但是我刚刚意识到,即使在打开“关于Java”应用程序时也是如此,所以看起来我的问题与java相关,而不是这个特定的代码。 – tiggybits

+0

应该像你一样工作。我很好奇你的框架实际上是冻结还是仅仅在窗口大小调整后出现。 – Antoniossss

回答

-1

需要创建UI用户界面下分派线程:

SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     // code to create UI or call to function that creates the UI 
    } 
}); 

的Java 8风格:

SwingUtilities.invokeLater(()->{ 
    // Your UI code 
}); 

如果不使用成语则UI不能部分在不一致的状态下创建,请参阅Creating UI in swing

几乎所有的c创建或与Swing组件交互必须 事件调度线程

上运行,你也可以使用invokeAndWait ODE是你需要阻塞,直到UI创建。

+0

downvoting需要一些解释。 –

+0

除了回答一个漂亮的副本,这不能回答这个问题。他的代码适合我。你在概括,甚至没有意识到实际的问题。 –

+0

我不会downvote,即使这是推荐的方式,这个例子在这里运行没有任何问题 – PeterMmm