当前位置: 首页 > 知识库问答 >
问题:

如何为按钮添加javafx快捷组合键

闻人昕
2023-03-14
 <Button fx:id="addButton" alignment="CENTER" minWidth="-Infinity" mnemonicParsing="false" onAction="#addAction" prefHeight="31.0" prefWidth="130.0"  text="Add"  HBox.hgrow="ALWAYS" />
@FXML
private Button addButton;
    public void addAction(ActionEvent event) throws SQLException, ClassNotFoundException {
    if (validateInput()) {
        String productName = productField.getText();
        double unitPrice = Double.parseDouble(priceField.getText());
        int quantity = Integer.parseInt(quantityField.getText());
        double total = unitPrice * quantity;
        ITEMLIST.add(new Item(productName, unitPrice, quantity, total));
        calculation();
        resetAdd();
        productTableView.getSelectionModel().clearSelection();
        ObservableList<Product> productsData = ProductDAO.searchProducts();
        populateProducts(productsData);
        searchField.setText("");
    }
}
@FXML
private void initialize() throws SQLException, ClassNotFoundException, IOException {
  setSaveAccelerator(addButton);
}
    private void setSaveAccelerator(final Button button) {
    Scene scene = button.getScene();
    if (scene == null) {
        throw new IllegalArgumentException("setSaveAccelerator must be called when a button is attached to a scene");
    }

    scene.getAccelerators().put(
            new KeyCodeCombination(KeyCode.S, KeyCombination.SHORTCUT_DOWN),
            new Runnable() {
                @FXML public void run() {
                    button.fire();
                }
            }
    );
}

共有1个答案

顾英发
2023-03-14

SetSaveAccelerator方法中,不是直接调用AddAction(ActionEvent event),而是指示按钮将其事件激发到其侦听器,例如:button.fire()。例如:

    private void setSaveAccelerator(Button button) {
        if(button==null) {
            System.out.println("Button is null! "); // check that the button was injected properly through your fxml
        }
        Scene scene = button.getScene();
        if (scene == null) {
            throw new IllegalArgumentException("setSaveAccelerator must be called when a button is attached to a scene");
        }

       scene.getAccelerators().put(
            new KeyCodeCombination(KeyCode.S, KeyCombination.SHORTCUT_DOWN),
            new Runnable() {
                @FXML public void run() {

                    button.fire();
                }
            }
       );
   }

编辑

也要避免IllegalArgumentException,必须在按钮附加到场景后附加加速器。我通过在控制器中创建一个公共方法来实现这一点,以便在场景设置完成后附加加速器。然后,在加载场景的类中,可以调用控制器的方法来设置此功能。参见下面的示例:

public void setup() {
    setSaveAccelerator(button);
}
    FXMLLoader loader = new FXMLLoader(MainController.class.getResource("mainFXML.fxml"));
    AnchorPane page = (AnchorPane) loader.load();

    MainController controller = loader.getController();

    Scene scene = new Scene(page);

    controller.setup(); // calls the setup method attaching the accelerators

主类:

public class Main extends Application{

    public static Stage primaryStage;

    @Override
    public void start(Stage primaryStage) throws Exception {
        Main.primaryStage=primaryStage;

        FXMLLoader loader = new FXMLLoader(MainController.class.getResource("mainFXML.fxml"));
        AnchorPane page = (AnchorPane) loader.load();

        MainController controller = loader.getController();

        Scene scene = new Scene(page);

        primaryStage.setTitle("Shortcut example");
        primaryStage.setScene(scene);

        controller.setup();

        primaryStage.show();

    }

    public static void main(String[] args) {

        launch(args);
    }
}

主控制器:

public class MainController {

    @FXML
    private ResourceBundle resources;

    @FXML
    private URL location;

    @FXML
    private Button button;

    @FXML
    private AnchorPane rootPane;

    @FXML
    private TextArea textarea;

    @FXML
    void action(ActionEvent event) {

        textarea.setText("Action fired!!");
    }

    @FXML
    void initialize() {
        assert button != null : "fx:id=\"button\" was not injected: check your FXML file 'MainFXML.fxml'.";
        assert rootPane != null : "fx:id=\"rootPane\" was not injected: check your FXML file 'MainFXML.fxml'.";
        assert textarea != null : "fx:id=\"textarea\" was not injected: check your FXML file 'MainFXML.fxml'.";

    }

    public void setup() {
        setSaveAccelerator(button);
    }


    private void setSaveAccelerator(Button button) {
        if(button==null) {
            System.out.println("Button null!!");
        }
        Scene scene = button.getScene();
        if (scene == null) {
            throw new IllegalArgumentException("setSaveAccelerator must be called when a button is attached to a scene");
        }

        scene.getAccelerators().put(
                new KeyCodeCombination(KeyCode.S, KeyCombination.SHORTCUT_DOWN),
                new Runnable() {
                    @FXML public void run() {

                        button.fire();
                    }
                }
                );
    }
}

mainfxml.fxml

<AnchorPane fx:id="rootPane" prefHeight="408.0" prefWidth="330.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.MainController">
   <children>
      <Button fx:id="button" layoutX="139.0" layoutY="350.0" mnemonicParsing="false" onAction="#action" text="Button" />
      <TextArea fx:id="textarea" layoutX="73.0" layoutY="38.0" prefHeight="200.0" prefWidth="200.0" />
   </children>
</AnchorPane>
 类似资料:
  • 新用户:从一月份开始学习Java,现在我正在使用NetBeans,如果我写这个简单的快捷方式,我会得到大量的错误。 所以IDE只是告诉我,我几乎做错了一切。在setOnKeyPressed的线路上,我得到了 我导入了所有内容,并从StackOverflow.com上的另一个问题(可能是有效的)中复制了这段代码。我只想按“esc”,并在root被聚焦的情况下关闭我的primarystage(不管是不

  • 如何在同一个字母中设置助记符解析。在我的项目中,在button中设置助记符,但button<code>setText</code>在每个事件操作中都会发生变化,但在<code>_o</code>中助记符是相同的,但短键只在一个事件中起作用。如何解决这个问题 抱歉,我的< code >英语

  • 如何将ESC键分配给ButtonType.Cancel? 谢了。

  • 问题内容: 我有一个jButton,我想为其指定一个快捷方式。就像我按键盘上的Delete键一样,它只需单击一次jButton。我怎样才能做到这一点? 问题答案: 您需要创建一个供按钮使用的。然后,可以使用,并且可以将绑定到。 阅读Swing教程。有以下部分: 如何使用动作 如何使用键绑定 例如:

  • 在这里您可以输入新建快捷方式的参数,它将被自解压程序在解压后创建。这个对话框包含下列区域: 创建到哪里 选择您希望创建快捷方式的位置。 源文件名 被压缩的文件名。 目标文件夹 创建快捷方式的文件夹,如果它不存在,它将被自解压文件创建。 快捷方式描述 描述快捷方式的文本。 快捷方式名 是由自解压程序创建的 .lnk (快捷方式)文件的文件名。 快捷方式图标 快捷方式关联的图标文件名称。如果保留空白,

  • 我在Google和Stackoverflow上搜索过这个,但我只是没有得到给定的示例。有人能给我解释一下吗? 我想在表视图的最后一列添加一个按钮,当它被单击时,它应该触发一个侦听器并传递buttons行的对象。我只是没有从gist中得到下面的例子。github。通用域名格式: 这是我的完整当前代码: 现在,我必须创建一个的部分是可以理解的。但是如何将其分配给列呢? 我明白这一点: 但不是这个: