Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tabs JavaFX2.0-获取EventHandler中的ContextMenu父节点_Tabs_Javafx 2_Contextmenu - Fatal编程技术网

Tabs JavaFX2.0-获取EventHandler中的ContextMenu父节点

Tabs JavaFX2.0-获取EventHandler中的ContextMenu父节点,tabs,javafx-2,contextmenu,Tabs,Javafx 2,Contextmenu,我正在编写一个JavaFXUI,希望从单击的MenuItem的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 =

我正在编写一个JavaFXUI,希望从单击的MenuItem的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);
}
我的想法是在菜单上使用ContextMenu的.getOwnerNode()方法,然后对选项卡进行引用,但在运行时,我得到了一个对我无法理解的项的引用

.getOwnerNode()返回的对象的toString()方法返回“TabPaneSkin$TabHeaderSkin$3@14f59cef“我不明白这是什么意思

在到达节点之前,我尝试沿着链向上移动的方法是正确的,还是有一种完全不同的方法可以更好地工作

我所需要的只是一个ContextMenu的功能,当点击菜单项时,我需要有一个对选中ContextMenu的选项卡的引用,这样我就可以用它做一些很酷的事情

  • 为每个选项卡创建一个上下文菜单
  • 使每个选项卡成为最终选项卡
  • 直接引用上下文菜单的菜单项事件处理程序中的最后一个选项卡
  • 以下是一段代码片段:

    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");
      }
    });
    
    final Tab=new Tab(“xyzy”);
    ContextMenu ContextMenu=新建ContextMenu();
    MenuItem MenuItem=新MenuItem(“执行某些操作”);
    setOnAction(新的EventHandler(){
    @重写公共无效句柄(ActionEvent e){
    tab.setText(“由用户激活”);
    }
    });
    
    每次用户右键单击选项卡标题并选择“计数单击”菜单时,相关选项卡的内容都会更新为该选项卡到目前为止计数的单击次数

    以下是一个可执行示例:

    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); }
    }
    
    导入javafx.application.*;
    导入javafx.event.ActionEvent;
    导入javafx.event.EventHandler;
    导入javafx.geometry.Pos;
    导入javafx.scene.scene;
    导入javafx.scene.control.*;
    导入javafx.stage.stage;
    公共类TabContext扩展应用程序{
    @覆盖公共无效开始(阶段){
    TabPane TabPane=新建TabPane();
    tabPane.getTabs().addAll(
    createTab(“xyzzy”、“aliceblue”),
    createTab(“泡沫”、“白杏仁”)
    );
    stage.setScene(新场景(tabPane));
    stage.show();
    }
    私有选项卡createTab(字符串选项卡名称、字符串webColor){
    最终标签内容=新标签(“0”);
    内容设置对齐(位置中心);
    content.setPrefSize(200100);
    content.setStyle(“-fx字体大小:30px;-fx背景色:“+webColor+”;”);
    最终选项卡=新选项卡(选项卡名称);
    tab.设置内容(content);
    ContextMenu ContextMenu=新建ContextMenu();
    MenuItem MenuItem=新建MenuItem(“计数单击”);
    setOnAction(新的EventHandler(){
    @重写公共无效句柄(ActionEvent e){
    content.setText(
    “”+(Integer.parseInt(content.getText())+1)
    );
    }
    });
    contextMenu.getItems().add(menuItem);
    tab.setContextMenu(contextMenu);
    返回选项卡;
    }
    公共静态void main(字符串[]args){Application.launch(args);}
    }
    
    或者,通过这种方式使用匿名内部类,您可以创建一个带有构造函数的EventHandler子类,该构造函数包含EventHandler所附加的选项卡

    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");
      }
    }
    
    类TabContextMenuHandler实现EventHandler{ 私有最终选项卡; TabContextMenuHandler(选项卡){ this.tab=tab; } @重写公共无效句柄(ActionEvent事件){ tab.setText(“由用户激活”); } }
    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");
      }
    }