带有一个可编辑项目的JavaFX ComboBox

时间:2014-09-29 12:35:10

标签: java javafx

我想要一个包含以下选项的ComboBox:

(组合框就业:) - 教育 - 汽车 - (...) - OTHER< - editable

如果用户选择“其他”,他可以编辑ComboBox中的项目,但所有其他选项都是不可编辑的。 这是可能的还是我应该在用户选择“其他”时显示其他TextField?

2 个答案:

答案 0 :(得分:1)

可以选择使ComboBox可编辑:

combobox.setEditable(true);

但是,您只能使用此功能编辑所有条目。 详情请见:http://docs.oracle.com/javafx/2/ui_controls/combo-box.htm

据我所知,你只能在包含你的Combobox内容的ObservableList中添加字符串。因此,您无法添加节点(在本例中为Textfield)。

对于ChoiceBox也是如此,如果你在那里添加一个TextField(这在技术上是可行的),但是你实际使用时只会显示.toString。

因此,您最好创建一个单独的字段。

同样的想法:当用户点击"其他"时,您可以快速创建一个弹出窗口,其中输入任何其他内容。然后,当您关闭窗口或单击输入或其他任何内容时,此值将添加到ObservableList。会让它看起来更漂亮我猜...

答案 1 :(得分:0)

使用此示例:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package comboboxeditable;

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

/**
 *
 * @author reegan
 */
public class ComboBoxEditable extends Application {

    Node sub;

    @Override
    public void start(Stage primaryStage) {

        ComboBox mainCombo = new ComboBox(listofCombo());
        Button  save = new Button("Save");
        sub = new ComboBox(listofCombo());
        HBox root = new HBox(20);
        root.getChildren().addAll(mainCombo, sub,save);

        mainCombo.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() {

            @Override
            public void changed(ObservableValue observable, Object oldValue, Object newValue) {
                if (newValue == "Others") {
                    sub = new TextField();
                } else {
                    sub = new ComboBox(listofCombo());
                }
                root.getChildren().remove(1);
                root.getChildren().add(1, sub);
            }
        });
        save.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                System.out.println(mainCombo.getValue());
                if(sub.getClass() == ComboBox.class) {
                    ComboBox sub1 = (ComboBox)sub;
                    System.out.println(sub1.getValue());
                } else {
                    TextField field = (TextField)sub;
                    System.out.println(field.getText());
                }
            }
        });


        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 ObservableList listofCombo() {
        ObservableList<String> list = FXCollections.observableArrayList();
        for (int i = 0; i < 10; i++) {
            list.add(String.valueOf("Hello" + i));
        }
        list.add("Others");
        return list;
    }

}