当前位置: 首页 > 知识库问答 >
问题:

JavaFX2中的组合框键值对

陈坚
2023-03-14

我如何创建一个组合框,它有不同的显示值和实际值的项目?

共有1个答案

谯阳伯
2023-03-14

您有两种方法:
1。只需重写datamodel类中的ToString()方法。示例:

public class Demo extends Application {

    private final ObservableList<Employee> data =
            FXCollections.observableArrayList(
            new Employee("Azamat", 2200.15),
            new Employee("Veli", 1400.0),
            new Employee("Nurbek", 900.5));

    @Override
    public void start(Stage primaryStage) {

        ComboBox<Employee> combobox = new ComboBox<>(data);
        combobox.getSelectionModel().selectFirst(); // Select first as default
        combobox.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Employee>() {

            @Override
            public void changed(ObservableValue<? extends Employee> arg0, Employee arg1, Employee arg2) {
                if (arg2 != null) {
                    System.out.println("Selected employee: " + arg2.getName());
                }
            }
        });
        StackPane root = new StackPane();
        root.getChildren().add(combobox);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }

    public static class Employee {
        private String name;
        private Double salary;

        @Override
        public String toString() {
            return name + " (sal:" + salary + ")";
        }

        public Employee(String name, Double salary) {
            this.name = name;
            this.salary = salary;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Double getSalary() {
            return salary;
        }

        public void setSalary(Double salary) {
            this.salary = salary;
        }
    }

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

请注意Employee类的重写toString()。组合框的键(实际值)将是employee实例,在本例中显示值为employee.ToString()
2。第二种方法是设置ComboBox的cellFactory属性。

combobox.setCellFactory(new Callback<ListView<Employee>, ListCell<Employee>>() {

    @Override
    public ListCell<Employee> call(ListView<Employee> arg0) {
        return new ListCell<Employee>() {

            private final Button btn;
            {
                setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
                btn = new Button();
            }

            @Override
            protected void updateItem(Employee item, boolean empty) {
                super.updateItem(item, empty);

                if (item == null || empty) {
                    setGraphic(null);
                } else {
                    btn.setStyle(item.getSalary() > 1000 ? "-fx-base:red" : "-fx-base: green");
                    btn.setText(item.getName() + "=" + item.getSalary());
                    setGraphic(btn);
                }
            }
        };
    }
});

这种方法提供了对单元格呈现的更强大的控制。您不仅可以格式化显示值,还可以将任何节点(控件)包含到单元格中(本例中为按钮),还可以添加一些查看逻辑(item.getSalary()?“”:“”)。实际值保持相同的ie Employee实例。

 类似资料:
  • 我如何创建一个组合框,它有不同的显示值和实际值的项目?

  • 我的表单上有2个组合框(在表单加载事件中)。第一个组合框在表单加载后从选择语句中获取一个值。我想在我的第二个组合框中使用该值。这是我的代码: 1st组合框= cbDelivery 2de组合框= cbOrderNo 此组合框位于: private void CB delivery _ selectedindex changed(对象发送方,事件参数e) 因此,一旦我从1ste组合框中选择一个值,我

  • 问题内容: 我想在Swing中添加一个简单的方法,但是我想为组合中的每个项目分配值。我有以下代码 现在我想要的是,当单击组合框时,它应该相应地返回1、2和3,而不是a,b,c。有没有办法为组合框中的每个项目分配键值? 问题答案: 您可以将项目添加为对象,而不是像这样添加String: 因此,要返回键,事件的功能是: 这样做,您必须重写ItemClass类的功能以返回要在组合框中显示的字符串。 顺便

  • 我有两个组合框。我正在填充这样的两个组合框。组合框1和2的名称是cmbpartyName和cmbprefPT2。 在这里,我从combox1中选择一个值,在它所选的索引更改事件中,如下所示。 由于两个组合框具有相同的值,如何从第二个组合框cmbPrefPT2中删除第一个组合框的选定值?

  • 问题内容: 我需要获取Swing中组合框的整数值。 我已经为combobox设置了一个整数值作为id。我尝试了combobox.getSelectedItem()和combobox.getSelectedIndex(),但是它无法获取int值。 下面是我的代码: 任何帮助表示赞赏。 问题答案: 方法返回一个按类型包装的值,因此您必须进行相应的转换。 句法:

  • 我在一个表单中有两个组合框。 当combobox 2中的列表更新时,我希望combobox 1中选定的值发生变化。 例如:ComboBox1 包含移动公司的名称,ComboBox2 包含该公司所有移动电话的列表。