我试图阻止箭头键导航我的示例中的控件。我不知道该怎么做。这是我创建的示例:
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);
}
}
任何帮助将不胜感激 感谢
答案 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()方法的结尾。