2012-05-14 3 views
3

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

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(); 
} 
} 

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

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 

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

Еще одно замечание: я пробовал фреймворк Native Widgets для DJ, и он выдает ту же ошибку, что и в базовой структуре 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.

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

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

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


>> UPDATE 1

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

>> UPDATE 2

Вот рабочий пример: https://stackoverflow.com/a/27754819/363573

+2

Хороший вопрос !! Имея ту же проблему с OpenGL (JOGL) на Mac ... Слишком плохо, мы абсолютно ничего не можем сделать !!! Изменив компилятор Workspace по умолчанию и JRE на 1.6 ... –

+1

нет, вы не можете быть серьезным: (, я использовал JOGL много раз перед D: так что это должно быть новая вещь .. это было почти год, и эта проблема все еще не исправлено #frustrating –

+0

Я использую JOGL через его реализацию SWT Canvas, и я думаю, что это проблема ... Я предпочитаю SWT, потому что весь мой пользовательский интерфейс - SWT, а также я занимаюсь HATE Swing и AWT !!!Я мог бы пойти с тритоном, но я был слишком ленив, чтобы попробовать! –

ответ

2

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

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

+0

Большое спасибо за ваш ответ Скотт, не забудьте записать это как ошибку. Большое спасибо. –

+0

Отчет об ошибке: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7182511 –

+0

Только что обновил исходный вопрос, у нас может быть исправление для этого в соответствии с предоставленной ссылкой. –

Смежные вопросы