JavaFX ContextMenu如何获取被单击的对象?

use*_*830 5 javafx contextmenu eventhandler

我正在学习javafx.scene.control.ContextMenu,现在我遇到了一个问题:

如何从EventHandler获取单击的对象?event.source()和event.target()均返回MenuItem。

让我用一个例子来解释:我应该在函数句柄里面写什么?

    TextField text = new TextField();
    Label label1 = new Label("hello");
    Label label2 = new Label("world");
    Label label3 = new Label("java");

    ContextMenu menu = new ContextMenu();
    MenuItem item = new MenuItem("copy to text field");
    menu.getItems().add(item);
    item.setOnAction(new EventHandler(){
        public void handle(Event event) {
            //I want to copy the text of the Label I clicked to TextField
            event.consume();
        }
    });

    label1.setContextMenu(menu);
    label2.setContextMenu(menu);
    label3.setContextMenu(menu);
Run Code Online (Sandbox Code Playgroud)

编辑:我希望有一些简单的解决方案(一个班轮),但如果没有,那么有很多复杂的方法可以做到这一点。

Rol*_*and 2

您可以创建自己的 ContextMenu 实例并向其中添加操作父级以供进一步参考:

public class Main extends Application {

    TextField text = new TextField();

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

    @Override
    public void start(Stage primaryStage) {


        Label label1 = new Label("hello");
        Label label2 = new Label("world");
        Label label3 = new Label("java");

        label1.setContextMenu(new MyContextMenu(label1));
        label2.setContextMenu(new MyContextMenu(label2));
        label3.setContextMenu(new MyContextMenu(label3));

        HBox root = new HBox();

        root.getChildren().addAll(text, label1, label2, label3);

        Scene scene = new Scene(root, 300, 100);

        primaryStage.setScene(scene);
        primaryStage.show();

    }

    private class MyContextMenu extends ContextMenu {

        public MyContextMenu(Label label) {

            MenuItem item = new MenuItem("copy to text field");
            item.setOnAction(event -> {

                // I want to copy the text of the Label I clicked to TextField
                text.setText(label.getText());

                event.consume();
            });

            getItems().add(item);

        }

    }
}
Run Code Online (Sandbox Code Playgroud)