如何停止箭头键导航控件

时间:2013-03-11 12:43:25

标签: java javafx-2

我试图阻止箭头键导航我的示例中的控件。我不知道该怎么做。这是我创建的示例:

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.FlowPane;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class KeyEventTest extends Application{

    private EventHandler<KeyEvent> keyEventHandler;

    @Override
    public void start(Stage stage) throws Exception {
        // TODO Auto-generated method stub
        Group root = new Group();
        FlowPane f = new FlowPane();
        Button r = new Button("button1");
        Button r2 = new Button("button1");
        Button r3 = new Button("button1");
        f.getChildren().addAll(r,r2,r3);
        root.getChildren().add(f);
        Scene scene = new Scene(root,600,600);
        keyEventHandler = new EventHandler<KeyEvent>() {
            public void handle(final KeyEvent keyEvent) {
                if (keyEvent.getCode() == KeyCode.LEFT || keyEvent.getCode() == KeyCode.UP) {
                    System.out.println("arrow keys");
                }else{
                    System.out.println(keyEvent);
                }
            }
        };
        stage.addEventHandler(KeyEvent.KEY_PRESSED, keyEventHandler);


        stage.setScene(scene);
        stage.show();
    }

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

}

任何帮助将不胜感激 感谢

2 个答案:

答案 0 :(得分:0)

首先,这个问题的答案类似于这个问题的答案:JavaFX: How to change the focus traversal policy?

您可以更改遍历策略,以便在某些情况下不会执行遍历。

另一个决定 - 添加聚焦属性的监听器,并在不希望的情况下放回焦点(但它适用于所有导航键):

node.focusedProperty().addListener(new ChangeListener<Boolean>(){
            public void changed(ObservableValue<? extends Boolean> ov, Boolean t, Boolean t1) {
                Platform.runLater(new Runnable(){
                    public void run() {
                        node.requestFocus();
                    }
                });                    
            }
        });

您应该使用runLater,因为这样的问题:JavaFx: After dialog, two textfields gains focus instead one

如何执行此操作 - 按键处理程序可能无法正常工作,因为操作也可能在键释放时发生。

在一般情况下,按键上的行为是在行为类中确定的,可以通过外观类访问。如果要更改按键的行为,可以更改行为类。

答案 1 :(得分:0)

我遇到了类似的问题,发现了一个简单的解决方法。由于导航部件的控件在自我实现的EventHandler之后触发,因此您可以通过调用

来停止KeyEvent的任何进一步传播
    keyevent.consume()

handle()方法的结尾。