JavaFX ComboBox с одним редактируемым элементом

1

Я хотел бы иметь ComboBox со следующими параметрами:

(комбобокс занятость :) - Образование - Автомобильная промышленность - (...) - ДРУГИЕ <- редактируемые

Если пользователь выбирает "другое", он может редактировать элемент в ComboBox, но все остальные параметры не редактируются. Возможно ли это или я должен просто отображать дополнительный TextField, когда пользователь выбирает "другое"?

Теги:
javafx

2 ответа

1

Существует возможность сделать ComboBox доступным для редактирования:

combobox.setEditable(true);

Однако вы можете делать все записи, редактируемые с помощью этой функции. Читайте больше на: http://docs.oracle.com/javafx/2/ui_controls/combo-box.htm

Насколько я знаю, вы можете добавлять строки только в ObservableList, который содержит содержимое вашего Combobox. Поэтому вы не можете добавить узел (в данном случае текстовое поле).

То же самое касается ChoiceBox, если вы добавляете TextField там (что технически возможно), но вы получите только отображение.toString, когда вы его используете.

Поэтому вы, вероятно, лучше всего создаете отдельное поле.

Точно так же, как идея: вы можете быстро создать всплывающее окно, когда пользователь нажимает "Другое", в котором все другое вводится. Затем, когда вы закроете окно или нажмите "Enter" или что-то еще, это значение добавляется в ObservableList. Думаю, это будет выглядеть лучше...

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

}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню