Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有文本字段的组合框_Java_Combobox_Javafx 8_Textfield - Fatal编程技术网

Java 带有文本字段的组合框

Java 带有文本字段的组合框,java,combobox,javafx-8,textfield,Java,Combobox,Javafx 8,Textfield,当使用组合框时,我想让我的用户在预定义的枚举或输入的int之间进行选择 我不明白为什么文本字段中的文本一直不相似 使用组合框时,IndexOutBoundsException无处不在 第一次选择文本字段后,它将在组合框的列表视图中消失,但您仍然可以选择它 感谢您的帮助 可运行示例: import javafx.application.Application; import javafx.beans.value.ChangeListener; import javafx.beans.value

当使用组合框时,我想让我的用户在预定义的枚举或输入的int之间进行选择

  • 我不明白为什么文本字段中的文本一直不相似
  • 使用组合框时,IndexOutBoundsException无处不在
  • 第一次选择文本字段后,它将在组合框的列表视图中消失,但您仍然可以选择它
感谢您的帮助

可运行示例:

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;
            }
        }
    }
}
我试过自己建造手机工厂,但我觉得很糟糕:/

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());
                    }

                }
            }
        };
    }
});
param2ComboBox.setCellFactory(新回调(){
@凌驾
公共ListCell调用(ListView p){
返回新的ListCell(){
@凌驾
受保护的void updateItem(对象项,布尔值为空){
super.updateItem(项,空);
如果(项==null | |空){
设置图形(空);
}否则{
if(文本字段的项目实例){
setContentDisplay(仅限ContentDisplay.GRAPHIC_);
设置图形((节点)项);
}否则{
设置图形(空);
setContentDisplay(仅限ContentDisplay.TEXT_);
setText(item.toString());
}
}
}
};
}
});

ComboBox有一个setCellFactory方法,允许您创建自己的自定义ComboBox。看看这个例子:。

我用了这个例子,结果与我写的CellFactory完全相同。