Сделайте так, чтобы кнопка JavaFX визуально отображалась для щелчка правой кнопкой мыши - PullRequest
1 голос
/ 12 апреля 2019

Я преобразовал старый 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 ]

3 голосов
/ 12 апреля 2019

Этот внешний вид нажатия кнопки обычно называется «вооруженным» псевдосостоянием. Таким образом, вы можете включать / выключать состояние псевдосохранения кнопки при нажатии и отпускании правой кнопки. Нечто подобное ..

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);
    }
});
2 голосов
/ 12 апреля 2019

Обновление псевдокласса :armed недостаточно, если вы хотите, чтобы действие Button запускалось щелчком правой кнопки мыши.Вам на самом деле нужно вооружить Button.Другими словами, вам нужно изменить свойство armed на true.Кроме того, обновление свойства armed обновит для вас псевдокласс.

Поскольку свойство armed доступно только для чтения, вы не можете установить его напрямую;Вам нужно позвонить arm() и disarm().Вам также может понадобиться вручную позвонить fire() (подробно описано ниже).Вот пример:

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 - по крайней мере, в JavaFX 11 и 12, с использованием стиля / поведения Button' по умолчанию.Класс поведения Button будет запускать действие, если указанное Button поставлено на охрану во время отпускания мыши (и ни одна из клавиш не нажата).Обратите внимание, что класс поведения по умолчанию выполняет более сложную проверку относительно того, какой MouseButton был использован (то есть он делает больше, чем просто проверка event.getButton() == MouseButton.PRIMARY).Вы можете увидеть реализацию для себя здесь .

Все это говорит о том, что если вы хотите, чтобы визуальные изменения только изменились, вам следует использовать подход, показанный в ответ Саи .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...