JFrame没有出现在Eclipse中

时间:2014-05-16 12:51:35

标签: java eclipse macos swing

我尝试在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)。

5 个答案:

答案 0 :(得分:0)

你的代码是正确的,并在我自己的日食中工作。

可能是你的日食不完美。在我看来,改变你的日食版本,然后再试一次。

顺便说一句,确保jdk版本在eclipse和你的控制台中是一样的。

答案 1 :(得分:0)

我认为您无法直接向JFrame添加组件。您必须使用以下语法:

frame.getContentPane().add(new JButton("hello"));

如@DSquare所述。

您可以直接添加到其他swing组件,但不能添加到JFrame。

我做了一些研究,发现从java 1.5开始,你可以直接调用add()JFrame对象,它会隐式调用正确的窗格。这仅包括添加步骤。所有其他对内容窗格的调用都应该明确完成。

答案 2 :(得分:0)

答案 3 :(得分:0)

我不确定这是否是最终的解决方案,但我学到了一些东西,并希望在此分享:

任何评论/更正都非常受欢迎(因为我仍然是这一切的新手......)

答案 4 :(得分:0)

当我使用swing和Java 1.8时,我遇到了类似的问题。 @DSquare提到了某种线程问题。

我终于通过在运行->运行配置->参数

中取消选中“使用SWT启动时使用-XstartOnFirstThread参数”来解决了该问题。

希望这会有所帮助。