У меня возникли проблемы с тем, чтобы окна сообщений и в некоторой степени диалоговые окна отображались/работали должным образом в Mac (v10.9.5).
Я только что обновил JRE и JDK до последней версии (8u31). «Java-версия» из окна терминала показывает, что я действительно использую 8u31. (Ранее я использовал 8u20, который демонстрировал такое же поведение.)
Приведенный ниже код отлично работает в Windows и нескольких различных версиях Linux, которые я тестировал, проблем нет. У меня просто проблемы на Mac. Я упростил свой код, основанный на SWT, но в этом примере используется Swing, до следующего:
package myTest;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class EntryCode
{
public static EntryCode oEntryCode;
public EntryCode()
{
// TODO Auto-generated constructor stub
}
public static void main(String[] args)
{
oEntryCode = new EntryCode();
oEntryCode.open();
}
public void open()
{
JPanel panel = new JPanel();
panel.setMinimumSize(new Dimension(200,200));
JFrame frame = new JFrame("JOptionPane showMessageDialog component example");
System.out.println("open(): entry - With frame");
JOptionPane.showConfirmDialog(frame, "Wow, works on the Mac!", "Inside open()", JOptionPane.YES_NO_OPTION);
System.out.println("Point 1");
System.exit(0);
}
}
Я вижу первую строку системного вывода, и код зависает на запросе окна сообщения. В реальном коде я просто использую null в качестве первого аргумента. Первоначальная версия этого тестового кода тоже использовала null, просто я экспериментировал с указанием компонента. Я думал, что это может быть проблемой. Нет.
При отображении диалоговых окон SWT существует тенденция, что нажатие на кнопку приводит к зависанию интерфейса. Зависание происходит где-то между нажатием кнопки и срабатыванием обработчика событий. Обработчик событий никогда не срабатывает.
Я не включил здесь диалоговое окно. Я полагаю, что, поскольку мое окно подтверждения/сообщения демонстрирует ту же проблему, что и решение одной, получите другую бесплатно.
Я сделал поиск в Google для отображения java-приложений на Mac, но ничего не вышло.
Я думаю, что обновление JRE/JDK до последней версии решит любые проблемы, связанные с ОС.
Я компилирую код в банку и использую следующее для запуска из окна терминала. Я нажимаю Ctrl+C, чтобы закрыть зависшее приложение.
java -XstartOnFirstThread -jar myTest.jar
Мысли?
ОБНОВЛЕНИЕ:
Я удалил исходное обновление, но оставляю исходный вопрос, теперь, когда я лучше понимаю проблему.
Настоящая проблема заключается в том, как инициировать правильное SWT-приложение Mac OSX Cocoa, поддерживающее ограничения, которое использует диалоговые окна и окна сообщений. (Насколько мне известно, единственный способ отобразить окна сообщений — использовать JOptionPane.show*, который является фишкой Swing, тем самым как бы смешивая Swing и SWT.
Интересно отметить, что проблема всегда связана с кнопками, будь то диалоговое окно (чистая реализация SWT) или окна сообщений. В первом случае проблема заключается в зависании при вызове обработчика событий, а во втором — отображении окна сообщения (нулевой первый аргумент, поскольку в приложении SWT не существует фрейма Swing).