2016-02-07 9 views
1

Я пишу простое приложение в java с помощью JxBrowser, но я застрял в самом начале. В моем коде есть unecorated stage, что я хочу сделать его перетаскиваемым. Для этого, искал и нашел следующую ссылку:setOnMouseDragged не работает в режиме браузера

How to drag undecorated window

Так я поставил mousePressed и MouseDragged событие на stackPane, но только mousePressed событие увольняют и mouseDragged событие никоим образом не увольняют. Любая идея, в чем проблема?

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

import com.teamdev.jxbrowser.chromium.Browser; 
import com.teamdev.jxbrowser.chromium.javafx.BrowserView; 

import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 
import javafx.stage.StageStyle; 

private static double xOffset = 0; 
private static double yOffset = 0; 

public class Main extends Application { 

    public static void main(String[] args) { 

     launch(args); 

    } 

    @Override 
    public void start(Stage primaryStage) { 

     Platform.setImplicitExit(false); 

     Browser browser = new Browser(); 

     BrowserView browserView = new BrowserView(browser); 

     StackPane pane = new StackPane(); 

     pane.getChildren().add(browserView); 

     Scene scene = new Scene(pane, 380, 500); 

     primaryStage.initStyle(StageStyle.UNDECORATED); 

     primaryStage.setScene(scene); 

     pane.setOnMousePressed(new EventHandler<MouseEvent>() { 

      @Override 
      public void handle(MouseEvent event) { 

       System.out.println("mouse pressed"); 

       xOffset = primaryStage.getX() - event.getScreenX(); 

       yOffset = primaryStage.getY() - event.getScreenY(); 

      } 

     }); 

     pane.setOnMouseDragged(new EventHandler<MouseEvent>() { 

      @Override 
      public void handle(MouseEvent event) { 

       System.out.println("mouse dragged"); 

       primaryStage.setX(event.getScreenX() + xOffset); 

       primaryStage.setY(event.getScreenY() + yOffset); 

      } 

     }); 

     primaryStage.show(); 

    } 

} 
+0

Просто догадайтесь: возможно, вы должны 'primaryStage.show();' перед тем, как присоединить слушателей событий. – Benvorth

+0

К сожалению, не помогает :( –

+0

, так как для jxbrowser требуется лицензия, которую я не могу проверить локально. Мое следующее предположение заключалось бы в том, чтобы добавить слушателей событий к панели или даже самому браузеру. – Benvorth

ответ

2

Поскольку JxBrowser требует лицензии я не мог проверить это ... Так что я заменил, что с ярлыком и она отлично работает .. Так что я думаю, что вы пытаетесь перетащить, нажав на браузер сам и не StackPane .. Попробуйте щелкнуть по углу сцены или добавить стек панели в VBox и setPadding к нему .. И попробуйте щелкнуть по углу. Если вы нажмете на браузер, то события мыши браузера будут тригерамированными.

Доказательство: enter image description here

правильный код

package RezRem; 

import com.teamdev.jxbrowser.chromium.Browser; 
import com.teamdev.jxbrowser.chromium.javafx.BrowserView; 

import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.event.EventHandler; 
import javafx.geometry.Insets; 
import javafx.scene.Scene; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.StackPane; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 
import javafx.stage.StageStyle; 


public class Main extends Application { 

private static double xOffset = 0; 
private static double yOffset = 0; 
public static void main(String[] args) { 

    launch(args); 

} 

@Override 
public void start(Stage primaryStage) { 

    Platform.setImplicitExit(false); 


    Browser browser = new Browser(); 

    BrowserView browserView = new BrowserView(browser); 
    StackPane pane = new StackPane(); 

    pane.getChildren().add(browserView); 
    pane.setPadding(new Insets(10,10,10,10)); 
    Scene scene = new Scene(pane, 380, 500); 

    primaryStage.initStyle(StageStyle.UNDECORATED); 

    primaryStage.setScene(scene); 

    pane.setOnMousePressed(new EventHandler<MouseEvent>() { 

     @Override 
     public void handle(MouseEvent event) { 

      System.out.println("mouse pressed"); 

      xOffset = primaryStage.getX() - event.getScreenX(); 

      yOffset = primaryStage.getY() - event.getScreenY(); 

     } 

    }); 

    pane.setOnMouseDragged(new EventHandler<MouseEvent>() { 

     @Override 
     public void handle(MouseEvent event) { 

      System.out.println("mouse dragged"); 

      primaryStage.setX(event.getScreenX() + xOffset); 

      primaryStage.setY(event.getScreenY() + yOffset); 

     } 

    }); 
    browser.loadURL("http://www.google.com"); 
    primaryStage.show(); 

} 

} 

Причина

JxBrowser простирается до края так панель стека не был на вершине ни было это видно по бокам, так что слушатель мыши никогда не был вызван установкой отступов стека панели на всех четырех сторонах было 10px-разрывов, где, если щелкнуть, вызвало события мыши и тем самым разрешило проблему.

+0

«Попробуйте щелкнуть по углу сцены» не помогло. Я создал instanse VBox, 'vb' и установил' padding' на нем. Затем я добавил 'pane 'to' vb' и создал «сцену» следующим образом: «Сцена сцены = новая сцена (vb, 300, 500);'). Также добавлены прослушиватели перетаскивания мышью на 'vb'. В конце слушатели работали правильно, но браузер ничего не показывал, даже когда я загрузил html. (Загрузка html отлично работает без VBox). Кроме того, я могу предоставить вам лицензию, если вы считаете, что это может помочь. Моя лицензия бесплатна для open source проект. Спасибо за попытку. –

+0

Подождите десять минут или около того .. Я буду попробуйте обходной путь .. Чтобы вам не нужно было использовать vbox .. –

+0

Как вы загружаете веб-страницу? –