首页 > 解决方案 > 在触摸屏上按下按钮时,JavaFX 按钮 onAction 属性不会触发

问题描述

我正在学习 JavaFX 并正在开发一个 JavaFX 应用程序,它将我的笔记本电脑的触摸屏变成一个迷你钢琴。我的原型有一堆按钮代替钢琴键,每个按钮映射到不同的 Midi 音符。用鼠标点击按钮成功触发按钮的 onAction 属性并播放相关的音符。用我的手指戳按钮没有。该程序清楚地知道我的手指在哪里,因为当我用手指戳一个按钮时,按钮会改变颜色,就像我将鼠标指针移入它时一样。我知道问题出在 JavaFX 而不是更普遍的 Java 或我的触摸屏上,因为我在 Swing 中编写了一个基本相同的原型,其中戳屏幕成功地播放了一个音符。(我也很乐意坚持使用 Swing,如果 Swing 有任何类型的多点触控支持就好了。我想弹奏和弦。)我是否缺少有关 JavaFX 的某些东西,例如触摸屏事件处理程序,或者这里有什么严重错误?

作为记录,我将 OpenJDK 11.0.7 和 OpenJFX 11.0.2 与 Xubuntu 笔记本电脑一起使用。这是相关的代码位。

@Override
public void start(Stage stage) {

    stage.setTitle("Midi Test");
    buttons = new Button[NOTE_VALUE.length];
    for (int i = 0; i < NOTE_VALUE.length; i++) {
        buttons[i] = new Button(NOTE_NAME[i]);
        buttons[i].setPrefSize(KEY_WIDTH,KEY_HEIGHT);
        buttons[i].setOnAction(this);
    }
    // Layout omitted for brevity
    stage.show();

}

public void handle(ActionEvent event) {

    // Identifies which button was pressed and plays the corresponding note

    int index = -1;
    for (int i = 0; i < buttons.length; i++) {
        if (event.getSource().equals(buttons[i])) {
            index = i;
            break;
        }
    }
    if (index != -1) {
        channels[0].allNotesOff();
        channels[0].noteOn(NOTE_VALUE[index],93);
    }

}

标签: javajavafxtouch

解决方案


在采纳了@James_D 的诊断建议(谢谢,James)并进行了一些额外的研究之后,看起来问题是由于 OpenJFX 11 内部深处的一个已知(但不为人知的)错误造成的。有关详细信息,请参阅此处的讨论。似乎有一些解决方法,但最直接的解决方案似乎是尝试更新版本的 OpenJFX。


推荐阅读