Слушатель фокуса Javafx не работает должным образом с нажатым событием мыши - PullRequest
0 голосов
/ 29 января 2019

Я получаю неправильные значения при печати, когда я пытаюсь добавить слушателя фокуса к узлу

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 голосов
/ 29 января 2019

Вот пример того, как вы можете видеть изменение свойства фокуса.Если щелкнуть hbox с помощью css, он установит границу, а когда он не сфокусирован, он уберет границу

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); }
}
0 голосов
/ 29 января 2019

Существует разница между focus и released, фокусировка происходит при нажатии на узел, и он не фокусируется, пока вы не сфокусируетесь на новом узле.чтобы получить выпущенное событие мыши, вам нужно:

onMouseReleasedProperty

время, которое «занимает» его, пока вы не нажмете на новый узел и не передадите фокус на него (или не закроетезапрограммировать или нажать на другие вещи ...)

Я использую 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 с фокусировкой, и фокус останется, пока вы не нажмете на другие вещи (фокус не был отпущен)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...