【问题标题】:Editable Combobox可编辑组合框
【发布时间】:2014-06-18 06:02:36
【问题描述】:

我有一个包含员工 ObservableList 的单身 EmployeeDatabase。

此 ObsList 填充可编辑组合框的内容。

当用户从组合框中选择一名员工并点击按钮时,我希望该员工(来自数据库)显示在控制台的 toString() 中。

问题是,可编辑的组合框不允许我直接选择员工。我应该使用 StringConverter 将该字符串转换为 Employee。

但是 Employee 已经存在于单例数据库中!我必须在数据库中搜索它们吗?或者有没有更简单的方法让 Employee 好像组合框不可编辑,而我所要做的就是 cmbx.getSelectionModel().getSelectedItem()?

【问题讨论】:

  • 你覆盖Employee.toString() 吗?尝试使用 ComboBox
  • 您真的希望ComboBox 可编辑吗?如果他们输入的内容不代表数据库中的员工,计划是什么?
  • 如果员工不在数据库中,将显示一个弹出窗口,要求他们手动将“东西”添加到数据库中,无论是否是员工。 (询问名字、姓氏等)
  • 听起来您正在尝试将单个控件用于多个任务,这并不一定能实现最佳的用户交互。我可能会考虑有一个不可编辑的ComboBox 和一个名为“创建新员工...”的按钮,它打开了对话框。我会按照你所说的那样回答这个问题......
  • 我确实有一个按钮可以打开数据库进行编辑(添加、删除等)。我也同意你的观点,直接输入新员工的文本字段是一个奇怪的想法。这是我的客户想要的。 :\

标签: user-interface combobox javafx


【解决方案1】:

您不需要返回数据库,因为您已经有一个ObservableList,其中包含Employees。您应该能够执行以下操作:

final ComboBox<Employee> employeeCombo = new ComboBox<>();
employeeCombo.setItems(EmployeeDatabase.getInstance().getEmployees());
employeeCombo.setConverter(new StringConverter<Employee>() {
    @Override
    public Employee fromString(String string) {
        for (Employee employee : employeeCombo.getItems()) {
            if (string.equals(employee.getName())) { // may need more logic...
                return employee ;
            }
        }
        Employee employee = new Employee(string);

        // if things are set up correctly, this call should both update the database
        // and the observable list to which the combo box points
        EmployeeDatabase.getInstance().add(employee); 
        return employee ;
    }
    @Override
    public String toString(Employee employee) {
        return employee == null : null ? employee.getName();
    }
});
employeeCombo.setEditable(true);

【讨论】:

  • 这假定所有员工都有一个唯一的名称。如果有多个同名怎么办?我的员工每个人都有一个唯一的 ID,但要求用户输入他们的 ID 来搜索他们是没有意义的。
  • 嗯,是的。因此,此 UI 可能有意义的唯一方法是组合框是否为员工显示唯一值。在这种情况下,只需根据需要调整代码。如果组合框应该显示姓名,并且姓名不是唯一的,那么根本无法确定用户是打算提供现有员工的姓名还是新员工的姓名。在这种情况下,您需要与客户进行讨论;)。
  • 我可能会。非常感谢!如果我修改它以使用员工 ID,我很确定这个解决方案会起作用,所以有一个免费赠品。 :D
  • 我想可能只是可以从 StringConverter 代码中显示一个对话框...让我进行实验并可能更新...
  • 不,这行不通。如果显示的字符串(或至少由用户输入)不是唯一的,我看不出它可以按照您想要的方式工作。
猜你喜欢
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
相关资源
最近更新 更多