JavaFX:右键单击menuitem

时间:2014-02-28 15:51:50

标签: java javafx javafx-2 menuitem

我一直想知道为什么JavaFX MenuItems设计用于在右键单击上执行指定的操作?通常,任何Windows应用程序中的菜单项都应该在鼠标左键单击时起作用,但在JavaFX中,它看到两次单击操作都是相同的。

另一个想法是,有没有办法阻止右键单击MenuItems?我尝试了以下代码,但它失败了。

看起来事件处理程序根本没有注册。

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.Label;
import javafx.scene.control.MenuItem;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class ContextMenuDemo extends Application
{

@Override
public void start(Stage primaryStage)
{

    final ContextMenu cm = new ContextMenu();


    MenuItem menuItem1 = getMenuItemForLine("line 1");
    MenuItem menuItem2 = getMenuItemForLine("line 2");
    MenuItem menuItem3 = getMenuItemForLine("line 3");

    menuItem1.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>()
    {
        @Override
        public void handle(MouseEvent e)
        {
            if (e.getButton() == MouseButton.SECONDARY)
            {
                System.out.println("Desired Click");
            }
            else
            {
                System.out.println("No right click");
            }
            e.consume();
        }
    });

    menuItem2.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>()
    {
        @Override
        public void handle(MouseEvent e)
        {
            if (e.getButton() == MouseButton.SECONDARY)
            {
                System.out.println("Desired Click");
            }
            else
            {
                System.out.println("No right click");
            }
            e.consume();
        }
    });

    menuItem3.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>()
    {
        @Override
        public void handle(MouseEvent e)
        {
            if (e.getButton() == MouseButton.SECONDARY)
            {
                System.out.println("Desired Click");
            }
            else
            {
                System.out.println("No right click");
            }
            e.consume();
        }
    });


    cm.getItems().add(menuItem1);
    cm.getItems().add(menuItem2);
    cm.getItems().add(menuItem3);

    final Rectangle rectangle = new Rectangle(70, 70, Color.TAN);
    rectangle.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>()
    {
        @Override
        public void handle(MouseEvent e)
        {
            if (e.getButton() == MouseButton.SECONDARY)
            {
                cm.show(rectangle, e.getScreenX(), e.getScreenY());
            }
            else
            {
                System.out.println("No right click");
            }
        }
    });

    Group root = new Group();
    root.getChildren().addAll(rectangle);
    Scene scene = new Scene(root, 350, 250);
    primaryStage.setScene(scene);
    primaryStage.show();
}

private MenuItem getMenuItemForLine(String menuName)
{
    Label menuLabel = new Label(menuName);
    MenuItem menuItem = new MenuItem();
    menuItem.setGraphic(menuLabel);
    return menuItem;
}

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

2 个答案:

答案 0 :(得分:7)

你有很多无关的代码。我删除了一些。停止事件的方法是过滤。你必须找出一个事件被触发的时间,选中似乎是在按下时发生,onAction在发布时发生。一个节点上的两个事件一起点击。

无需为每个菜单项添加处理程序,即使这样,您也可以重复使用相同的菜单项。父菜单获取onAction事件。

package contextmenudemo;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class ContextMenuDemo extends Application {

    @Override
    public void start(Stage primaryStage) {

        final ContextMenu cm = new ContextMenu();
        cm.addEventFilter(MouseEvent.MOUSE_RELEASED, new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                if (event.getButton() == MouseButton.SECONDARY) {
                    System.out.println("consuming right release button in cm filter");
                    event.consume();
                }
            }
        });
        cm.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                System.out.println("right gets consumed so this must be left on "+
                        ((MenuItem)event.getTarget()).getText());
            }
        });

        MenuItem menuItem1 = new MenuItem("line 1");
        MenuItem menuItem2 = new MenuItem("line 2");
        MenuItem menuItem3 = new MenuItem("line 3");

        cm.getItems().addAll(menuItem1, menuItem2, menuItem3);

        final Rectangle rectangle = new Rectangle(70, 70, Color.TAN);
        rectangle.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent e) {
                if (e.getButton() == MouseButton.SECONDARY) {
                    cm.show(rectangle, e.getScreenX(), e.getScreenY());
                } else {
                    System.out.println("No right click");
                }
            }
        });

        Group root = new Group();
        root.getChildren().addAll(rectangle);
        Scene scene = new Scene(root, 350, 250);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

答案 1 :(得分:1)

你有没有试过放入

e.consume();