JavaFX 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>

Внутри этого экрана у меня есть текстовое поле, табличное представление и панель инструментов с кнопкой.

Я сделал несколько новых тестов. Каждый раз, когда я сосредотачиваюсь на своем табличном виде и нажимаю кнопку F1, выполнение увеличивается на 1. Например, если я нажимаю на табличное представление и нажимаю F1, на консоли выводится "Executed F1" только один раз, и фокус возвращается назад. в текстовое поле, если я снова фокусируюсь на табличном виде и нажимаю клавишу F1, он дважды печатает текст на консоли и возвращает фокус на текстовое поле, а если я в третий раз фокусируюсь на табличном виде и снова нажимаю клавишу 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 ответ

Проблема была в компоненте (диалоге) из библиотеки ControlsFX.

Я создал новый проект и включил текстовое поле, viewTable и кнопку. Дублирования не произошло.

Когда я включил диалог ControlsFX, это начало происходить. Когда я нажимаю кнопку, с помощью мыши, диалог открывается только один раз. Но когда я использую ускоритель для запуска кнопки, диалог открывается дважды.

Отредактировано: я создал свой собственный диалог, но это случилось снова. Вместо использования stage.showAndWait() Я попробовал stage.show() и он остановился, чтобы открыть дважды. Я искал stackru и нашел этот ответ /questions/40830465/ispolzovanie-showandwait-v-onfinished-eventhandler-animatsii-ne-rabotaet/40830475#40830475... Когда я попытался обернуть вызов в диалог с помощью Platform.runLater казнь произошла только один раз.

Другие вопросы по тегам