JavaFX 加速器执行两次
JavaFX Accelerator execute twice
我在我的应用程序中使用加速器,当我按下 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 上并按下 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)
问题出在 ControlsFX 库的组件(对话框)中。
我创建了一个新项目,其中包含一个文本字段、viewTable 和一个按钮。复制没有发生。
当我包含 ControlsFX 对话框时,事情就开始了。当我用鼠标单击按钮时,对话框只打开一次。但是当我使用加速器触发按钮时,对话框会打开两次。
已编辑:
我创建了自己的对话框,但它又发生了。我没有使用 stage.showAndWait()
,而是尝试了 stage.show()
,但它停止打开了两次。
我搜索了计算器并找到了这个答案 ...当我试图用 Platform.runLater
包装对对话框的调用时,执行只发生了一次。
我在我的应用程序中使用加速器,当我按下 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 上并按下 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)
问题出在 ControlsFX 库的组件(对话框)中。
我创建了一个新项目,其中包含一个文本字段、viewTable 和一个按钮。复制没有发生。
当我包含 ControlsFX 对话框时,事情就开始了。当我用鼠标单击按钮时,对话框只打开一次。但是当我使用加速器触发按钮时,对话框会打开两次。
已编辑:
我创建了自己的对话框,但它又发生了。我没有使用 stage.showAndWait()
,而是尝试了 stage.show()
,但它停止打开了两次。
我搜索了计算器并找到了这个答案 ...当我试图用 Platform.runLater
包装对对话框的调用时,执行只发生了一次。