我正在实现一个cusom组件,用户可以在其中键入TextField
,然后弹出TableView
,然后用户可以在该表中查找项目。
我对KeyEvent
的 standard TextField
类有疑问,例如 Ctrl + A 或 Home 。弹出带有TableView
的窗格后,这些关键事件不再起作用。
我检查了TextField
是否失去了焦点,但没有失去焦点,如果我设置了EventFilter
以查看正在发生的情况,则表明这些事件已触发,但对UI没有影响。甚至弹出窗口的setHideOnescape
也无法正常工作。
这是验证它的简单代码:
fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="textField.Controller">
<TextField fx:id="textField" prefWidth="400"/>
</AnchorPane>
控制器:
public class Controller implements Initializable {
@FXML
private TextField textField;
@Override
public void initialize(URL location,ResourceBundle resources) {
Popup popUp = new Popup();
TableView<Object> table = new TableView<>();
table.prefWidthProperty().bind(textField.widthProperty());
popUp.getcontent().add(table);
popUp.setHideOnescape(true);
popUp.setautoHide(true);
// To see if the KeyEvent is triggered
textField.addEventFilter(KeyEvent.ANY,System.out::println);
textField.setOnKeyTyped(event -> {
if(!popUp.isShowing()){
popUp.show(
textField.getScene().getWindow(),textField.getScene().getWindow().getX()
+ textField.localToScene(0,0).getX()
+ textField.getScene().getX(),textField.getScene().getWindow().getY()
+ textField.localToScene(0,0).getY()
+ textField.getScene().getY()
+ textField.getHeight() - 1);
}
});
}
}
主要:
public class Main extends Application {
public void start(Stage primaryStage) throws Exception {
FXMLLoader loader = new FXMLLoader(getclass().getResource("View.fxml"));
AnchorPane pane = loader.load();
primaryStage.setScene(new Scene(pane,800,600));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
这是控制台输出
KeyEvent [source = TextField[id=textField,styleclass=text-input text-field],target = TextField[id=textField,eventType = KEY_pressed,consumed = false,character =,text = a,code = A]
KeyEvent [source = TextField[id=textField,eventType = KEY_TYPED,character = a,text =,code = UNDEFINED]
KeyEvent [source = TextField[id=textField,eventType = KEY_RELEASED,code = CONTROL,controlDown,shortcutDown]
KeyEvent [source = TextField[id=textField,code = UNDEFINED,code = A,code = CONTROL]
有什么主意,为什么说那些事件没有被消耗掉呢?