带有 TextField 的组合框
ComboBox with TextField
我想在使用 ComboBox 时让我的用户在预定义的枚举之一或输入的 int 之间进行选择。
- 我不明白为什么 TextField 中的文本总是消失。
- IndexOutBoundsException 在使用 ComboBox 时无处不在
- 第一次 select 编辑 TextField 后,它会在 ComboBox 的 ListView 中消失,但您仍然可以 select 它。
感谢帮助
可运行示例:
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TextField;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class TestComboBox extends Application {
@Override
public void start(Stage primaryStage) {
ComboBox param2ComboBox = new ComboBox();
TextField intTextField;
intTextField = new TextField();
intTextField.setEditable(true);
intTextField.setDisable(true);
param2ComboBox.getItems().addAll(Enums.Parameter.values());
param2ComboBox.getItems().add(intTextField);
param2ComboBox.setEditable(false);
param2ComboBox.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() {
@Override
public void changed(ObservableValue observable, Object oldValue, Object newValue) {
if (newValue instanceof TextField) {
param2ComboBox.setEditable(true);
} else {
param2ComboBox.setEditable(false);
}
}
});
param2ComboBox.getSelectionModel().selectFirst();
StackPane root = new StackPane();
root.getChildren().add(param2ComboBox);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
public static class Enums {
public enum Parameter {
TW("TW"), TK("TK"), NJ("NJ"), TJ("TJ"), D("D"), NZ("NZ"), NW("NW");
private String param;
private Parameter(String p) {
this.param = p;
}
}
}
}
我试过制作自己的 CellFactory,但我觉得它很烂:/
param2ComboBox.setCellFactory(new Callback<ListView<Object>, ListCell<Object>>() {
@Override
public ListCell<Object> call(ListView<Object> p) {
return new ListCell<Object>() {
@Override
protected void updateItem(Object item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setGraphic(null);
} else {
if(item instanceof TextField){
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
setGraphic((Node)item);
} else {
setGraphic(null);
setContentDisplay(ContentDisplay.TEXT_ONLY);
setText(item.toString());
}
}
}
};
}
});
ComboBox 有一个 setCellFactory 方法,允许您创建自己的自定义 ComboBox。看看这个例子:
定制细胞工厂.
我想在使用 ComboBox 时让我的用户在预定义的枚举之一或输入的 int 之间进行选择。
- 我不明白为什么 TextField 中的文本总是消失。
- IndexOutBoundsException 在使用 ComboBox 时无处不在
- 第一次 select 编辑 TextField 后,它会在 ComboBox 的 ListView 中消失,但您仍然可以 select 它。
感谢帮助
可运行示例:
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TextField;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class TestComboBox extends Application {
@Override
public void start(Stage primaryStage) {
ComboBox param2ComboBox = new ComboBox();
TextField intTextField;
intTextField = new TextField();
intTextField.setEditable(true);
intTextField.setDisable(true);
param2ComboBox.getItems().addAll(Enums.Parameter.values());
param2ComboBox.getItems().add(intTextField);
param2ComboBox.setEditable(false);
param2ComboBox.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() {
@Override
public void changed(ObservableValue observable, Object oldValue, Object newValue) {
if (newValue instanceof TextField) {
param2ComboBox.setEditable(true);
} else {
param2ComboBox.setEditable(false);
}
}
});
param2ComboBox.getSelectionModel().selectFirst();
StackPane root = new StackPane();
root.getChildren().add(param2ComboBox);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
public static class Enums {
public enum Parameter {
TW("TW"), TK("TK"), NJ("NJ"), TJ("TJ"), D("D"), NZ("NZ"), NW("NW");
private String param;
private Parameter(String p) {
this.param = p;
}
}
}
}
我试过制作自己的 CellFactory,但我觉得它很烂:/
param2ComboBox.setCellFactory(new Callback<ListView<Object>, ListCell<Object>>() {
@Override
public ListCell<Object> call(ListView<Object> p) {
return new ListCell<Object>() {
@Override
protected void updateItem(Object item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setGraphic(null);
} else {
if(item instanceof TextField){
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
setGraphic((Node)item);
} else {
setGraphic(null);
setContentDisplay(ContentDisplay.TEXT_ONLY);
setText(item.toString());
}
}
}
};
}
});
ComboBox 有一个 setCellFactory 方法,允许您创建自己的自定义 ComboBox。看看这个例子: 定制细胞工厂.