2017-01-23 46 views
1

我有這樣一個場景:哈弗拖動

FlowPane 
    AnchorPane 
     VBox 
     Label 
      LabeledText 
     HBox 
      ImageView 
      VBox 
       Label 
        LabeledView 
     StackPane 
      HBox 
       ImageView 

FlowPane有多個AnchorPane節點。我需要的是讓AnchorPane在拖拽任何內容的同時進行盤旋。就像我沒有拖動鼠標一樣。 我可以以編程方式觸發hover,使用:

private static PseudoClass HOVER_PSEUDO_CLASS = PseudoClass.getPseudoClass("hover"); 
anchorePane.pseudoClassStateChanged(HOVER_PSEUDO_CLASS, true); 

,但是這隻能如果鼠標右鍵拖動AnchorPane節點上。如果鼠標拖過labelimage ......它不會懸停。 你能幫我嗎?

回答

1

我真的不明白自己如何觸發懸停效果,但我認爲你不應該那樣做。它可以由您自動處理,由setOnDragEnteredsetOnDragExited事件處理程序自動處理,您只需指定預期的行爲。我舉了一個小例子來展示他們的工作方式。

public class JavaFXTest extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     BorderPane root = new BorderPane(); 

     ImageView avatar = new ImageView("https://www.gravatar.com/avatar/1eb4610d0e524773a8d28f8896dd5f20?s=64&d=identicon&r=PG"); 
     avatar.setOnDragDetected(e -> { 
      Dragboard db = avatar.startDragAndDrop(TransferMode.ANY); 
      ClipboardContent content = new ClipboardContent(); 
      content.putImage(avatar.getImage()); 
      db.setContent(content); 
      e.consume(); 
     }); 
     root.setLeft(avatar); 

     root.setCenter(getAnchorPane()); 
     root.setRight(getAnchorPane()); 

     Scene scene = new Scene(root, 400, 150); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public AnchorPane getAnchorPane() { 
     AnchorPane pane = new AnchorPane(); 
     pane.setOnDragEntered(e -> { 
      pane.setStyle("-fx-border-style: dotted;"); 
     }); 
     pane.setOnDragExited(e -> { 
      pane.setStyle(""); 
     }); 
     AnchorPane.setTopAnchor(pane, 20d); 
     AnchorPane.setLeftAnchor(pane, 100d); 
     ImageView imageView = new ImageView("http://cdn.sstatic.net/Sites/stackoverflow/company/img/logos/so/so-icon.png"); 
     pane.getChildren().add(imageView); 

     return pane; 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

首先創建一個階段與一個圖像(我的gravatar),其可以被拖動,和兩個相同的面板 - 這實際上是在一切start方法一樣。

getAnchorPane()方法創建面板並設置其事件處理函數:如果有任何東西被拖動,面板會將其邊框更改爲點。如果將鼠標懸停在面板上,或懸停在其子設備上,這是計算器標識,這並不重要。

Example

+0

謝謝。它像一個魅力。 – Robert