簡體   English   中英

雙擊JavaFX 2.2時禁用TreeItem的默認展開/折疊

[英]Disable TreeItem's default expand/collapse on double click JavaFX 2.2

我正在開發一個JavaFX 2.2項目,我想在TreeItem上設置鼠標(雙)單擊事件的自定義處理。 使用treeview.setOnMouseClicked我沒有錯誤地激活我的代碼,但問題是TreeItem,在每次鼠標雙擊時,它在展開和折疊之間切換。 我想這是默認行為,但我如何禁用它?

我遇到了同樣的問題,並使用EventDispatcher及時解決了這個問題。

class TreeMouseEventDispatcher implements EventDispatcher {
    private final EventDispatcher originalDispatcher;

    public TreeMouseEventDispatcher(EventDispatcher originalDispatcher) {
      this.originalDispatcher = originalDispatcher;
    }

    @Override
    public Event dispatchEvent(Event event, EventDispatchChain tail) {
        if (event instanceof MouseEvent) {
           if (((MouseEvent) event).getButton() == MouseButton.PRIMARY
               && ((MouseEvent) event).getClickCount() >= 2) {

             if (!event.isConsumed()) {
               // Implement your double-click behavior here, even your
               // MouseEvent handlers will be ignored, i.e., the event consumed!
             }

             event.consume();
           }
        }
        return originalDispatcher.dispatchEvent(event, tail);
    }
}

然后將此TreeMouseEventDispatcher用於TreeCell

treeView.setCellFactory(new Callback<TreeView<T>, TreeCell<T>>() {
  @Override
  public TreeCell<T> call(TreeView<T> param) {
    return new TreeCell<T>() {
      @Override
      protected void updateItem(T item, boolean empty) {
        if (item != null && !empty) {
          EventDispatcher originalDispatcher = getEventDispatcher();
          setEventDispatcher(new TreeMouseEventDispatcher(originalDispatcher));
        }
      }
    };
  }
}

事實證明,雖然Bolg的答案是有效的,但這並不是嚴格的“正確”方式,並且可能會導致一些意想不到的行為。

此錯誤中描述了此問題的原因。 總結一下:樹形單元格的默認雙擊行為實際上是由鼠標按下事件引發的,因此使用該事件並在鼠標單擊偵聽器中阻止它為時已晚。

接受的答案有效的原因是它不會過濾鼠標事件類型 ,這意味着它會消耗與主按鈕相關的所有鼠標事件以及點擊次數為2。 這也意味着用戶操作被處理三次,這可能不是預期的行為。

修復只是對Bolg的答案的一行更改,但我認為最好不要涉及EventDispatcher。 像下面這樣的東西應該工作得很好:

node.addEventHandler(MouseEvent.ANY, event -> {
    if (event.getClickCount() == 2 && event.getButton().equals(MouseButton.PRIMARY)) {
        if (event.getEventType().equals(MouseEvent.MOUSE_CLICKED)) {
            System.out.println("hello"); // perform some action
        }

        event.consume();
    }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM