可编辑的JavaFx ComboBox可以很好地工作,但左箭头键被解释为Shift-TAB。
如您所见,焦点设置为ComboBox,插入点位于其字段的中间。按左箭头键将焦点移动到第一个控件,按下右箭头键时图像左侧的TextField将插入的一个字符按预期向右移动,就像在任何TextField中一样。
如何捕获事件以在可编辑的ComboBox中重现TextField的行为?
我试图通过ComboBox.setOnKeyPressed()和event.consume()抓住关键事件,但没有成功。
这是一个重现这种意外行为的最小程序:
@Override
public void start( Stage stage ) {
stage.setTitle( "Editable ComboBox and left-arrow key" );
ComboBox<String> cmbBx = new ComboBox<>();
cmbBx.getItems().addAll( "A", "B", "C", "D", "E" );
cmbBx.setMinWidth( 150 );
cmbBx.setEditable( true );
cmbBx.setOnKeyPressed( new EventHandler<KeyEvent>(){
@Override public void handle( KeyEvent event ) {
System.err.println( event );
event.consume(); }}); // Consuming left arrow key is inoperant
GridPane grid = new GridPane();
grid.setVgap( 4 );
grid.setHgap( 4 );
grid.setPadding( new Insets( 4, 4, 4, 4 ));
grid.add( new Label( "TextField:" ), 0, 0 );
grid.add( new TextField() , 1, 0 );
grid.add( new Label( "ComboBox:" ) , 2, 0 );
grid.add( cmbBx , 3, 0 );
stage.setScene( new Scene( grid ));
stage.show();
}
答案 0 :(得分:1)
答案是围绕这个SO帖子"key bindings in javafx"中显示的键绑定。
此代码捕获LEFT事件:
cmbBx.addEventFilter( KeyEvent.ANY, new EventHandler< KeyEvent >() {
@Override public void handle(KeyEvent event ) {
if( event.getCode() == KeyCode.LEFT ) {
event.consume(); }}});
就是这样,但我很惊讶因为左箭头键按预期移动了插入点,只删除了不需要的行为。为什么呢?