当前位置: 首页 > 知识库问答 >
问题:

Javafx 2.0-在EventHandler中获取ContextMenu父节点

韦熙云
2023-03-14

我正在编写一个javafx UI,希望从单击的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);
}

我想做的是获取一个对选中了上下文菜单的选项卡的引用。

我能够通过MenuItem eventHandler的handle(ActionEvent e)方法中的以下代码获得对MenuItem ContextMenu的引用:

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

我的想法是在菜单上使用ContextMenu的. getOwnerNode()方法,然后对选项卡进行引用,但在运行该选项卡时,我会得到对我无法理解的项目的引用。

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

在到达节点之前,我的方法是否正确,或者是否有一种完全不同的方法可以更好地工作?

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

共有1个答案

上官波鸿
2023-03-14
  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");
  }
});

每次用户右键单击选项卡标题并选择“Count Click”(计数单击)菜单时,相关选项卡的内容都会更新为该选项卡迄今为止计算的单击次数。

以下是一个可执行示例:

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); }
}

除了以这种方式使用匿名内部类之外,您还可以创建一个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");
  }
}
 类似资料:
  • 我正在我的程序中使用提升property_tree。我已将树设置为使用自定义路径类型。我正在寻找的是获取特定节点的父节点ID。 下面是一个例子: 结果如预期: 我需要的是一种不永久存储节点的完整id的方法。我想的是一种简单地获取它的父节点id并将其推到路径的前面等等到顶层的方法。但是我似乎在property_tree中找不到这样做的方法。这可能吗?如果没有,对于这种情况还有其他计算完整路径的方法吗

  • 在C#中,我发现了一个非常可爱的方法,它允许您从指定的控件中获取所有后代及其所有后代。 我正在寻找一种类似的JavaFX方法。 我看到<code>Parent</code>类是我想要使用的,因为它是派生所有节点类的子类。 这就是我到目前为止所拥有的(我还没有在谷歌上找到任何像“JavaFX从场景中获取所有节点”这样的搜索): 那么,如何判断N是否是父级(或从父级扩展)?我这样做对吗?它似乎不起作用

  • 本文向大家介绍JavaScript 获取元素在父节点中的下标(推荐),包括了JavaScript 获取元素在父节点中的下标(推荐)的使用技巧和注意事项,需要的朋友参考一下 jQuery中直接通过$(this).index()即可得到当前元素的下标。但原生JavaScript并没有提供类似的属性或方法,这时候可以调用数组中的indexOf方法直接计算 这里是计算elt在其父节点下,相同标签的元素中的

  • 本文向大家介绍javascript 获取HTML DOM父、子、临近节点,包括了javascript 获取HTML DOM父、子、临近节点的使用技巧和注意事项,需要的朋友参考一下 在Web应用程序特别是Web2.0程序开发中,经常要获取页面中某个元素,然后更新该元素的样式、内容等。如何获取要更新的元素,是首先要解决的问题。令人欣慰的是,使用JavaScript获取节点的方法有很多种,这里简单做一下

  • 问题内容: 关闭。 此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow 的主题。 6年前关闭。 我的mySQL数据库中有如下表: 对于谓词,它将具有如下树视图: 我想创建一个可以选择起始节点并为此获得所有父节点的表单。例如,通过选择我想要获得: 步骤2: 有什么方法可以使用以下简单文本来打印此节点: 问题答案: 您的数据可以在RDF中表