当我尝试将焦点侦听器添加到节点时,我得到了错误的打印值
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时使用鼠标按下的事件获取焦点节点和未焦点节点(以前为焦点节点)。这适用于鼠标单击事件和鼠标释放事件。但是获取以前关注的索引需要一些时间。
答案 0 :(得分:0)
focus
和released
之间是有区别的,焦点是当您按下某个节点时,焦点直到您专注于新节点时才变得没有焦点。要获得鼠标释放事件,您需要:
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");
}
});
}
现在您可以看到:
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); }
}