【发布时间】:2019-01-08 09:28:12
【问题描述】:
我正在使用 Scene Builder 制作 JavaFX 应用程序。我有用主窗口启动控制器的主类。
我在 Controller 类中有一个标签
我需要在主窗口中分配键盘按键。
示例:如果我在键盘上按“1”,则标签的文本应设置为“按下键 1。
如果我在键盘上按“2”,则文本应设置为“按下键 2”
我该怎么做?
我尝试在初始化方法中使用此代码,但没有任何反应:
category1.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent ke) {
KeyCode kc = ke.getCode();
if((kc.equals(KeyCode.D))) {
category1.setText("Key D is pressed");
}
}
});
主类: 包src.card;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.input.*;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
public class Main extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
try {
Parent root = FXMLLoader.load(getClass().getResource("resources/fxml/card.fxml"));
Scene scene = new Scene(root, 1600, 600);
primaryStage.setScene(scene);
scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm());
primaryStage.initStyle(StageStyle.UNDECORATED);
primaryStage.setMaximized(true);
primaryStage.setResizable(true);
primaryStage.getIcons().add(new Image("src/card/resources/logo-icon.png"));
primaryStage.show();
//adding resize and drag primary stage
ResizeHelper.addResizeListener(primaryStage);
//assign ALT+ENTER to maximize window
final KeyCombination kb = new KeyCodeCombination(KeyCode.ENTER, KeyCombination.CONTROL_DOWN);
scene.addEventHandler(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
if (kb.match(event)) {
primaryStage.setMaximized(!primaryStage.isMaximized());
primaryStage.setResizable(true);
Controller cont = Context.getInstance().getController();
if (!primaryStage.isMaximized()) {
cont.getBtnFont().setPrefWidth(20);
cont.getBtnPalette().setPrefWidth(20);
cont.getBtnQuestCards().setPrefWidth(20);
cont.getBtnNonQuestCards().setPrefWidth(20);
} else if (primaryStage.isMaximized()){
cont.getBtnFont().setPrefWidth(50);
cont.getBtnPalette().setPrefWidth(50);
cont.getBtnQuestCards().setPrefWidth(50);
cont.getBtnNonQuestCards().setPrefWidth(50
);
}
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
控制器:
@FXML private Label category1
@FXML public void initialize(URL location, ResourceBundle resources) {
category1.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent ke) {
KeyCode kc = ke.getCode();
if((kc.equals(KeyCode.D))) {
category1.setText("Key D is pressed");
}
}
});
//register Controller in Context Class
Context.getInstance().setController(this);
}
编辑:
我尝试在初始化方法中使用它:
category1.getScene().setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent ke) {
KeyCode kc = ke.getCode();
if((kc.equals(KeyCode.D))) {
category1.setText("Key D is pressed");
}
}
});
我得到了错误:
javafx.fxml.LoadException:
/D:/IDEA%20Projects/CategoryCards/out/production/CategoryCards/src/card/resources/fxml/card.fxml
at javafx.fxml/javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2625)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2603)
如果我从 category1 中删除 getScene() - 一切正常,应用程序启动
似乎当我使用getScene() 时,它会尝试从外部文件夹而不是我的主文件夹中获取 fxml 文件,但我该如何解决这个问题?
【问题讨论】:
-
我不认为设置标签文本是这里的问题。我觉得有一个带有按键事件的标签。我的猜测是您应该将按键侦听器添加到场景而不是标签中。
-
@Link64 如何在控制器中执行此操作?场景在 Main 类中初始化。我应该在 Main 中用按键编写代码吗?
-
@kentforth 您可以使用
Node#getScene()方法从属于的任何节点检索场景,那么在您的情况下,它可能是category1.getScene()。 -
@Pagbo 你能检查我上次的编辑吗?
-
你有一个
NullPointerException,因为你加载了你的FXML,然后在将它添加到场景之前执行你的initialize方法,然后category1.getScene()在你的初始化方法中是null。跨度>
标签: java javafx scenebuilder