首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在JavaFX应用程序中将文本设置为键盘键上的标签?

如何在JavaFX应用程序中将文本设置为键盘键上的标签?
EN

Stack Overflow用户
提问于 2019-01-08 01:28:12
回答 1查看 1.4K关注 0票数 0

我正在使用场景生成器制作JavaFX应用程序。我有主类启动控制器与主窗口。

我在Controller类中有一个标签

我需要分配键盘键按在主窗口。

如果我按键盘上的“1”键,标签的文本应该设置为“键1按下”。

如果我按键盘上的"2“,文本应该设置为”键2按下“。

,我该怎么做?

我尝试在初始化方法中使用此代码,但没有发生任何事情:

代码语言:javascript
运行
AI代码解释
复制
  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;

代码语言:javascript
运行
AI代码解释
复制
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();
    }

  }

}

控制器:

代码语言:javascript
运行
AI代码解释
复制
@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);
  }

编辑:

我尝试在初始化方法中使用它:

代码语言:javascript
运行
AI代码解释
复制
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");
        }
      }
    });

我犯了错误:

代码语言:javascript
运行
AI代码解释
复制
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)

如果我将getScene()从category1中删除--一切都很顺利,应用程序也启动了。

当我使用getScene()时,它似乎试图从外部文件夹(而不是我的主文件夹)获取fxml文件,但是如何修复这个问题呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-08 04:53:32

您可以通过将键按事件(setOnKeyPressed)设置为Label的父级而不是Scene来实现。尝试向Scene添加事件将导致错误,因为在创建initialize之前将调用Scene

假设您有名为sample.fxml的FXML文件,在该文件中,GridPane有id rootLabel有id category1

代码语言:javascript
运行
AI代码解释
复制
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.GridPane?>
<GridPane fx:controller="Controller"
          xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10" fx:id="root">
    <Label text="Category" fx:id="category1"/>
</GridPane>

您有一个名为Controller的Controller类。要在按下任何键时更改category1的标签,首先必须通过调用category1上的setFocusTraversable方法并传递true来设置可遍历的category1焦点。然后必须在root(category1的父级)上添加键按事件,如下所示

代码语言:javascript
运行
AI代码解释
复制
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.GridPane;
import java.net.URL;
import java.util.ResourceBundle;

public class Controller implements Initializable{
    
    @FXML private Label category1;
    @FXML private GridPane root;
    
    @Override
    public void initialize(URL location, ResourceBundle resources){
        category1.setFocusTraversable(true);
        root.setOnKeyPressed(this::handle);
    }
    
    private void handle(KeyEvent keyEvent){
        category1.setText("Key " + keyEvent.getCode().getName() + " is pressed");
    }
    
}

下面是Main类的简单版本

代码语言:javascript
运行
AI代码解释
复制
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{
    
    public static void main(String[] args){
        launch(args);
    }
    
    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        Scene scene = new Scene(root, 300, 275);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54088768

复制
相关文章

相似问题

领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文