Javafx焦点侦听器无法通过鼠标按下事件正常工作

时间:2019-01-29 18:49:09

标签: javafx

当我尝试将焦点侦听器添加到节点时,我得到了错误的打印值

Vbox vb = new Vbox();

for(int i =0; i<10;i++){
Hbox hbox = new hbox(new Label("Number"+i));
vb.getChildren().add(hb);

hbox.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent e) {
                   hbox.requestFocus();

            }

        });
  hbox.focusedProperty().addListener((obs, oldVal, newVal)
                -> System.out.println(newVal ? vb.getChildren().indexOf(hbox) + "Focused" : vb.getChildren().indexOf(hbox) + " Unfocused"));

}

我要打印的内容是单击hbox时使用鼠标按下的事件获取焦点节点和未焦点节点(以前为焦点节点)。这适用于鼠标单击事件和鼠标释放事件。但是获取以前关注的索引需要一些时间。

2 个答案:

答案 0 :(得分:0)

focusreleased之间是有区别的,焦点是当您按下某个节点时,焦点直到您专注于新节点时才变得没有焦点。要获得鼠标释放事件,您需要:

  

onMouseReleasedProperty

它“花费”时间直到您按下新Node并将焦点传递给它(或者关闭程序或按下其他东西...)的时间

我使用TextField可以更好地理解:

  VBox vb = new VBox();
        for(int i =0; i<10;i++){
            TextField hb = new TextField("Number"+i);
            vb.getChildren().add(hb);
            hb.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
                @Override
                public void handle(MouseEvent e) {
                    hb.requestFocus();
                }

            });

            hb.focusedProperty().addListener(new ChangeListener<Boolean>() {
                @Override
                public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
                    System.out.println(newValue ? vb.getChildren().indexOf(hb) + "Focused" : vb.getChildren().indexOf(hb) + " Unfocused");
                }
            });
        }

现在您可以看到:

enter image description here

4具有焦点,焦点将一直保持,直到您按其他操作(焦点一直没有释放)

答案 1 :(得分:0)

这里是如何查看focus属性更改的示例。当使用css单击hbox时,它将设置边框,当不单击焦点时,将删除边框

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        VBox vb = new VBox();

        for(int i =0; i<10;i++){
            HBox hBox = new HBox(new Label("Number"+i));
            hBox.setAlignment(Pos.CENTER);
            vb.getChildren().add(hBox);

            hBox.addEventFilter(MouseEvent.MOUSE_PRESSED, e -> hBox.requestFocus());

            hBox.focusedProperty().addListener((obs, oldVal, newVal) -> {
                System.out.println(newVal ? vb.getChildren().indexOf(hBox) + " Focused" : vb.getChildren().indexOf(hBox) + " Unfocused");
                if(newVal)
                    hBox.setStyle("-fx-border-color: blue;");
                else
                    hBox.setStyle(null);
            });

        }

        Stage stage  = new Stage();
        stage.setScene(new Scene(vb));
        stage.setWidth(100);
        stage.show();
    }

    public static void main(String[] args) { launch(args); }
}