Swing应用程序窗口在Mac上没有响应

时间:2012-11-09 19:33:52

标签: java macos swing windowbuilder swt-awt

我正在尝试在我的 Mac OS X 10.8.2 (Java版本1.6.0_37)计算机上运行基本的 Swing应用程序,每次我尝试从 Eclipse 运行它,框架出现,但我无法与它交互。

我试图从一个基本的,干净的平台开始,在 Eclipse (WindowBuilder->Swing Designer->Application Window)中创建一个新的 Swing应用程序窗口项目。这会生成以下框架代码:

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.BorderLayout;

public class Test {

private JFrame frame;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Test window = new Test();
                window.frame.setVisible(true);
                window.frame.pack();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public Test() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 450, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JButton btnPress = new JButton("Press");
    frame.getContentPane().add(btnPress, BorderLayout.CENTER);
}

}

一切似乎都很好,但是当我从Eclipse运行时,框架不允许我与任何组件交互(在我的非示例代码中,有按钮和选项卡)。

另外,在控制台中,我看到的内容如下:

2012-11-09 14:30:27.624 java[8107:707] [Java CocoaComponent compatibility mode]: Enabled

2012-11-09 14:30:27.626 java[8107:707] [Java CocoaComponent compatibility mode]: Setting timeout for SWT to 0.100000

我是否需要更改某些特定于Mac的设置? (我使用的是最新的默认Mac JRE)

6 个答案:

答案 0 :(得分:1)

程序在OSX下的我的机器上运行正常,但它可能是缺少的

window.frame.pack();

你试过这个吗?

Test window = new Test();
window.frame.pack();
window.frame.setVisible(true);

答案 1 :(得分:1)

在我的应用程序中使用DJ Swing库时,我遇到了同样的问题(它使用SWT)。有趣的是,即使我没有明确初始化DJ Swing,问题仍然存在。它现在有效,因为我添加了DJ Swing初始化:

public class SwingAppTest {

    public static void main(String[] args) {

        NativeInterface.open();
        UIUtils.setPreferredLookAndFeel();

        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                JFrame frame = new JFrame("Example");
                frame.getContentPane().setLayout(new BorderLayout());
                frame.setPreferredSize(new Dimension(400, 200));
                frame.setBounds(0,0,200,200);
                frame.setTitle("blah");
                JButton blah = new JButton("blah");
                blah.addActionListener(new ActionListener() {

                    public void actionPerformed(ActionEvent e) {
                        System.out.println("button clicked");
                    }
                });
                frame.getContentPane().add(blah, BorderLayout.CENTER);
                frame.setVisible(true);
            }
        });

        NativeInterface.runEventPump();
    }

}

答案 2 :(得分:0)

Apple在10.6之后不再支持Java操作系统了:
Apple not committing to Java support in Mac OS X 10.7

似乎是JRE中缺少或不兼容的库文件。

答案 3 :(得分:0)

这很奇怪。我试过你的样本(没有linux)并且没有看到任何问题。 正如Wayne所提到的,可能是macos问题。

顺便问一下,你正在使用的java版本是什么?

另一方面,问题可能出在您未与我们分享的代码中=>很难猜到:)

编辑:好的,所以看起来你正在玩“猜猜我的代码中有什么”和我们玩游戏:)我的假设是代码没有显示会导致问题。

这让我想起了一些Poiroit / Agatha Christie的侦探故事,其中只有一些细节可能会对现实产生重大影响。

这就是我理论的原因:

  • 显示的代码使用Java swing库(import javax.swing. ...)+ Awt(import java.awt. ...) - 这种组合是一种常见的用例,但是
  • 您分享的错误消息显示SWT库错误(Setting timeout for SWT to 0.100000

所以对我来说,似乎你在混合那些永远不应该混合的东西。 由于Swing是完全独立于操作系统的java UI库(最初是Sun制造的),它建立在Awt之上。但是SWT是完全不同的java UI库,它是一种原生调用与Java混合(最初是IBM制造的)。

因此我建议仔细检查您的代码并确保如果您使用JFrame,那么您拥有的唯一库组件来自Swingjavax.swing....)/ {{ 1}}(Awt)。

答案 4 :(得分:0)

我几天试图让这个工作起来,我一直在撞墙,终于找到了答案:

'它现在已经解决了 - 这只是从项目依赖项中删除swt.jar的一种情况。'

嘿presto !!!!

答案 5 :(得分:0)

就我而言,我试图编写一个使用jPanel的游戏。我需要重写绘画方法,并将pack();添加到主体中,它最终向我展示了我尝试绘制的内容。