Окно приложения 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. ...
).