JavaFX Accelerator执行两次

时间:2015-02-03 12:35:52

标签: javafx javafx-8 accelerator

我在我的应用程序中使用Accelerator,当我按下F1键时,它应该只打开一次对话框,但是当我关闭对话框时它会再次出现。 runnable被调用了两次。

有谁知道它可能是什么?这是一个错误吗?我正在使用Macbook开发。

这是我的控制者:

public class Screen1Controller { 

    @FXML
    private TextField txtCode;

    @FXML
    private TableView tblProducts;

    @FXML
    private Button buttonAskUserDecision;

    @FXML 
    public void initialize () {
        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                initializeKeyCombinations();
            }
        });
    }

    @FXML
    private void executePrint (ActionEvent event) {
        System.out.println("ExecutePrint");
    }

    public void initializeKeyCombinations() {
        buttonAskUserDecision.getScene().getAccelerators().clear();

        buttonAskUserDecision.getScene().getAccelerators().put(
            new KeyCodeCombination(KeyCode.F1),
            new Runnable() {
                @Override
                public void run() {
                    System.out.println("Executed F1");
                }
            }
        );
    }
}

这是我的FXML:

<StackPane prefHeight="600.0" prefWidth="800.0" stylesheets="@../../../css/main.css" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Screen1Controller">
<children>
    <BorderPane prefHeight="200.0" prefWidth="200.0">
        <center>
            <ScrollPane fitToHeight="true" fitToWidth="true" BorderPane.alignment="CENTER">
                <content>
                    <VBox alignment="TOP_CENTER">
                        <children>

                            <GridPane hgap="10.0">
                                <columnConstraints>
                                    <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="20.0" />
                                    <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="20.0" />
                                    <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="30.0" />
                                    <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="30.0" />
                                </columnConstraints>
                                <rowConstraints>
                                    <RowConstraints fillHeight="false" minHeight="30.0" vgrow="NEVER" />
                                </rowConstraints>
                                <children>
                                    <TextField fx:id="txtCode" GridPane.columnSpan="2" />
                                </children>
                                <VBox.margin>
                                    <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
                                </VBox.margin>
                            </GridPane>
                            <TableView fx:id="tblProducts" prefHeight="200.0" prefWidth="200.0">
                                <columns>
                                    <TableColumn prefWidth="75.0" text="C1" />
                                    <TableColumn prefWidth="75.0" text="C2" />
                                </columns>
                            </TableView>
                        </children>
                    </VBox>
                </content>
            </ScrollPane>
        </center>
        <bottom>
            <ToolBar maxHeight="80.0" minHeight="80.0" prefHeight="80.0" styleClass="default-skin-pdv-toolbar" stylesheets="@../../../css/main.css">
                <items>
                    <Button fx:id="buttonAskUserDecision" layoutX="10.0" layoutY="20.0" mnemonicParsing="false" onAction="#executePrint" prefHeight="60.0" prefWidth="69.0" styleClass="default-skin-pdv-button">
                    </Button>

                </items>
                <padding>
                    <Insets left="10.0" />
                </padding>
            </ToolBar>
        </bottom>
    </BorderPane>
</children>

在这个屏幕里面,我有一个文本字段,一个tableview和一个带按钮的工具栏。

我做了一些新的测试。每次我专注于我的tableview并点击F1按钮时,执行增加1.例如,如果我点击tableview并点击F1,它会在控制台上打印一次“Executed F1”并且焦点会返回到文本区域,如果我再次将焦点放在tableview上并点击F1,它会在控制台上打印两次文本并将焦点返回到文本字段,如果我第三次将焦点放在tableview上并再次按下F1它在控制台上再打印三行,依此类推。

只有当我使用F1按钮时才会发生..当我用鼠标点击按钮时,它只打印一次。

我从屏幕上删除了TableView,它停止了重复执行。

问题是:我在屏幕上需要这个tableView。这可能会发生什么?

这是我的Java版本详细信息:

java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)

1 个答案:

答案 0 :(得分:0)

问题出在ControlsFX库的一个组件(Dialog)中。

我创建了一个新项目并包含了一个textfield,viewTable和一个按钮。重复没有发生。

当我包含ControlsFX对话框时,开始发生。当我单击按钮时,使用鼠标,对话框只会打开一次。但是当我使用加速器触发按钮时,对话框会打开两次。

<强>编辑: 我创建了自己的对话框,但它又发生了。我没有使用stage.showAndWait()而是尝试了stage.show(),而是停止了两次。 我搜索了stackoverflow并找到了这个答案https://stackoverflow.com/a/22463857/916804 ...当我尝试用Platform.runLater将调用包装到Dialog时,执行只发生一次。