我有这个简单的java应用程序使用swing。然而,当我执行程序时,框架将出现,但我无法在任何地方点击,按钮仅在几秒钟后出现。我是javas Swing图书馆的新手,所以我可能会遗漏一些东西,但是从我所看到的这段代码不应该引起任何问题。
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 :(得分:-1)
您需要在UI调度线程下创建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:
几乎所有与Swing组件创建或交互的代码都必须 在事件派发线程上运行
您还可以使用invokeAndWait
在创建UI之前需要阻止。