javaFX 在单击其他节点时不会丢失焦点



我在根窗格的左侧有一个vbox,在根窗格的右侧有一个vbox。 leftvobx 有 3 个文本区域节点,rightvbox 有一个颜色选择器; 我想要:当我在 leftvbox 上选择一个文本区域节点,然后单击 rightvbox 上的颜色选择器时,当前文本区域不会丢失焦点。

我的想法与"场景生成器"相同,当我们在工作区中选择一个注释时,处理正确的幻灯片功能区域(如更改颜色,设置大小和字体),注释不会失去焦点,因此动作知道工作区中的哪个节点需要处理。

法典: VBox leftBox = new VBox(); VBox rightBox = new VBox();

leftBox.setPrefSize(200, 250);
rightBox.setPrefSize(200, 250);
leftBox.setStyle("-fx-background-color:blue");
Button btn1 = new Button("First");
Button btn2 = new Button("Second");
Button btn3 = new Button("Third");
ColorPicker colorpicker = new ColorPicker();
leftBox.getChildren().addAll(btn1,btn2,btn3);
rightBox.getChildren().add(colorpicker);
colorpicker.setOnAction(e->{
if(btn2.isFocused()){
btn2.setText("color changed.");
}
});
HBox root = new HBox();
root.getChildren().addAll(leftBox,rightBox);
Scene scene = new Scene(root, 400, 250);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();

在此处输入图像描述

没有办法让两个节点聚焦 afaik。这将是非常奇怪的,因为每个键盘事件等都会转到两个节点。在JavaFX场景构建器中,您也可以尝试一下。单击场景构建器中的某些内容,然后按删除,它将被删除。在SceneBuilder中按某些内容,然后在右侧按删除键,您首先选择的项目将不会被删除。因为它实际上没有焦点。SceneBuilder只显示您上次选择的内容。

解决您的问题。我会创建一个新的变量Button lastFocused;,并在其他按钮上制作侦听器focusedProperty如下所示:

btn2.focusedProperty().addListener((ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) -> {
if(!newValue) lastFocused = btn2;
});

这应该在按钮失去焦点后立即将它存储在新变量中。由于在对颜色选取器进行焦点设置时它会失去焦点,因此变量将具有在选择拾色器时选择的按钮。

现在在颜色选择器中,这样的东西应该可以工作:

colorpicker.setOnAction(e->{
lastFocused.setText("color changed.");
lastFocused.requestFocus();
});

我还没有实际测试代码。

最新更新