gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:08:30 24 4
gpt4 key购买 nike

我正在编写一个 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);
}

我想要做的是获取对选择了 contextMenu 的选项卡的引用。

我能够使用 menuItem eventHandler 的 handle(ActionEvent e) 方法中的以下代码获得对 MenuItem 的 ContextMenu 的引用:
ContextMenu menu = ((ContextMenu)((MenuItem)e.getSource()).getParentPopup());

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

.getOwnerNode() 返回的对象的 toString() 方法返回“TabPaneSkin$TabHeaderSkin$3@14f59cef”,我无法弄清楚其含义。

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

我所需要的只是 ContextMenu 的功能,当 MenuItem 被点击时,我需要引用选择了 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");
    }
    });

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

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

    作为以这种方式使用匿名内部类的替代方法,您可以创建一个带有构造函数的 EventHandler 子类,该构造函数包含附加了 EventHandler 的 Tab。
    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");
    }
    }

    关于tabs - Javafx 2.0 - 在 EventHandler 中获取 ContextMenu 父节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16799664/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com