我将一些旧的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
,我需要添加什么?
答案 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中显示的方法。