我正在学习JavaFX,并正在开发一个JavaFX应用程序,它将把我的笔记本电脑的触摸屏变成一个迷你钢琴。 我的原型有一堆Buttons来代替钢琴键,每个按钮映射到一个不同的Midi音符。 用鼠标点击按钮,成功触发按钮的onAction属性,并播放相关的音符。 而用手指戳按钮却不能。 程序显然知道我的手指在哪里,因为当我用手指戳按钮时,按钮会改变颜色,就像我将鼠标指针移入按钮时一样。 我知道问题出在JavaFX上,而不是出在Java上,也不是出在我的触摸屏上,因为我在Swing中写了一个基本相同的原型,在这个原型中,戳屏幕可以成功地播放一个音符。 (如果Swing有任何形式的多点触控支持,我也会很高兴地坚持使用Swing。 我想演奏和弦。) 是我遗漏了JavaFX的什么东西,比如触摸屏事件处理程序,还是这里有什么大问题?
郑重声明,我在Xubuntu笔记本上使用OpenJDK 11.0.7和OpenJFX 11.0.2。 下面是相关的代码片段。
@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);
}
}
在采纳了 @James_D 的诊断建议(谢谢,James)并做了一些额外的研究后,看起来这个问题是由于 OpenJFX 11 内核中一个已知的(但不明显的)错误。 请看讨论 此处 以了解详情。 似乎有一些变通办法,但最直接的解决方案似乎是尝试最新版本的OpenJFX。