在 JavaFX 中向 ComboBox 添加项目时出现问题
Problem with adding items to ComboBox in JavaFX
我是 JavaFX 的新手,试图从 windowed 应用程序开始。一开始,我有一个简单的 ComboBox
,我在其中填充游戏类型,以供选择。没有更多的开始。问题开始了。根据 this answer,我创建了一个模型 class 用于在 ComboBox
中输入值。但是,当应用程序启动时,出现错误:
Exception in thread "JavaFX Application Thread" java.lang.NullPointerException at
com.vojjin.pcreator@1.1/com.vojjin.pcreator.HelloController.toString(HelloController.java:23)
这是 window,只有 Label
和 ComboBox
:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.effect.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<Pane prefHeight="250.0" prefWidth="654.0" xmlns="http://javafx.com/javafx/11.0.2" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.vojjin.pcreator.HelloController">
<padding>
<Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
</padding>
<Label layoutX="7.0" layoutY="2.0" prefHeight="17.0" prefWidth="94.0" text="Select game type" />
<ComboBox fx:id="gameTypeCombo" layoutX="7.0" layoutY="20.0" prefWidth="150.0" />
</Pane>
这是模型class:
package com.vojjin.pcreator.items;
public class GameType {
private final String name;
private final String id;
public GameType(String name, String id) {
this.name = name;
this.id = id;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
}
和控制器 class(我收到错误):
package com.vojjin.pcreator;
import com.vojjin.pcreator.items.GameType;
import javafx.collections.FXCollections;
import javafx.fxml.FXML;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.util.StringConverter;
public class HelloController {
private String gameType;
@FXML
private ComboBox<GameType> gameTypeCombo;
public void initialize() {
StringConverter<GameType> t=new StringConverter<>() {
@Override
public String toString(GameType object) {
return object.getName(); //this is the error line
}
@Override
public GameType fromString(String string) {
return null;
}
};
gameTypeCombo.setConverter(t);
gameTypeCombo.setItems(FXCollections.observableArrayList(
new GameType("Arithmo Games", "arithmo"),
new GameType("iMath Games", "imath")
));
gameTypeCombo.valueProperty().addListener((obs, oldVal, newVal) -> {
gameType = newVal.getId();
System.out.println(gameType);
});
}
}
行:return object.getName();
正在生成错误。该行应该显示在 ComboBox
中。例如,如果我输入 return "A";
一切正常,除了我的 ComboBox 填充的是“A”而不是游戏名称。并且更改值工作正常(我得到正确的 getId()
值)。
有什么想法吗?
当 Combobox
被初始化并且没有值被 selected 时 public String toString(GameType object)
中的 object
为空。
public String toString(GameType object)
必须修改以处理空对象。
例如:
public String toString(GameType object) {
return object == null ? "" : object.getName();
}
或
public String toString(GameType object) {
return object == null ? "Please select" : object.getName();
}
或者您可以在初始化组合时 select 一个值:gameTypeCombo.getSelectionModel().select(0);
我是 JavaFX 的新手,试图从 windowed 应用程序开始。一开始,我有一个简单的 ComboBox
,我在其中填充游戏类型,以供选择。没有更多的开始。问题开始了。根据 this answer,我创建了一个模型 class 用于在 ComboBox
中输入值。但是,当应用程序启动时,出现错误:
Exception in thread "JavaFX Application Thread" java.lang.NullPointerException at
com.vojjin.pcreator@1.1/com.vojjin.pcreator.HelloController.toString(HelloController.java:23)
这是 window,只有 Label
和 ComboBox
:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.effect.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<Pane prefHeight="250.0" prefWidth="654.0" xmlns="http://javafx.com/javafx/11.0.2" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.vojjin.pcreator.HelloController">
<padding>
<Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
</padding>
<Label layoutX="7.0" layoutY="2.0" prefHeight="17.0" prefWidth="94.0" text="Select game type" />
<ComboBox fx:id="gameTypeCombo" layoutX="7.0" layoutY="20.0" prefWidth="150.0" />
</Pane>
这是模型class:
package com.vojjin.pcreator.items;
public class GameType {
private final String name;
private final String id;
public GameType(String name, String id) {
this.name = name;
this.id = id;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
}
和控制器 class(我收到错误):
package com.vojjin.pcreator;
import com.vojjin.pcreator.items.GameType;
import javafx.collections.FXCollections;
import javafx.fxml.FXML;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.util.StringConverter;
public class HelloController {
private String gameType;
@FXML
private ComboBox<GameType> gameTypeCombo;
public void initialize() {
StringConverter<GameType> t=new StringConverter<>() {
@Override
public String toString(GameType object) {
return object.getName(); //this is the error line
}
@Override
public GameType fromString(String string) {
return null;
}
};
gameTypeCombo.setConverter(t);
gameTypeCombo.setItems(FXCollections.observableArrayList(
new GameType("Arithmo Games", "arithmo"),
new GameType("iMath Games", "imath")
));
gameTypeCombo.valueProperty().addListener((obs, oldVal, newVal) -> {
gameType = newVal.getId();
System.out.println(gameType);
});
}
}
行:return object.getName();
正在生成错误。该行应该显示在 ComboBox
中。例如,如果我输入 return "A";
一切正常,除了我的 ComboBox 填充的是“A”而不是游戏名称。并且更改值工作正常(我得到正确的 getId()
值)。
有什么想法吗?
当 Combobox
被初始化并且没有值被 selected 时 public String toString(GameType object)
中的 object
为空。
public String toString(GameType object)
必须修改以处理空对象。
例如:
public String toString(GameType object) {
return object == null ? "" : object.getName();
}
或
public String toString(GameType object) {
return object == null ? "Please select" : object.getName();
}
或者您可以在初始化组合时 select 一个值:gameTypeCombo.getSelectionModel().select(0);