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

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

Я попытался начать с простого, чистого листа, создав новый проект Swing Application Window в 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 по умолчанию)


person pgebhard    schedule 09.11.2012    source источник
comment
Без кода без примера сложно представить, что вы сделали не так.   -  person Roman C    schedule 09.11.2012
comment
Я использую 10.8.2 и Eclipse Juno - ваш код работает нормально. Перезагрузите компьютер? :о)   -  person martinez314    schedule 10.11.2012
comment
Отлично работает при использовании 10.8.2 с JDK 1.6.0_37 и 1.7.0_06.   -  person MadProgrammer    schedule 10.11.2012
comment
@RomanC Приведенный выше код как раз и демонстрирует проблему.   -  person pgebhard    schedule 12.11.2012
comment
Я немного подправил код, чтобы включить кнопку для нажатия, но даже до этого я не мог нажать кнопку закрытия. Теперь с JButton я тоже не могу щелкнуть по нему.   -  person pgebhard    schedule 12.11.2012
comment
Вы запускали его без invokeLater? Может быть у вас неправильная версия библиотек SWT?   -  person Roman C    schedule 12.11.2012


Ответы (6)


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

window.frame.pack();

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

Test window = new Test();
window.frame.pack();
window.frame.setVisible(true);
person Skjalg    schedule 09.11.2012
comment
Это изменило размер окна, но не решило проблему отсутствия интерактивности. - person pgebhard; 12.11.2012

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

}
person Anton    schedule 06.03.2013

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

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

person Wayne Weibel    schedule 09.11.2012
comment
Для OS X доступно множество других JRE. Я очень сомневаюсь, что это проблема. - person Andrew Thompson; 10.11.2012

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

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

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

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

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

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

  • Показанный код использует библиотеку Swing Java (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. ...).

person Peter Butkovic    schedule 09.11.2012
comment
Использование Java версии 1.6.0_37 (по-моему, последняя версия от Apple). Что касается кода, то, что я опубликовал, это то, что я пытался запустить. - person pgebhard; 12.11.2012

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

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

Вуаля!!!!

person Bruce Storrie    schedule 16.04.2013

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

person Hector Luis Mariscal    schedule 14.10.2019