如何在Javafx应用程序中将正确的KeyboardListener设置到我的TextField中?

问题描述 投票:-1回答:1

我决定为我创建应用程序。我想在文本字段中设置键盘监听器。在我的简单应用程序中有5个窗口,每个人都有处理程序。所有处理程序都不同。但是我什至不能做到其中之一。它向我抛出“线程“ JavaFX应用程序线程”中的异常” java.lang.RuntimeException:java.lang.reflect.InvocationTargetException” ...由以下原因引起:java.lang.NullPointerException,此处引用了我在其中设置侦听器的句子我的文字栏位。我知道如果我创建对象,我将永远不会得到那些例外。我试过了,但是键盘监听器没有用。请帮助我,我不知道我需要做什么!

下面是显示的类,它实现EventHandler

package sample.Storage;
import javafx.event.EventHandler;
import javafx.scene.input.KeyEvent;
import org.apache.commons.collections4.bidimap.DualHashBidiMap;
import sample.Controllers.ControllerStudies;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class StorageElementary implements Storage, EventHandler<KeyEvent> {
    private static DualHashBidiMap<String,String> storage = new DualHashBidiMap<>();
    private static ControllerStudies controllerStudies = new ControllerStudies();

    private List<String> shuffleStorage(){
        List<String> resList = new ArrayList<>(100);
        resList.addAll(storage.keySet());
        Collections.shuffle(resList);
        return resList;
    }



    public void startWork(){
        List<String> keysList = shuffleStorage();

        for (String key: keysList) {
            controllerStudies.getTxtFieldDisabled().setText(key);        //set value, which you need translete
            controlTrue(key);                                       //implement control every character and whole word
            controllerStudies.getTxtFieldDisabled().clear();
            controllerStudies.getTxtFieldForWritten().clear();
        }

    }

    private void controlTrue(String key){
        String value = storage.get(key);        //it's need to get
        //.....
    }

    // just sout for check
    @Override
    public void handle(KeyEvent event) {
        System.out.println(event.getCode().toString());
    }




    static {
        //here new words put into the storage
        storage.put("говорить", "speak");
        storage.put("рассказывать", "tell");
    }


}

带按钮的控制器:

package sample.Controllers;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import sample.Storage.StorageElementary;
import sample.UtilClasses.Helper;

public class ControllerMain {

    private static ControllerStudies controllerStudies = new ControllerStudies();

@FXML
    private Button btnElem;
@FXML
    void elemOnAction(ActionEvent event) {
        Helper.closePreviewAndShowNextWindow(btnElem,"windowStudies.fxml");
        StorageElementary storageElementary = new StorageElementary();
        controllerStudies.getTxtFieldForWritten().setOnKeyPressed(storageElementary);   //mistake in this string!
        storageElementary.startWork();

    }

下面显示的控制器,具有2个文本字段

package sample.Controllers;

import javafx.fxml.FXML;
import javafx.scene.control.TextField;

public class ControllerStudies {

    @FXML
    private TextField txtFieldDisabled;

    @FXML
    private TextField txtFieldForWritten;


    public TextField getTxtFieldDisabled() {
        return txtFieldDisabled;
    }


    public TextField getTxtFieldForWritten() {
        return txtFieldForWritten;
    }

}

[也许有人想看Helper的课程。我留在这里。


import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.io.IOException;

public class Helper {

    public static void open(String text){
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(Helper.class.getResource("/sample/fxmlFiles/"+ text));
        try {
            loader.load();
        } catch (IOException e) {
            e.printStackTrace();
        }
        Parent root = loader.getRoot();
        Stage stage = new Stage();
        stage.setResizable(false);
        stage.setScene(new Scene(root));
        stage.showAndWait();
    }

    public static void closePreviewAndShowNextWindow(Node elem, String text){
        //btnElem.getScene().getWindow().hide();
        if (elem != null) {
            Stage stage = (Stage) elem.getScene().getWindow();
            stage.close();
            open(text);
        }
    }


    // if I want to testing my application
    public static void toConsole(String text){
        System.out.println(text);
    }
}
javafx nullpointerexception textfield keyevent invocationtargetexception
1个回答
0
投票

我已经意识到。我阅读了其他问题,并在他们的帮助下修复了我的应用。起初,我尝试使用FXMLLoader,但并没有帮助。在我看到这个问题及其response之后。我已经在控制器中添加了“ keyOnPressed”标签及其处理程序。

© www.soinside.com 2019 - 2024. All rights reserved.