【问题标题】:javafx don't loss the focus when click other nodejavafx单击其他节点时不会失去焦点
【发布时间】:2017-09-12 15:24:15
【问题描述】:

我在 rootpane 左侧有一个 vbox,在 rootpane 右侧有一个 vbox。 leftvobx 有 3 个 textarea 节点,rightvbox 有一个颜色选择器; 我想要:当我在leftvbox上选择一个textarea节点,然后点击rightvbox上的colorpicker时,当前的textarea不会失去焦点。

我的想法和“场景生成器”一样,当我们在工作区中选择一个笔记,然后处理右边的滑动功能区(比如改变颜色,设置大小和字体),笔记不会失去焦点,所以action 知道工作区中的哪个节点需要处理。

代码: 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();

enter image description here

【问题讨论】:

    标签: java javafx


    【解决方案1】:

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

    解决您的问题。我会创建一个新变量 Button lastFocused; 并在其他按钮上创建监听器 focusedProperty 是这样的:

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

    这应该在按钮失去焦点后立即将其存储在新变量中。当您聚焦颜色选择器时它会失去焦点,因此该变量将具有选择颜色选择器时选择的 Button。

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

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

    我还没有实际测试过代码。

    【讨论】:

    • 也许我描述错了。场景构建器有 3 个部分,左侧部分用于选择容器、控件、菜单等。中间部分是主要工作区,右边部分是设置属性和布局和核心。所以当我们在Scene builder的中段选择一个节点,然后在Scene builder的右边功能区设置布局和属性时,节点并没有失去焦点。想想这个,如果节点失去焦点,在正确的区域,
    • @A.Sheh 我认为您的描述是正确的。但是,节点仍然失去了实际焦点。它只是看起来它有焦点。你可以通过造型来做到这一点。它具有焦点的外观只不过是按钮的样式。但实际焦点意味着它接收键盘输入,并且在 Scenebuilder 中,中心的节点没有接收到我的回答中描述的键盘输入。
    • 那么我怎样才能实现这个功能。当我在左窗格中选择一个节点并在另一个右窗格中设置其样式(如颜色、大小、字体)时,我希望做同样的事情。但是,当我设置样式时,它需要知道设置了哪个节点。
    • 变量 lastFocused 将包含在您转到颜色选择器之前在左窗格中选择的按钮。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多