[英]JavaFX ScrollPane Disable scroll by arrow keys
在這種情況下,請您提供一些建議:我有ScrollPane和GridPane。 在GridPane中,我有很多按鈕。 當我用鼠標集中一個按鈕並嘗試通過箭頭鍵移動焦點時,焦點仍然停留在同一按鈕上,而我只看到ScrollPane滾動。
我如何禁用ScrollPane的箭頭鍵滾動並將該事件發送到我的子按鈕。 我嘗試做一些事情,例如:
ScrollPane sp = new ScrollPane() {
@Override
public void requestFocus(){}
};
sp.addEventFilter(KeyEvent.ANY, (event) -> {
if(event.getCode() == KeyCode.DOWN) {
event.consume();
javafx.event.Event.fireEvent(mainGrid, event);
}
});
但是不幸的是那沒有用。
我還能做什么? 非常感謝,羅馬
我已經更改了您使用事件的方式,這不會阻止按鈕獲取鍵事件,並且遍歷節點的方式通常是使用tab按鈕,但是我不知道您實現了什么。 當焦點在按鈕上時,這將打印出您按下的每個鍵,而無需滾動
public class Main extends Application {
@Override
public void start(Stage stage) {
VBox scrollPaneVbox = new VBox();
Button button = new Button("Button");
button.setOnKeyPressed(event -> System.out.println(event.getCode().toString()));
ScrollPane scrollPane = new ScrollPane(scrollPaneVbox);
scrollPane.setPannable(true);
scrollPane.setPrefSize(150,150);
scrollPane.setOnKeyPressed(event -> {
if(event.getCode() == KeyCode.DOWN || event.getCode() == KeyCode.UP)
event.consume();
});
int i = 0;
while (i++!=21)
scrollPaneVbox.getChildren().add(new Label("Label i:"+i));
scrollPaneVbox.getChildren().add(button);
Scene scene = new Scene(scrollPane, 200,150);
stage = new Stage();
stage.setScene(scene);
stage.showAndWait();
}
public static void main(String[] args) { launch(args); }
}
我認為這不起作用的原因是,該事件首先進入滾動窗格,然后從那里傳遞到按鈕,並且當您過濾該事件時,它不會繼續傳遞該事件。 但是,如果沒有其他人想闡述或告訴我錯了,我沒有事實可以支持,我將刪除此解釋
謝謝。 我進行了一些研究,得出的結論是事件到達了按鈕,但是某些東西阻止了“焦點功能”,並且焦點不會移至下一個按鈕((但是,如果我按“ tab”鍵,則焦點會移動!如何通過按箭頭鍵啟用移動?看我的代碼
package testjavafxscrollpane;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ScrollPane;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class TestJavaFXScrollPane extends Application {
@Override
public void start(Stage primaryStage) {
Button btn0 = new Button("Btn0");
btn0.setOnKeyPressed((event) -> {
System.out.println("btn.KeyPressed; Code: " + event.getCode());
});
Button btn1 = new Button("Btn1");
Button btn2 = new Button("Btn2");
Button btn3 = new Button("Btn3");
VBox root = new VBox();
root.getChildren().addAll(btn0, btn1, btn2, btn3);
ScrollPane scrollPane = new ScrollPane(root);
scrollPane.setOnKeyPressed(event -> {
//if(event.getCode() == KeyCode.DOWN || event.getCode() == KeyCode.UP)
//event.consume();
});
Scene scene = new Scene(scrollPane, 100, 80);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}
有什么想法要解決“焦點問題”嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.