我决定为我创建应用程序。我想在文本字段中设置键盘监听器。在我的简单应用程序中有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);
}
}
我已经意识到。我阅读了其他问题,并在他们的帮助下修复了我的应用。起初,我尝试使用FXMLLoader,但并没有帮助。在我看到这个问题及其response之后。我已经在控制器中添加了“ keyOnPressed”标签及其处理程序。