2012-11-17 65 views
2

我想製作一個可拖動的彈出控件,它獨立於它的父窗口,並且沒有系統的標題欄。JavaFX 2:可拖動的彈出工具窗口?

我試圖是重寫以移動基於節點上鼠標事件未修飾階段,請參閱下面的代碼可拖動板JavaFX的例子。不幸的是,這似乎不能正常工作,它不光滑,並且在多屏幕上不規則地跳過屏幕。我讀過一些其他人使用類似的方法,但是這是目前唯一的方法,或者是否有人找到一個好的解決方案? 謝謝,

private Node makeDraggable(final Node node) { 
    final DragContext dragContext = new DragContext(); 
    final Node wrapGroup = node; 

    wrapGroup.addEventFilter(
      MouseEvent.MOUSE_PRESSED, 
      new EventHandler<MouseEvent>() { 
       public void handle(final MouseEvent mouseEvent) { 

         dragContext.mouseAnchorX = mouseEvent.getX(); 
         dragContext.mouseAnchorY = mouseEvent.getY(); 
         dragContext.initialTranslateX = 
           stage.getX(); 
         dragContext.initialTranslateY = 
           stage.getY(); 
        } 

      }); 

    wrapGroup.addEventFilter(
      MouseEvent.MOUSE_DRAGGED, 
      new EventHandler<MouseEvent>() { 
       public void handle(final MouseEvent mouseEvent) { 

         stage.setX(
           dragContext.initialTranslateX 
             + mouseEvent.getX() 
             - dragContext.mouseAnchorX); 
         stage.setY(
           dragContext.initialTranslateY 
             + mouseEvent.getY() 
             - dragContext.mouseAnchorY); 
        dragContext.initialTranslateX = 
          stage.getX(); 
        dragContext.initialTranslateY = 
          stage.getY(); 

       } 
      }); 

    return node; 
} 

回答

1

我用製備clock當低於此樣品的方法。

我只測試了它在一個屏幕上,因爲我不會有多個屏幕可用做。

/** makes a stage draggable using a given node */ 
public static void makeDraggable(final Stage stage, final Node byNode) { 
    final Delta dragDelta = new Delta(); 
    byNode.setOnMousePressed(new EventHandler<MouseEvent>() { 
     @Override public void handle(MouseEvent mouseEvent) { 
      // record a delta distance for the drag and drop operation. 
      dragDelta.x = stage.getX() - mouseEvent.getScreenX(); 
      dragDelta.y = stage.getY() - mouseEvent.getScreenY(); 
      byNode.setCursor(Cursor.MOVE); 
     } 
    }); 
    byNode.setOnMouseReleased(new EventHandler<MouseEvent>() { 
     @Override public void handle(MouseEvent mouseEvent) { 
      byNode.setCursor(Cursor.HAND); 
     } 
    }); 
    byNode.setOnMouseDragged(new EventHandler<MouseEvent>() { 
     @Override public void handle(MouseEvent mouseEvent) { 
      stage.setX(mouseEvent.getScreenX() + dragDelta.x); 
      stage.setY(mouseEvent.getScreenY() + dragDelta.y); 
     } 
    }); 
    byNode.setOnMouseEntered(new EventHandler<MouseEvent>() { 
     @Override public void handle(MouseEvent mouseEvent) { 
      if (!mouseEvent.isPrimaryButtonDown()) { 
       byNode.setCursor(Cursor.HAND); 
      } 
     } 
    }); 
    byNode.setOnMouseExited(new EventHandler<MouseEvent>() { 
     @Override public void handle(MouseEvent mouseEvent) { 
      if (!mouseEvent.isPrimaryButtonDown()) { 
       byNode.setCursor(Cursor.DEFAULT); 
      } 
     } 
    }); 
} 
+0

這在多個屏幕上也很棒!非常感謝。 – JavaMonkey22

+0

還有一件事,你也有一個makeResizable?或者你能告訴我在哪裏發現了,謝謝! – JavaMonkey22

+0

我寫了。我沒有編寫相應的調整大小函數 - 請查看[ensemble app source](http://www.oracle.com/technetwork/java/javafx/samples/index.html)。 – jewelsea