java - 在触摸屏上按下按钮时,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);
}
}
解决方案
在采纳了@James_D 的诊断建议(谢谢,James)并进行了一些额外的研究之后,看起来问题是由于 OpenJFX 11 内部深处的一个已知(但不为人知的)错误造成的。有关详细信息,请参阅此处的讨论。似乎有一些解决方法,但最直接的解决方案似乎是尝试更新版本的 OpenJFX。
推荐阅读
- cordova - 是否可以通过 expo 开始一个 cordova 项目?
- java - 如何相互交换两个按钮的背景颜色?
- matlab - 抑制 MEX 警告:f951:警告:不存在包含目录 'MATLABROOT/simulink/include' [-Wmissing-include-dirs]
- java - 找到电势为零的所有点并绘制它
- javascript - 如何在 cshtml 文件中调用外部 javascript 文件
- gcc - PowerPC GCC 重定位运算符
- node.js - 在使用 twitter npm 包的 GET 请求期间“无法对您进行身份验证”
- python - 创建一个新列,该列是在不使用 groupby python 的情况下在每行中满足 2 个参数的重复计数
- angular - 在 ngOnInit 中调用的函数返回空
- python - 如何从 plot_roc_curve 中删除图例?