在以下情况下,您能否提供建议? 我有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);
}
});
但不幸的是,这没有用。
我还能做什么? 非常感谢, 罗马
答案 0 :(得分:0)
我已经更改了您使用事件的方式,这不会阻止按钮获取键事件,并且遍历节点的方式通常是使用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); }
}
为什么我认为这不起作用,是因为该事件首先进入滚动窗格,然后从那里传递到按钮,并且当您过滤该事件时,它没有传递该事件。但是,如果没有其他人想阐述或告诉我错了,我没有任何事实可以支持,我将删除此解释
答案 1 :(得分:0)
谢谢。我进行了一些研究,得出的结论是事件到达了按钮,但是某些东西阻止了“焦点功能”,并且焦点不会移至下一个按钮(( 但是,如果我按“制表符”,则焦点会移动!如何通过按箭头键启用移动? 查看我的代码
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);
}
}
有什么想法要解决“焦点问题”吗?