2012-05-14 3 views
3

그렇기 때문에 자바 1.7을 실행하는 Mac에서 SWT와 스윙 통합에 관한 흥미로운 문제가 있습니다. 임 스윙 브라우저 도구를 내 스윙 프로젝트에 자바 버전 1.6에서 할 수있는 패널로 포함하려고 시도했습니다.SWT 브라우저 - 스윙 통합 - 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(); 
} 
} 

임을 분명히 할 필요가있는 SWT-3.8M5 - 코코아 -에서라도-x86_64의 JAR 파일을 사용하여 다음 예제와 함께 SWT_AWT 브리지 클래스와 함께이 작업을 수행하는 방법을 설명하는 글은 여러 가지가있을 수있다 위의 예제를 실행하기 위해 포함되어 있습니다. 32 비트 및 1.6 JDK의 64 개 비트 버전 모두를 사용하는 경우,이 완벽하게 정상적으로 실행되지만 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 

필자는 자바 1.7 VM을 검사하고 거기에서 라이브러리를 찾았으므로, 무엇이 라이브러리를로드하지 못하게 하는지를 고심하고 있습니다. 물론 SWING/AWT 통합에 필요한대로 -XstartOnFirstThread를 VM 매개 변수 중 하나로 사용하십시오.

또 하나주의해야 할 점은 DJ Native Widgets 프레임 워크를 사용해 본 결과 기본 SWT 프레임 워크를 사용하는 것과 똑같은 오류가 발생한다는 것입니다.

효과를 재현하려면 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을 사용하여 JDK 1.7 (개발자 미리보기가 아닌)을 설치하는 것이 좋습니다.

정말 기대하고있는 사람이 오류가 있는지 확인하기 위해 임 확실 임 나는 또한 구글에 8 시간 동안 1.7 VM

에 스윙에 SWT를 통합하려고 노력하지 유일한 사람이 밖으로 정렬 할 수 있었다 다른 어느 곳에서나 재현되어 Matlab 메일 링리스트에 올라 왔지만 그 외에는 솔루션에 가깝게 뭔가를 찾을 수 없었습니다. 사전에

감사합니다. https://bugs.eclipse.org/bugs/show_bug.cgi?id=374199 이가는이를 모니터링하고 어디로 가는지 볼 수 : 우리는 승자가있을 수 있습니다처럼


>> UPDATE 1

보인다. https://stackoverflow.com/a/27754819/363573

+2

좋은 질문입니다! Mac에서 OpenGL (JOGL)과 동일한 문제가 발생했습니다 ... 너무 나빠서 우리가 할 수있는 일은 절대적으로 없습니다 !!! 작업 공간 기본 컴파일러와 JRE를 1.6 ... –

+1

으로 변경하면 심각한 문제가되지 않습니다. (D 조 전에 JOGL을 여러 번 사용 했으므로 새로운 작업이되어야합니다. 거의 1 년이 걸렸습니다. 아직 해결되지 않았습니다. #frustrating –

+0

SWT Canvas 구현을 통해 JOGL을 사용합니다. 문제가 있다고 생각합니다. SWT cuz을 선호하며 SWT와 SWT를 좋아합니다.나는 newt와 함께 갈 수 있었다. 그러나 나는 시험하기에는 너무나 게 !!했다! –

답변

2

불행하게도 이것에 더 좋은 답변이 없습니다 :

>> UPDATE 여기에 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

원래 질문에 대한 업데이트 만 했으므로 제공되는 링크에 따라 수정 될 수 있습니다. –