我尝试在Eclipse(OSX)中执行以下代码:
public static void main(String[] args) {
JFrame frame = new JFrame("Test");
frame.setSize(new Dimension(400, 30));
frame.add(new JButton("hello"));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
框架没有显示,但我收到以下控制台消息:
2014-05-16 14:45:35.230 java[8685:903] [Java CocoaComponent compatibility mode]: Enabled
2014-05-16 14:45:35.232 java[8685:903] [Java CocoaComponent compatibility mode]: Setting timeout for SWT to 0.100000
2014-05-16 14:45:35.546 java[8685:903] *** __NSAutoreleaseNoPool(): Object 0x100612800 of class NSConcreteMapTableValueEnumerator autoreleased with no pool in place - just leaking
2014-05-16 14:45:35.547 java[8685:903] *** __NSAutoreleaseNoPool(): Object 0x100613f40 of class __NSCFDate autoreleased with no pool in place - just leaking
2014-05-16 14:45:35.547 java[8685:903] *** __NSAutoreleaseNoPool(): Object 0x100616e60 of class NSCFTimer autoreleased with no pool in place - just leaking
2014-05-16 14:45:35.550 java[8685:903] *** __NSAutoreleaseNoPool(): Object 0x10061d7c0 of class __NSCFDate autoreleased with no pool in place - just leaking
2014-05-16 14:45:35.550 java[8685:903] *** __NSAutoreleaseNoPool(): Object 0x10061e610 of class NSCFTimer autoreleased with no pool in place - just leaking
然而,如果我将代码放入Eclipse项目之外的java文件中并通过命令行编译并运行它,那么一切都很好并且框架显示出来。 有人可以帮我排除故障吗?
更新
代码现在看起来像这样:
import javax.swing.*;
public class TestFrame {
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
private void createAndShowGUI() {
JFrame frame = new JFrame("Test");
System.out.println(SwingUtilities.isEventDispatchThread());
frame.getContentPane().add(new JButton("hello"));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
});
}
}
这不能解决问题(正如用户DSquare已经提到的那样)。我发现这似乎是特定Eclipse项目的一个问题。如果我创建一个新的Eclipse项目(相同的Eclipse),代码运行时没有错误消息,框架就会显示出来。我仍然不知道哪些项目配置可能会导致它。我的类路径中没有swt.jar(虽然我的插件依赖项中有org.eclipse.swt和org.eclipse.swt.cocoa.macosx.x86_64)。
答案 0 :(得分:0)
你的代码是正确的,并在我自己的日食中工作。
可能是你的日食不完美。在我看来,改变你的日食版本,然后再试一次。
顺便说一句,确保jdk版本在eclipse和你的控制台中是一样的。
答案 1 :(得分:0)
我认为您无法直接向JFrame添加组件。您必须使用以下语法:
frame.getContentPane().add(new JButton("hello"));
如@DSquare所述。
您可以直接添加到其他swing组件,但不能添加到JFrame。
我做了一些研究,发现从java 1.5开始,你可以直接调用add()
到JFrame
对象,它会隐式调用正确的窗格。这仅包括添加步骤。所有其他对内容窗格的调用都应该明确完成。
答案 2 :(得分:0)
您需要在frame.setVisible(true)之前添加frame.pack()。
答案 3 :(得分:0)
我不确定这是否是最终的解决方案,但我学到了一些东西,并希望在此分享:
任何评论/更正都非常受欢迎(因为我仍然是这一切的新手......)
答案 4 :(得分:0)
当我使用swing和Java 1.8时,我遇到了类似的问题。 @DSquare提到了某种线程问题。
我终于通过在运行->运行配置->参数
中取消选中“使用SWT启动时使用-XstartOnFirstThread参数”来解决了该问题。希望这会有所帮助。