微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从另一个类调用时无法向 ComboBox 调用添加项,ComboBox 的 getter 返回 null

如何解决从另一个类调用时无法向 ComboBox 调用添加项,ComboBox 的 getter 返回 null

从这里展开:Cannot invoke "javafx.scene.control.ComboBox.getItems()" because the return value of "Controller.getMyBox()" is null

我未实现的目标:用户从 DatePicker 中选择日期后,该日期将作为选项转发到 ComboBox

示例.fxml

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

<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.control.DatePicker?>
<?import javafx.scene.layout.borderpane?>

<borderpane prefheight="259.0" prefWidth="351.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Controller">
   <center>
      <ComboBox fx:id="myBox" prefWidth="150.0" borderpane.alignment="CENTER" />
   </center>
   <bottom>
      <DatePicker fx:id="myDatePicker" onAction="#getDatePicked" borderpane.alignment="CENTER" />
   </bottom>
</borderpane>

Controller.java

public class Controller {
    @FXML
//  private SearchableComboBox<String> myBox;
//
//  public SearchableComboBox<String> getMyBox() {
//      return myBox;
//  }
    private DatePicker myDatePicker;

    public DatePicker getMyDatePicker() {
        return myDatePicker;
    }

    private ComboBox<String> myBox;

    public ComboBox<String> getMyBox() {
        return myBox;
    }

    public void initialize() {
//      ObservableList<String> defaultTicker = FXCollections.observableArrayList("Something");
//      myBox.getItems().addAll(defaultTicker);
    }

    private LocalDate datePicked;

    public LocalDate getDatePickedAction(ActionEvent event) {
        return getDatePicked();
    }

    public LocalDate getDatePicked() {
        return datePicked;
    }

    public void setDatePicked(DatePicker myDatePicker) {
        this.datePicked = myDatePicker.getValue();
    }

}

UserInterface.java

public class UserInterface extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("Sample.fxml"));
            Parent root = loader.load();
            Controller controller = loader.getController();

            primaryStage.setTitle("Title");
            primaryStage.setScene(new Scene(root));
            primaryStage.show();

//          ObservableList<String> toAdd = FXCollections.observableArrayList("a","b","c");
//          controller.getMyBox().getItems().addAll(toAdd);

            controller.getMyDatePicker().setonAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    controller.setDatePicked(controller.getMyDatePicker());
                    System.out.println(controller.getDatePicked());

                }
            });
            List<String> addStuff = new ArrayList<String>();
            addStuff.add(controller.getDatePicked().toString());
            controller.getMyBox().getItems().addAll(addStuff);
        } catch (Exception e) {
            e.printstacktrace();
        }
    }

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

从这里开始,有两种情况:

  1. 如果在类控制器中:
public void initialize() {
        ObservableList<String> defaultTicker = FXCollections.observableArrayList("Something");
        myBox.getItems().addAll(defaultTicker);
    }

错误输出

javafx.fxml.LoadException: 
/D:/Eclipse_stuff/projects/BTL-OOP-20201/Test%20ComboBox/bin/Sample.fxml

    at javafx.fxml/javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2707)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2677)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
    at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2517)
    at UserInterface.start(UserInterface.java:17)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
    at javafx.graphics/com.sun.glass.ui.invokelaterdispatcher$Future.run(invokelaterdispatcher.java:96)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    at java.base/java.lang.Thread.run(Thread.java:832)
Caused by: java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at com.sun.javafx.reflect.Trampoline.invoke(MethodUtil.java:76)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at javafx.base/com.sun.javafx.reflect.MethodUtil.invoke(MethodUtil.java:273)
    at javafx.fxml/com.sun.javafx.fxml.MethodHelper.invoke(MethodHelper.java:83)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2673)
    ... 12 more
Caused by: java.lang.NullPointerException: Cannot invoke "javafx.scene.control.ComboBox.getItems()" because "this.myBox" is null
    at Controller.initialize(Controller.java:31)
    ... 24 more
  1. 如果保留上面写的代码。 (初始化()为空)

伴随着错误输出,界面显示正常,可以选择日期。

当我尝试将 ComBoBox 设置为在选择日期后调用时,显示相同的输出

java.lang.NullPointerException: Cannot invoke "java.time.LocalDate.toString()" because the return value of "Controller.getDatePicked()" is null
    at UserInterface.start(UserInterface.java:36)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
    at javafx.graphics/com.sun.glass.ui.invokelaterdispatcher$Future.run(invokelaterdispatcher.java:96)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    at java.base/java.lang.Thread.run(Thread.java:832)

好吧,先谢谢了,如果有人可以帮助我。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。