【问题标题】:Adding a value to Combo Box from the UI?从 UI 向组合框添加值?
【发布时间】:2017-05-11 23:14:05
【问题描述】:

我怎样才能为组合框中的项目添加一个值,以便用户可以从现有项目或集团“添加元素”项目中选择以添加新项目?

private ComboBox<String> comboStructDonnees;

接着是:

comboData.getItems().addAll("TVW", "VWT", "TTVW", "VWXT", "Add item");

我不知道接下来应该创建哪个事件,如果可能的话,我希望在添加的元素上输入文本。

任何帮助将不胜感激。

【问题讨论】:

  • 那么您的意思是您希望用户能够添加到可能的选项列表中,还是您有两个字段,或者您想要一个可编辑的组合框?

标签: java events javafx combobox jcombobox


【解决方案1】:

您可以将具有“特殊值”的项目(例如空字符串)添加到组合框项目列表的末尾。

使用单元格工厂创建一个单元格,该单元格在显示该值时向用户显示用户友好的消息(例如“添加项目..”)。如果单元格正在显示特殊值,则向单元格添加一个事件过滤器,该过滤器显示一个用于输入新值的对话框。

这是一个快速的 SSCCE:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ListCell;
import javafx.scene.control.TextInputDialog;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class AddItemToComboBox extends Application {

    @Override
    public void start(Stage primaryStage) {
        ComboBox<String> combo = new ComboBox<>();
        combo.getItems().addAll("One", "Two", "Three", "");
        combo.setCellFactory(lv -> {
            ListCell<String> cell = new ListCell<String>() {
                @Override
                protected void updateItem(String item, boolean empty) {
                    super.updateItem(item, empty);
                    if (empty) {
                        setText(null);
                    } else {
                        if (item.isEmpty()) {
                            setText("Add item...");
                        } else {
                            setText(item);
                        }
                    }
                }
            };

            cell.addEventFilter(MouseEvent.MOUSE_PRESSED, evt -> {
                if (cell.getItem().isEmpty() && ! cell.isEmpty()) {
                    TextInputDialog dialog = new TextInputDialog();
                    dialog.setContentText("Enter item");
                    dialog.showAndWait().ifPresent(text -> {
                        int index = combo.getItems().size()-1;
                        combo.getItems().add(index, text);
                        combo.getSelectionModel().select(index);
                    });
                    evt.consume();
                }
            });

            return cell ;
        });

        BorderPane root = new BorderPane();
        root.setTop(combo);
        Scene scene = new Scene(root, 400, 400);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

【讨论】:

    猜你喜欢
    • 2021-05-25
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多