2013-05-28 56 views
4

我正在編寫一個javafx UI,並希望從被單擊的MenuItem的eventHandler中獲取contextMenu的所有者節點。Javafx 2.0 - 在EventHandler中獲取ContextMenu父節點

我的代碼:

TabPane tabPane = new TabPane(); 
Tab tab1 = new Tab(); 
Tab tab2 = new Tab(); 

tabPane.getTabs().addAll(tab1,tab2); 

ContextMenu contextMenu = new ContextMenu(); 
MenuItem menuItem = new MenuItem("Do Some Action"); 

menuItem.setOnAction(new EventHandler<ActionEvent>(){ 
    @override 
    public void handle(ActionEvent e){ 
     // Get the tab which was clicked on and do stuffs with it 
    } 
}); 

contextMenu.getItems().add(menuItem); 

for(Tab tab: tabPane.getTabs()){ 
    tab.setContextMenu(contextMenu); 
} 

我想這樣做的就是到了它的文本菜單中選擇的選項卡的參考。

我能得到什麼似乎是菜單項的文本菜單用下面的代碼手柄(ActionEvent的五)內部方法的菜單項事件處理程序的引用:

ContextMenu menu = ((ContextMenu)((MenuItem)e.getSource()).getParentPopup()); 

我的想法從那裏是在菜單上使用ContextMenu的.getOwnerNode()方法,然後對該選項卡進行引用,但運行時我得到了一個我無法理解的項目的引用。

.getOwnerNode()返回的對象的toString()方法返回「TabPaneSkin $ TabHeaderSkin $ 3 @ 14f59cef」,我無法弄清楚它的含義。

我的方法是試圖按照我的方式向上鏈,直到我到達節點正確或有一個完全不同的方法,這會更好地工作嗎?

我需要的就是ContextMenu的功能,並且當點擊MenuItem時,我需要引用選中ContextMenu的選項卡,以便我可以使用它進行很酷的操作。

回答

4
  1. 爲每個選項卡創建一個ContextMenu。
  2. 使每個標籤最終。
  3. 直接引用上下文菜單的菜單項事件處理程序中的最終選項卡。

下面的代碼片段:

final Tab tab = new Tab("xyzzy"); 
ContextMenu contextMenu = new ContextMenu(); 
MenuItem menuItem = new MenuItem("Do Some Action"); 
menuItem.setOnAction(new EventHandler<ActionEvent>(){ 
    @Override public void handle(ActionEvent e){ 
    tab.setText("Activated by User"); 
    } 
}); 

每次用戶右鍵點擊一個選項卡標題,並選擇「伯爵點擊」菜單,相關標籤的內容與計數更新迄今爲止該標籤計算的舔數。

clickcounter

這裏是一個可執行樣本:

import javafx.application.*; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.stage.Stage; 

public class TabContext extends Application { 
    @Override public void start(Stage stage) { 
    TabPane tabPane = new TabPane(); 

    tabPane.getTabs().addAll(
     createTab("xyzzy", "aliceblue"), 
     createTab("frobozz", "blanchedalmond") 
    ); 

    stage.setScene(new Scene(tabPane)); 
    stage.show(); 
    } 

    private Tab createTab(String tabName, String webColor) { 
    final Label content = new Label("0"); 
    content.setAlignment(Pos.CENTER); 
    content.setPrefSize(200, 100); 
    content.setStyle("-fx-font-size: 30px; -fx-background-color: " + webColor + ";"); 

    final Tab tab = new Tab(tabName); 
    tab.setContent(content); 

    ContextMenu contextMenu = new ContextMenu(); 

    MenuItem menuItem = new MenuItem("Count Click"); 
    menuItem.setOnAction(new EventHandler<ActionEvent>(){ 
     @Override public void handle(ActionEvent e){ 
     content.setText(
      "" + (Integer.parseInt(content.getText()) + 1) 
     ); 
     } 
    }); 

    contextMenu.getItems().add(menuItem); 

    tab.setContextMenu(contextMenu); 

    return tab; 
    } 

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

交替使用匿名內部類這種方式,你可以創建一個事件處理程序子類與包括標籤瞭解該事件處理是一個構造連接。

class TabContextMenuHandler implements EventHandler<ActionEvent> { 
    private final Tab tab; 

    TabContextMenuHandler(Tab tab) { 
    this.tab = tab; 
    } 

    @Override public void handle(ActionEvent event) { 
    tab.setText("Activated by User"); 
    } 
} 
+0

感謝您的快速反應和很好的解決方案。 – mcdonasm