javafx - JavaFX 8: 如果场景只有形状,则键盘事件不会被处理

  显示原文与译文双语对照的内容
0 0

在JavaFX场景中设置焦点( 。处理键盘事件) 似乎有一个问题( 比如 ) 。 rectangle 。圆等等因为格式化FXML并不容易,我在博客中描述了问题和解决方法: http://yakovfain.com/2015/02/13/javafx-8-the-keyboard-events-are-not-being-processed-if-a-scene-has-only-shapes/

如果有人能找到更好的解决方案或者解释我应该做什么,我会感激不尽。

谢谢

时间: 原作者:

0 0

我这里可以正常工作。

我的yakov解决方案的唯一改变是在 hack 上移除按钮工作,并在舞台上显示请求焦点。

我认为在yakov实现的原始内容中,包含这些形状的组在时间上没有被显示。 通过确保在请求焦点之前一直等到舞台显示出来,一切都正常。

sample.fxml


<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.Group?>
<?import javafx.scene.shape.Rectangle?>

<Group fx:id="theGroup" onKeyPressed="#keyHandler" focusTraversable="true"
 xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"
 fx:controller="Controller">
 <Rectangle fill="BLUE" height="300.0" stroke="BLACK"
 strokeType="INSIDE" width="300.0"/>
</Group>

Main.java


import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {
 @Override
 public void start(Stage primaryStage) throws Exception {
 FXMLLoader loader = new FXMLLoader();
 loader.setLocation(getClass().getResource("sample.fxml"));
 Parent root = loader.load();

 primaryStage.setScene(new Scene(root, 300, 300));
 primaryStage.show();

 Controller controller = loader.<Controller>getController();
 controller.focus();
 }

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

Controller.java


import javafx.fxml.FXML;
import javafx.scene.Group;
import javafx.scene.input.KeyEvent;

public class Controller {
 @FXML
 private Group theGroup;

 public void keyHandler(KeyEvent event) {
 System.out.println("A Key was pressed");
 }

 public void focus() {
 theGroup.requestFocus();
 }
}

原作者:
...