向组合框添加值
Adding values to Combobox
我想在我的组合框中添加 2 个值。我用场景生成器添加了这个组合框。我使用了一种方法来做到这一点,但只是得到一个空的组合框。
@FXML
private ComboBox<String> taal;
@FXML
public void comboItems(){
// ObservableList<String> list = FXCollections.observableArrayList("Nederlands","Engels");
// taal = new ComboBox<>();
// taal.setItems(list);
taal = new ComboBox<>();
taal.getItems().addAll("Nederlands","Frans");
System.out.println(taal.getItems());
System.out.println("combobox");
}
如您所见,我尝试了两种不同的方法。我通过 system.out.println 获得了 console.log 上的所有内容,但是当我 运行 项目时仍然得到一个空的组合框。
这是我初始化它的地方:
public class Main extends Application {
private static Controller controller = new Controller();
@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("student.fxml"));
primaryStage.setTitle("Studenten");
primaryStage.setScene(new Scene(root, 1200, 800));
root.getStylesheets().add("student.css");
primaryStage.show();
}
public static void main(String[] args) {
StudentIO.open();
controller.comboItems();//that combobox is inside a class which is called controller.
launch(args);
}
}
您在处理 FXML 时犯了几个初学者的错误。
首先,如果您已经在 FXML 中定义了 ComboBox
,那么您不需要使用 new ComboBox()
创建一个新的。当您在控制器中声明该字段并使用 @FXML
注释对其进行注释时,JavaFX 将在称为“注入”的过程中为您创建一个新的 ComboBox
实例。
本质上,JavaFX 正在获取您在 FXML 中定义的 ComboBox
并将其“注入”到您的控制器中,创建您可以在代码中引用的 Java 对象。
在您的行 taal = new ComboBox<>();
中,您告诉 Java 将 taal
变量设置为全新的 ComboBox
,这与您不同从您的 FXML 布局显示。
当您向 taal
添加项目时,您 是 向 taal
添加项目,但这不是 ComboBox
你在屏幕上看到;您不再参考那个特定的 ComboBox
.
正如 kleopatra 在她的评论中提到的,下一个问题是您正在创建一个新的 Controller
但您的 FXML 布局对此一无所知,因此它实际上并没有“控制”您的布局全部.
有两种可能的方法来解决这个问题,具体取决于您如何定义控制器与 FXML 文档的关系。
方法一:控制器定义为fx:controller
如果您在 FXML 文档中定义了控制器,那么 JavaFX 将为您建立连接。但是,与 ComboBox
一样,您正在用 Java 代码中的新实例替换由 JavaFX 实例化的 Controller
。
相反,您应该在 Main
:
中创建对控制器的引用
private Controller;
然后更新您的 start()
方法,将控制器设置为由 FXMLLoader
:
加载的 FXML 中定义的控制器
@Override
public void start(Stage primaryStage) throws Exception{
FXMLLoader loader = new FXMLLoader(getClass().getResource("student.fxml"));
Scene scene = new Scene(loader.load());
scene.getStylesheets().add("student.css");
// Here you get a reference to the controller from the FXMLLoader
controller = loader.getController();
primaryStage.setTitle("Studenten");
primaryStage.setScene(scene, 1200, 800));
primaryStage.show();
}
方法二:FXML中没有定义控制器
如果您不在 FXML 文档中使用 fx:controller
,您只需在 start()
方法中为 FXMLLoader 设置控制器即可。不要调用 loader.getController()
方法,而是使用 setter 方法:
loader.setController(controller);
当然,如果您正在使用此方法(并希望以后引用控制器),您将需要先实例化Controller
,这样您将使用原始代码中的行:
private Controller controller = new Controller();
我想在我的组合框中添加 2 个值。我用场景生成器添加了这个组合框。我使用了一种方法来做到这一点,但只是得到一个空的组合框。
@FXML
private ComboBox<String> taal;
@FXML
public void comboItems(){
// ObservableList<String> list = FXCollections.observableArrayList("Nederlands","Engels");
// taal = new ComboBox<>();
// taal.setItems(list);
taal = new ComboBox<>();
taal.getItems().addAll("Nederlands","Frans");
System.out.println(taal.getItems());
System.out.println("combobox");
}
如您所见,我尝试了两种不同的方法。我通过 system.out.println 获得了 console.log 上的所有内容,但是当我 运行 项目时仍然得到一个空的组合框。
这是我初始化它的地方:
public class Main extends Application {
private static Controller controller = new Controller();
@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("student.fxml"));
primaryStage.setTitle("Studenten");
primaryStage.setScene(new Scene(root, 1200, 800));
root.getStylesheets().add("student.css");
primaryStage.show();
}
public static void main(String[] args) {
StudentIO.open();
controller.comboItems();//that combobox is inside a class which is called controller.
launch(args);
}
}
您在处理 FXML 时犯了几个初学者的错误。
首先,如果您已经在 FXML 中定义了 ComboBox
,那么您不需要使用 new ComboBox()
创建一个新的。当您在控制器中声明该字段并使用 @FXML
注释对其进行注释时,JavaFX 将在称为“注入”的过程中为您创建一个新的 ComboBox
实例。
本质上,JavaFX 正在获取您在 FXML 中定义的 ComboBox
并将其“注入”到您的控制器中,创建您可以在代码中引用的 Java 对象。
在您的行 taal = new ComboBox<>();
中,您告诉 Java 将 taal
变量设置为全新的 ComboBox
,这与您不同从您的 FXML 布局显示。
当您向 taal
添加项目时,您 是 向 taal
添加项目,但这不是 ComboBox
你在屏幕上看到;您不再参考那个特定的 ComboBox
.
正如 kleopatra 在她的评论中提到的,下一个问题是您正在创建一个新的 Controller
但您的 FXML 布局对此一无所知,因此它实际上并没有“控制”您的布局全部.
有两种可能的方法来解决这个问题,具体取决于您如何定义控制器与 FXML 文档的关系。
方法一:控制器定义为fx:controller
如果您在 FXML 文档中定义了控制器,那么 JavaFX 将为您建立连接。但是,与 ComboBox
一样,您正在用 Java 代码中的新实例替换由 JavaFX 实例化的 Controller
。
相反,您应该在 Main
:
private Controller;
然后更新您的 start()
方法,将控制器设置为由 FXMLLoader
:
@Override
public void start(Stage primaryStage) throws Exception{
FXMLLoader loader = new FXMLLoader(getClass().getResource("student.fxml"));
Scene scene = new Scene(loader.load());
scene.getStylesheets().add("student.css");
// Here you get a reference to the controller from the FXMLLoader
controller = loader.getController();
primaryStage.setTitle("Studenten");
primaryStage.setScene(scene, 1200, 800));
primaryStage.show();
}
方法二:FXML中没有定义控制器
如果您不在 FXML 文档中使用 fx:controller
,您只需在 start()
方法中为 FXMLLoader 设置控制器即可。不要调用 loader.getController()
方法,而是使用 setter 方法:
loader.setController(controller);
当然,如果您正在使用此方法(并希望以后引用控制器),您将需要先实例化Controller
,这样您将使用原始代码中的行:
private Controller controller = new Controller();