Окно SWT работает в Linux, но не в Mac

1

Я добавил SWT-окно в мой проект как

public class swtUI {
    protected Shell shell;
    protected Display display;

    public static void launch() {
        try {
            swtUI window = new swtUI();
            window.open();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void open() {
        display = Display.getDefault();
        createContents();
        shell.open();
        shell.layout();

        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();
    }

    /**
     * Create contents of the window.
     */
    protected void createContents() {
        shell = new Shell();

        // create all controls
        blablabal
    }
}

и назовите его в main() как

public static void main(String[] args) {
    swtUI.launch();
    System.out.println("\nComplete");   
}

В Linux нет проблем. Но когда я заменяю linux swt.jar на maxos swt.jar и запускаюсь на mac, у меня есть исключение:

    ***WARNING: Display must be created on main thread due to Cocoa restrictions.
org.eclipse.swt.SWTException: Invalid thread access
    at org.eclipse.swt.SWT.error(Unknown Source)
    at org.eclipse.swt.SWT.error(Unknown Source)
    at org.eclipse.swt.SWT.error(Unknown Source)
    at org.eclipse.swt.widgets.Display.error(Unknown Source)
    at org.eclipse.swt.widgets.Display.createDisplay(Unknown Source)
    at org.eclipse.swt.widgets.Display.create(Unknown Source)
    at org.eclipse.swt.graphics.Device.<init>(Unknown Source)
    at org.eclipse.swt.widgets.Display.<init>(Unknown Source)
    at org.eclipse.swt.widgets.Display.<init>(Unknown Source)
    at org.eclipse.swt.widgets.Display.getDefault(Unknown Source)
    at edu.rockefeller.casanovaLab.csvCheck.CsvSuiteGUI.open(CsvSuiteGUI.java:129)
    at edu.rockefeller.casanovaLab.csvCheck.CsvSuiteGUI.launch(CsvSuiteGUI.java:119)
    at edu.rockefeller.casanovaLab.csvCheck.Program.main(Program.java:19)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)

Я новичок в SWT. Как мне изменить свой код, чтобы он работал на Mac?

благодаря

  • 0
    Немного опыта работы с SWT, но, насколько я понимаю, он очень специфичен для запуска из его потока диспетчеризации событий (или потока пользовательского интерфейса)
Теги:
macos
swt

1 ответ

1
Лучший ответ

Кажется, это упоминается в этом FAQ. По той же ссылке:

Чтобы обойти эту проблему, вам нужно передать параметр -XstartOnFirstThread в исполняемый файл java следующим образом:

java -XstartOnFirstThread -cp swt.jar:. ControlExample
  • 0
    Благодарю. что такое "ControlExample" в конце?
  • 0
    @Mavershang Это пример, который я взял по ссылке. Обозначает основной класс приложения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню