2016-07-15 5 views
0

FXCanvas를 사용하여 SWT 응용 프로그램의 JavaFX WebView/WebEngine을 사용하여 간단한 브라우저를 구현하려고합니다. 어떤 이유로, 복사/붙여 넣기 새로 고침과 같은 항목이있는 inbuilt 상황에 맞는 메뉴가 작동하지 않는 것 같습니다.JavaFX WebView 컨텍스트 메뉴

내 JavaFX 상황에 맞는 메뉴를 만들면 작동하지만 특정 지점에서 어떤 HTML 요소가 마우스 아래에 있는지 확인할 방법을 찾을 수 없습니다 (예 : 링크와 이미지의 메뉴 항목이 다름)

이 동작을 보여줍니다 간단한 예 :

import org.eclipse.swt.SWT; 
import org.eclipse.swt.layout.GridData; 
import org.eclipse.swt.layout.GridLayout; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Shell; 

import javafx.embed.swt.FXCanvas; 
import javafx.scene.Scene; 
import javafx.scene.control.ContextMenu; 
import javafx.scene.control.MenuItem; 
import javafx.scene.input.MouseButton; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.web.WebEngine; 
import javafx.scene.web.WebView; 

public class TestBrowser { 
    public static void main (String [] args) { 
     Display display = new Display(); 
     Shell shell = new Shell(display); 

     shell.setLayout(new GridLayout()); 

     FXCanvas canvas = new FXCanvas(shell, SWT.NONE); 
     canvas.setLayoutData(new GridData(SWT.FILL,SWT.FILL,true,true)); 

     BorderPane borderPane = new BorderPane(); 
     Scene scene = new Scene(borderPane); 
     canvas.setScene(scene); 

     WebView browser = new WebView(); 
     WebEngine webEngine = browser.getEngine(); 
     borderPane.setCenter(browser); 

//  createContextMenu(browser); Creating a custom context menu works 

     boolean test = browser.isContextMenuEnabled(); 
     System.out.println("WebView context menu enabled? "+test); 

     webEngine.load("http://example.org"); 

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

    private static void createContextMenu(WebView webView) { 
     ContextMenu contextMenu = new ContextMenu(); 
     MenuItem reload = new MenuItem("Reload"); 
     reload.setOnAction(e -> webView.getEngine().reload()); 

     webView.setOnMousePressed(e -> { 
      if (e.getButton() == MouseButton.SECONDARY) { 
       contextMenu.show(webView, e.getScreenX(), e.getScreenY()); 
      } else { 
       contextMenu.hide(); 
      } 
     }); 
    } 
} 

내가 뭔가 잘못하고 오전 또는이 FXCanvas/웹보기 버그인가?

답변

1

그냥 선택한 HTML 요소 ....

import org.eclipse.swt.SWT; 
import org.eclipse.swt.layout.GridData; 
import org.eclipse.swt.layout.GridLayout; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Shell; 

import javafx.embed.swt.FXCanvas; 
import javafx.scene.Scene; 
import javafx.scene.control.ContextMenu; 
import javafx.scene.control.MenuItem; 
import javafx.scene.input.MouseButton; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.web.WebEngine; 
import javafx.scene.web.WebView; 
import netscape.javascript.JSObject; 

public class TestBrowser { 
    public static void main (String [] args) { 
     Display display = new Display(); 
     Shell shell = new Shell(display); 

     shell.setLayout(new GridLayout()); 

     FXCanvas canvas = new FXCanvas(shell, SWT.NONE); 
     canvas.setLayoutData(new GridData(SWT.FILL,SWT.FILL,true,true)); 

     BorderPane borderPane = new BorderPane(); 
     Scene scene = new Scene(borderPane); 
     canvas.setScene(scene); 

     WebView browser = new WebView(); 
     WebEngine webEngine = browser.getEngine(); 
     borderPane.setCenter(browser); 

     createContextMenu(browser); //Creating a custom context menu works 

     boolean test = browser.isContextMenuEnabled(); 
     System.out.println("WebView context menu enabled? "+test); 

     webEngine.load("http://example.org"); 

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



    private static void createContextMenu(WebView webView) { 

     MenuItem reload = new MenuItem("reload"); 
     reload.setOnAction(e -> { 
      webView.getEngine().reload(); 
      } 
     ); 
     ContextMenu contextMenu = new ContextMenu(reload); 
     webView.setOnMousePressed(e -> { 
      if (e.getButton() == MouseButton.SECONDARY) { 
       System.out.println(webView.getEngine().executeScript("document.elementFromPoint(" 
         +e.getX() 
         +"," + e.getY()+").tagName;")); 
       JSObject object = (JSObject) webView.getEngine().executeScript("document.elementFromPoint(" 
         +e.getX() 
         +"," + e.getY()+");"); 
       contextMenu.show(webView, e.getScreenX(), e.getScreenY()); 
      } else { 
       contextMenu.hide(); 
      } 
     }); 
    } 
} 
를 얻기 위해 자바 FX에서의 JSObject를 사용