如何为左派和左派制作一个活动右键同时点击?

时间:2015-05-04 21:42:10

标签: java user-interface events javafx event-handling

我知道如何单独处理左键或右键,拖动,双击,但如果用户同时点击鼠标左键和鼠标键而不干扰/我就无法弄清楚如何做某事导致其他事件发生。

@Override
public void handle(Event event) {
    if (event.getSource() instanceof Tile) {
        Tile tile = (Tile) event.getSource();
        if (event.getEventType().equals(MouseEvent.MOUSE_CLICKED)) {
            if (((MouseEvent) event).getButton().equals(MouseButton.SECONDARY))
                tile.toggleFlag();
            else if (((MouseEvent) event).getClickCount() == 2)
                mineField.massClick(tile);
        }
        if (event.getEventType().equals(MouseEvent.DRAG_DETECTED))
            if (!((MouseEvent) event).getButton().equals(MouseButton.SECONDARY))
                tile.startFullDrag();
        if (event.getEventType().equals(MouseDragEvent.MOUSE_DRAG_ENTERED))
            tile.arm();
        if (event.getEventType().equals(MouseDragEvent.MOUSE_DRAG_EXITED))
            tile.disarm();
        if (event.getEventType().equals(MouseDragEvent.MOUSE_DRAG_RELEASED))
            mineField.clickedTile(tile);
        if (event.getEventType().equals(ActionEvent.ANY))
            mineField.clickedTile(tile);
    }
}

此外,如果您发现我的代码存在问题,请随时指出,并始终寻求改进。

3 个答案:

答案 0 :(得分:3)

简单版本是:

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        try {

            StackPane root = new StackPane();

            root.addEventFilter(MouseEvent.MOUSE_PRESSED, e -> {

                if( e.isPrimaryButtonDown() && e.isSecondaryButtonDown()) {
                    System.out.println( "Both down");
                } else if( e.isPrimaryButtonDown()) {
                    System.out.println( "Primary down");
                } else if( e.isSecondaryButtonDown()) {
                    System.out.println( "Secondary down");
                }

            });

            Scene scene = new Scene(root,400,400);
            primaryStage.setScene(scene);
            primaryStage.show();

        } catch(Exception e) {
            e.printStackTrace();
        }
    }

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

如果您希望在按下两个按钮时发生自己的事件,可以这样尝试:

public class Main extends Application {

    BooleanProperty primaryMouseButtonDown = new SimpleBooleanProperty();
    BooleanProperty secondaryMouseButtonDown = new SimpleBooleanProperty();

    @Override
    public void start(Stage primaryStage) {
        try {

            StackPane root = new StackPane();

            root.addEventFilter(MouseEvent.MOUSE_PRESSED, e -> {
                primaryMouseButtonDown.setValue( e.isPrimaryButtonDown());
                secondaryMouseButtonDown.setValue( e.isSecondaryButtonDown());
            });

            root.addEventFilter(MouseEvent.MOUSE_RELEASED, e -> {
                primaryMouseButtonDown.setValue( e.isPrimaryButtonDown());
                secondaryMouseButtonDown.setValue( e.isSecondaryButtonDown());
            });

            BooleanBinding binding = Bindings.and(primaryMouseButtonDown, secondaryMouseButtonDown);
            binding.addListener( new ChangeListener<Boolean>() {

                @Override
                public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
                    System.out.println( "Mouse Button Event: " + oldValue + " -> " + newValue);
                }
            });


            Scene scene = new Scene(root,400,400);
            primaryStage.setScene(scene);
            primaryStage.show();

        } catch(Exception e) {
            e.printStackTrace();
        }
    }

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

有2个布尔属性,一个用于主按钮向下,一个用于辅助按钮向下。两个属性都通过BooleanBinding连接。只要其中一个属性通过鼠标事件更改,就会触发一个事件。那么剩下要做的就是检查newValue是否为真并触发你的处理代码。

答案 1 :(得分:1)

执行更多操作,观察鼠标按下,并在为鼠标左键/右键调用mousePressed事件时将布尔值设置为true。然后在事件中看看是否左右两个布尔都是真的。如果是的话,就像对它们同时按下一样。

boolean mouse_1, mouse_2 = false;

public void mousePressed(MouseEvent e){
    //The numbers are just made up I don't remember the actual codes for the buttons but it's simple enough to figure out.
    if(e.getButton()==1){
        mouse_1  = true;
    }
    if(e.getButton()==2){
        mouse_2  = true;
    }

    if(mouse_1&&mouse_2){
    //Your code here
    }
}

public void mouseReleased(MouseEvent e){
    if(e.getButton() == 1){
        mouse_1 = false;
    }
    if(e.getButton() == 2){
        mouse_2 = false;
    }
}

假设这是某种处理程序类......但这是如何实现它的简称。

答案 2 :(得分:1)

我可能迟到了回答这个问题,但我要发布我的解决方案,以便演示如何同时处理单键按钮,同时点击两个按钮

现有答案已经解释了如何检测同时点击的两个鼠标按钮。但鼠标事件(点击,按下和释放)仍由单个按钮触发,之前的海报并未解决如何避免这些事件相互干扰的问题。

我的解决方案是跟踪鼠标按下时按下的两个按钮,并在鼠标释放时检测任何类型的鼠标点击:

//flag to track both buttons being pressed
private boolean wereBothButtonsPressed = false;

private void onMousePressed(MouseEvent e) {
    //single button press sets flag to false
    wereBothButtonsPressed = e.isPrimaryButtonDown() && e.isSecondaryButtonDown();
}

private void onMouseReleased(MouseEvent e) {
    if (e.isPrimaryButtonDown() || e.isSecondaryButtonDown()) {
        //do nothing if user is still holding the button
        return;
    }
    if (wereBothButtonsPressed) {
        System.out.prinln("Both buttons");
    } else if (e.getButton() == MouseButton.PRIMARY) {
        System.out.prinln("Only primary");
    } else if (e.getButton() == MouseButton.SECONDARY) {
        System.out.prinln("Only secondary");
    }
}

您可以为特定控件上的特定事件设置这些处理程序,或使其适合您的方法:

private boolean wereBothButtonsPressed = false;

@Override
public void handle(Event event) {
    ...

    if (event.getEventType().equals(MouseEvent.MOUSE_PRESSED)) {
        MouseEvent me = (MouseEvent) event;
        wereBothButtonsPressed = me.isPrimaryButtonDown() && me.isSecondaryButtonDown();
    } else if (event.getEventType().equals(MouseEvent.MOUSE_RELEASED)) {
        MouseEvent me = (MouseEvent) event;
        if (!me.isPrimaryButtonDown() && !me.isSecondaryButtonDown()) {
            if(wereBothButtonsPressed) {
                mineField.massClick(tile);
            } else if(me.getButton() == MouseButton.PRIMARY) {
                mineField.clickedTile(tile);
            } else if(me.getButton() == MouseButton.SECONDARY) {
                tile.toggleFlag();
            }
        } 
    ...