Браузер SWT - Swing Integration - Mac - JDK 1.7

Правильно, поэтому у меня возникла интересная проблема, касающаяся интеграции SWT и Swing на Mac под управлением Java 1.7. Я пытаюсь встроить виджет SWT Browser в мой проект Swing в качестве панели, которую довольно просто сделать в Java версии 1.6. В ряде публикаций объясняется, как это сделать с помощью классов моста SWT_AWT, а также в следующем примере:

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class MySWTBrowserTest implements ActionListener {

public JButton addCodeButton;
public JButton launchBrowserButton;
public JTextField inputCode;
public JFrame frame;
static Display display;
static boolean exit;

public MySWTBrowserTest() {
    frame = new JFrame("Main Window");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel mainPanel = new JPanel();
    mainPanel.setLayout(new FlowLayout());

    inputCode = new JTextField(15);
    inputCode.setText("999");
    addCodeButton = new JButton("Add Code");
    addCodeButton.addActionListener(this);
    addCodeButton.setActionCommand("addcode");

    launchBrowserButton = new JButton("Launch Browser");
    launchBrowserButton.addActionListener(this);
    launchBrowserButton.setActionCommand("launchbrowser");

    mainPanel.add(inputCode);
    mainPanel.add(addCodeButton);
    mainPanel.add(launchBrowserButton);

    frame.getContentPane().add(mainPanel, BorderLayout.CENTER);
    frame.pack();
    frame.setVisible(true);
}

@Override
public void actionPerformed(ActionEvent e) {
    if (e.getActionCommand().equals("addcode")) {
    } else if (e.getActionCommand().equals("launchbrowser")) {
        createAndShowBrowser();
    }

}

public void createAndShowBrowser() {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    final Canvas canvas = new Canvas();
    f.setSize(850, 650);
    f.getContentPane().add(canvas);
    f.setVisible(true);
    display.asyncExec(new Runnable() {

        @Override
        public void run() {
            Shell shell = SWT_AWT.new_Shell(display, canvas);
            shell.setSize(800, 600);
            Browser browser = new Browser(shell, SWT.NONE);
            browser.setLayoutData(new GridData(GridData.FILL_BOTH));
            browser.setSize(800, 600);
            browser.setUrl("http://www.google.com");
            shell.open();
        }
    });
}

public static void main(String args[]) {
    //SWT_AWT.embeddedFrameClass = "sun.lwawt.macosx.CEmbeddedFrame";
    display = new Display();

    EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {
            MySWTBrowserTest mySWTBrowserTest = new MySWTBrowserTest();
        }
    });

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

Я использую файлы JAR swt-3.8M5-cocoa-macosx-x86_64, которые, очевидно, необходимо включить для запуска приведенного выше примера. При использовании как 32-разрядной, так и 64-разрядной версии 1.6 JDK, это работает отлично, но при переключении на виртуальную машину JDK 1.7 или 1.8 выдается воспроизводимая ошибка:

2012-05-14 15:11:30.534 java[1514:707] Cocoa AWT: Apple AWT Java VM was loaded on first thread -- can't start AWT. (
0   liblwawt.dylib                      0x00000008db728ad0 JNI_OnLoad + 468
1   libjava.dylib                       0x00000001015526f1 Java_java_lang_ClassLoader_00024NativeLibrary_load + 207
2   ???                                 0x00000001015a4f90 0x0 + 4317663120
)
_NSJVMLoadLibrary: NSAddLibrary failed for /libjawt.dylib
JavaVM FATAL: lookup of function JAWT_GetAWT failed. Exit
Java Result: 255

Я проверил Java 1.7 VM и нашел там библиотеки, так что я изо всех сил пытаюсь выяснить, что может заставить его не загружать эту библиотеку. Конечно, я должен использовать: -XstartOnFirstThread в качестве одного из параметров виртуальной машины, как это требуется для интеграции SWING/AWT.

Кроме того, я попробовал среду DJ Native Widgets, и она выдает ту же ошибку, что и базовая структура SWT.

Чтобы воспроизвести эффекты, я предлагаю установить JDK 1.7 (выпуск без предварительной версии для разработчиков) на Mac, загрузив: http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops4/S-4.2M7-201205031800/swt-S-4.2M7-201205031800-cocoa-macosx-x86_64.zip чтобы получить библиотеку и затем запустить ее с -XstartOnFirstThread -d64 java 1.7 vm.

очень надеюсь, что кто-то сможет разобраться с этим, так как я уверен, что я не единственный, кто пытается интегрировать SWT в качели на 1,7 ВМ

Я также потратил 8 часов на Google, чтобы увидеть, была ли эта ошибка воспроизведена где-то еще, и она появилась в нескольких списках рассылки Matlab, но кроме этого я не смог найти что-то даже близко к решению.

Заранее спасибо.


>> ОБНОВЛЕНИЕ 1

Похоже, у нас может быть победитель: https://bugs.eclipse.org/bugs/show_bug.cgi?id=374199 Собираемся следить за этим и посмотреть, куда он идет.

>> ОБНОВЛЕНИЕ 2

Вот рабочий пример: /questions/42242500/kak-vstroit-swt-brauzer-v-sving-jframe/42242512#42242512

1 ответ

К сожалению, нет хорошего ответа на это. В Java 7 AWT был полностью переписан для использования слоев CoreAnimation. SWT предполагает, что холст AWT будет поддерживаться NSView, но это уже не так. Сейчас ваш единственный выбор - придерживаться Java 6.

Команда AWT знает о проблеме, но вы можете отправить еще одну ошибку на bugs.sun.com.

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