使JavaFX Button在外观上看起来像是单击右键

时间:2019-04-11 22:52:01

标签: swing javafx

我将一些旧的Java Swing代码转换为JavaFX。 JavaFX代码具有用于鼠标右键调用的显式doClick()

myButton.addMouseListener(new MouseAdapter() {
    @Override
    public final void mousePressed(MouseEvent e) {
        if (SwingUtilities.isLeftMouseButton(e)) {
            // ...
        }
        else if (SwingUtilities.isRightMouseButton(e)) {
            // ...
            myButton.doClick();
        }
    }
});

左键单击使该按钮在Java Swing中看起来像是单击的。但是,如果不添加myButton.doClick()

,右键单击就不会在视觉上做到这一点

我在JavaFX中看到了相同的视觉行为,我希望右键单击以使按钮看起来像单击一样。下面是我的JavaFX代码:

myButton.setOnMouseClicked(new EventHandler<MouseEvent>() {
    @Override
    public void handle(final MouseEvent event) {
        if (event.getButton() == MouseButton.PRIMARY) {
            // ...
        }
        else if (event.getButton() == MouseButton.SECONDARY) {
            // ...
        }
    }
});

要添加鼠标右键单击myButton,我需要添加什么?

2 个答案:

答案 0 :(得分:3)

按钮单击的视觉外观通常称为“武装”伪状态。因此,在按下和释放右键时,您可以打开/关闭按钮的布防伪状态。 像..

myButton.setOnMousePressed(e->{
    if(e.getButton()== MouseButton.SECONDARY){
        myButton.pseudoClassStateChanged(PseudoClass.getPseudoClass("armed"), true);
    }
});
myButton.setOnMouseReleased(e->{
    if(e.getButton()== MouseButton.SECONDARY){
        myButton.pseudoClassStateChanged(PseudoClass.getPseudoClass("armed"), false);
    }
});

答案 1 :(得分:2)

如果您想通过右键单击触发var combinedResult = nameQuery.Zip(boardMembersQuery, (n, b) => new { Name = n, BoardMember = b }); 的动作,则仅更新combinedResult伪类是不够的。您实际上需要布防:armed。换句话说,您需要将armed属性更改为Button。另外,更新Button属性将为您更新伪类。

由于true属性是只读的,因此您不能直接设置它;您需要致电arm()disarm()。您可能还需要手动调用fire()(在下面进行扩展)。这是一个示例:

armed

但是,您似乎根本不需要armed处理程序-至少在JavaFX 11和12中,使用默认的Button button = new Button("Click Me!"); button.setOnAction(event -> System.out.println("Button clicked!")); button.setOnMousePressed(event -> { if (event.getButton() == MouseButton.SECONDARY) { button.arm(); } }); button.setOnMouseReleased(event -> { if (button.isArmed()) { button.disarm(); button.fire(); } }); 的外观/行为。如果onMouseReleased的行为类会在释放鼠标(并且没有按下任何键)时使Button'处于待命状态,则会触发该操作。请注意,默认行为类会针对使用哪个Button进行更复杂的检查(即,它会执行更多操作,然后仅检查Button)。您可以自己查看here的实现。

话虽如此,如果您只想更改视觉效果,则应使用Sai's answer中显示的方法。