【发布时间】:2019-06-14 08:38:26
【问题描述】:
我有一个 JavaFX 按钮,当用户按下回车键时触发。这会导致 FileChooser 打开。有些人(比如我自己)可能会在 FileChooser 中按 Enter 键来保存文件。但是,这会导致保存按钮再次触发自身并再次打开 FileChooser 以保存新文件。用鼠标单击按钮(在 FileChooser 中)没有这个问题。
我认为使用按钮中的事件可以解决这个问题,但它只使用 GUI 事件上的按钮,而不是 FileChooser 按钮。我尝试寻找修改 FileChooser 的 EventHandler 以使用回车键的方法,但没有成功。
我还尝试将焦点从按钮上移开并将其移至父级(窗格),因此无法再次单击它。但是,有些按钮可以多次单击而无需重新获得焦点。
我的代码示例如下所示(显然这将是扩展应用程序的更大类的一部分):
EventHandler<KeyEvent> enter = event -> {
if (event.getCode() == KeyCode.ENTER && event.getSource() instanceof Button) {
Button src = (Button) event.getSource();
src.fire();
}
event.consume();
};
Button b1 = new Button("Save");
b1.setOnKeyReleased(enter);
/* Called by .fire method */
b1.setOnAction(event -> {
/* Create the save dialog box */
FileChooser saveDialog = new FileChooser();
saveDialog.setTitle("Save");
/* Get file */
File f = saveDialog.showSaveDialog(stage);
/*
* ... do stuff with file ...
*/
});
注意:这个例子不是我的确切代码。相反,按键释放事件是用于多个按钮的变量,而不仅仅是保存按钮(即b2.setOnKeyReleased(enter);
b2.setOnAction(event -> {/* Do something */});)。
当用户在 FileChooser 中按下回车键时,如何防止按钮触发?如果他们没有鼠标,我不希望用户陷入循环。我知道按 Alt+S 也会保存它,但我不能指望所有用户都知道这一点。
编辑:根据现在似乎已被删除的评论中的要求,这是代码的可运行版本:
import java.io.File;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.HBox;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
public class ButtonTest extends Application {
@Override
public void start(Stage stage) throws Exception {
/* EventHandler to be used with multiple buttons */
EventHandler<KeyEvent> enter = event -> {
if (event.getCode() == KeyCode.ENTER && event.getSource() instanceof Button) {
Button src = (Button) event.getSource();
src.fire();
}
event.consume();
};
/* Create a new button */
Button b1 = new Button("Save");
Button b2 = new Button("Print");
/* Add event handlers */
b1.setOnKeyReleased(enter);
b2.setOnKeyReleased(enter);
/* Called by .fire method of save button */
b1.setOnAction(event -> {
/* Create the save dialog box */
FileChooser saveDialog = new FileChooser();
saveDialog.setTitle("Save");
/* Get file */
File f = saveDialog.showSaveDialog(stage);
/* ... do stuff with file ... */
});
/* Called by .fire method of print button */
b2.setOnAction(event -> System.out.println("Pressed"));
Scene scene = new Scene(new HBox(b1, b2));
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch();
}
}
【问题讨论】:
-
我很困惑为什么你会在
onKeyReleased处理程序中调用src.fire()?onAction处理程序已由 enter 键调用(即 enter 键触发按钮)。 -
不适合我。空格键是触发按钮的唯一键。我认为这样做的原因是因为 enter 用于触发使用
btn.setDefaultButton(true);设置的默认按钮 -
我无法重现该问题。如果
Button具有焦点,则按下回车会触发动作事件并显示FileChooser。如果我删除了onKeyReleased处理程序,则FileChooser在通过按回车键关闭它时不会重新出现。 编辑: 我可以使用 Java 8u202 重现该问题,但无法在 OpenJFX 11.0.2 上重现该问题。我正在寻找有关任何更改的错误报告,但我只能找到 1.3 版固定 2.0 的错误报告。 -
您能告诉我您使用的是什么操作系统和 JavaFX 版本吗?因为如果您使用的是 JavaFX 8,我有一个潜在的答案。
-
Windows 7 和 JavaFX 8。感谢您付出如此多的努力来提供帮助。
标签: events button javafx event-handling filechooser