Окно приложения Swing не отвечает на Mac

Я пытаюсь заставить базовое приложение Swing работать на моем компьютере Mac OS X 10.8.2 (Java версия 1.6.0_37), и каждый раз, когда я пытаюсь запустить его из Eclipse, появляется рамка, но я не могу взаимодействовать с этим.

Я попытался начать с простого, чистого листа, где я создаю новый проект окна приложения Swing в Eclipse (WindowBuilder->Swing Designer->Application Window), Это создает следующий скелетный код:

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 по умолчанию)

5 ответов

Программа отлично работает на моей машине под OSX, но она может отсутствовать

window.frame.pack();

Вы пробовали это?

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

У меня была такая же проблема при использовании библиотеки 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();
    }

}

Я несколько дней стучал головой о стену, пытаясь заставить это работать, и наконец нашел ответ:

"Теперь это решено - это был всего лишь случай удаления swt.jar из зависимостей проекта".

Вуаля!!!!

В моем случае я пытался написать игру, в которой использовал jPanel. Мне нужно было переопределить метод рисования и добавитьpack(); к основному, и он наконец показал мне, что я пытался нарисовать.

Apple больше не поддерживает Java в операционных системах после 10.6:
Apple не поддерживает Java в Mac OS X 10.7

Похоже, отсутствующие или несовместимые файлы библиотеки в JRE.

Это странно. Я попробовал ваш образец (без linux) и не вижу там никаких проблем. Так что, как упоминал Уэйн, может быть проблема с macos.

Кстати, какую версию Java вы используете?

С другой стороны, проблема может быть в коде, которым вы не делитесь с нами => трудно догадаться:)

РЕДАКТИРОВАТЬ: ОК, похоже, вы играете в игру "угадайте, что у меня есть в моем коде":) Поскольку я предполагаю, что не показанный код вызывает проблемы.

Это напоминает мне некоторые из этих детективных историй о Пойройте и Агате Кристи, где лишь небольшая деталь может оказать существенное влияние на реальность.

Это причина моей теории:

  • Показанный код использует библиотеку Java Swing (import javax.swing. ...) + Awt (import java.awt. ...) - это сочетание является обычным случаем, однако
  • сообщение об ошибке, которым вы поделились, показывает ошибку библиотеки SWT (Setting timeout for SWT to 0.100000)

Поэтому мне кажется, что вы смешиваете вещи, которые никогда не должны смешиваться. Как Swing библиотека Java-интерфейса, полностью независимая от ОС (изначально созданная Sun), построенная на основе Awt, тем не мение SWT это совершенно другая библиотека Java-интерфейса, представляющая собой смесь нативных вызовов с Java (изначально сделанная IBM).

Поэтому я бы рекомендовал дважды проверить ваш код и убедиться, что если вы используете JFrameтолько компоненты библиотеки, которые у вас есть Swing (javax.swing....) / Awt (java.awt. ...).

Другие вопросы по тегам