1

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

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);
    }

}

任何帮助将不胜感激谢谢

4

2 回答 2

1

我有一个类似的问题,并找到了一个简单的解决方法。由于导航部分的控件在自行实现的 EventHandler 之后触发,因此您可以通过调用简单地停止 KeyEvent 的任何进一步传播

    keyevent.consume()

在你的 handle() 方法的最后。

于 2019-02-12T17:48:18.987 回答
-1

首先,这个问题的答案类似于这个问题的答案: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 gain focus而不是一个

您执行此操作的方式 - 按键处理程序可能并不总是有效,因为操作也可能发生在按键释放时。

在常见情况下,按键行为在行为类中确定,该行为类可通过皮肤类访问。如果你想改变按键的行为,你可以改变行为类。

于 2013-03-11T13:13:11.220 回答