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

JavaFX组合框setButtonCell

孔瑾瑜
2023-03-14

我需要关于设置组合框按钮单元格的帮助。我使用一个组合框来显示可观察列表中的数据,该列表包含两个列的表中的数据,“步骤”和“下一步”(下一步包含一个插入在步骤列中的项目);我需要做的是显示带有“步骤”列表的组合框列表单元格和相对的“下一步”按钮单元格。现在,我可以正确地看到列表单元格,但我的按钮单元格总是空的。

代码:

    // SET THE VALUE STEP TO THE LISTCELL 
    comboStatoSuccessivo.setCellFactory(new Callback<ListView<StatoEsiti>, ListCell<StatoEsiti>>() {
        @Override public ListCell<StatoEsiti> call(ListView<StatoEsiti> p) {
            return new ListCell<StatoEsiti>() { 
                    @Override
                    protected void updateItem(StatoEsiti t, boolean bln) {
                        super.updateItem(t, bln);
                        if(t != null){
                            setText(t.statoProperty().getValue());
                            System.out.println("SET PROPERTY " + t.statoProperty().getValue());
                        } else {
                            setText(null);
                        }    

                    }                       
            };
        }
    });


    // SET THE VALUE NEXTSTEP TO THE BUTTONCELL
    comboStatoSuccessivo.setButtonCell(new ListCell<StatoEsiti>() {
        @Override
        protected void updateItem(StatoEsiti t, boolean bln) {
            super.updateItem(t, bln); 
            if (t != null) { <<<<<<<<<<<<<<-------------ALWAYS NULL----WHY??????
                setText(t.statoSuccessivoProperty().getValue());
                System.out.println("SET PROPERTY BUTTONCELL " + t.statoSuccessivoProperty().getValue());
            } else {
                setText(null);
                System.out.println("SET PROPERTY BUTTONCELL NULL");
            }

        }
    });

提前感谢。

共有1个答案

弓磊
2023-03-14


它正如预期的那样工作,就像当从组合框的下拉菜单中选择项目时,按钮单元格会用相关的“下一步”更新:

public class ComboDemo extends Application {

    @Override
    public void start(Stage primaryStage) {
        List<Person> list = new ArrayList<Person>();
        list.add(new Person("step 1212", 12));
        list.add(new Person("step 4545", 45));
        list.add(new Person("step 5656", 56));
        list.add(new Person("step 9090", 90));

        ComboBox<Person> comboBox = new ComboBox<>(FXCollections.observableList(list));

        comboBox.setCellFactory(new Callback<ListView<Person>, ListCell<Person>>() {
            @Override
            public ListCell<Person> call(ListView<Person> p) {
                return new ListCell<Person>() {
                    @Override
                    protected void updateItem(Person t, boolean bln) {
                        super.updateItem(t, bln);
                        if (t != null) {
                            setText(t.getStepProperty().getValue());
                            System.out.println("SET PROPERTY " + t.getStepProperty().getValue());
                        } else {
                            setText(null);
                        }
                    }
                };
            }
        });

        // SET THE VALUE NEXTSTEP TO THE BUTTONCELL
        comboBox.setButtonCell(new ListCell<Person>() {
            @Override
            protected void updateItem(Person t, boolean bln) {
                super.updateItem(t, bln);
                if (t != null) {
                    setText(t.getNextStepProperty().getValue().toString());
                    System.out.println("SET PROPERTY BUTTONCELL " + t.getNextStepProperty().getValue());
                } else {
                    setText(null);
                    System.out.println("SET PROPERTY BUTTONCELL NULL");
                }

            }
        });

        StackPane root = new StackPane();
        root.getChildren().add(comboBox);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static class Person {
        private StringProperty stepProperty = new SimpleStringProperty();
        private IntegerProperty nextStepProperty = new SimpleIntegerProperty();

        public Person(String step, Integer nextStep) {
            this.stepProperty.setValue(step);
            this.nextStepProperty.setValue(nextStep);
        }

        public StringProperty getStepProperty() {
            return stepProperty;
        }

        public void setStepProperty(StringProperty stepProperty) {
            this.stepProperty = stepProperty;
        }

        public IntegerProperty getNextStepProperty() {
            return nextStepProperty;
        }

        public void setNextStepProperty(IntegerProperty nextStepProperty) {
            this.nextStepProperty = nextStepProperty;
        }
    }

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

}

把它和你的比较一下。

 类似资料:
  • 提前谢了。

  • 我试图创建一个,它将显示所选的预览,但是会显示字符串值。 唯一有效的方法似乎是创建

  • 我想要一个组合框,它会在用户键入时过滤列表项。它应该如下工作: 键入时,文本字段应该显示一个可能的选择,但是用户尚未键入的单词部分应该突出显示。 当他打开列表时,下拉框应该只显示可能的选项? 使用箭头键,用户应该在缩小可能的项目后选择剩余的项目之一。 过滤并不重要,跳转到第一个匹配的选择也可以。 有类似的吗?

  • 我正在尝试使用一个可编辑的组合框。因为我想添加一个用于按回车键的监听器。我尝试了下面的选项,但都不起作用。:( < code>cmb_year是组合框对象。

  • 我有一个javafx组合框,其中有一个表视图作为弹出控件。问题是当我单击列标题进行排序时,弹出窗口消失了。如何将弹出窗口限制为仅在从表视图中选择行时才运行?

  • 我试图更改JavaFX组合框列表的文本颜色,但它似乎不起作用。 返回以下内容:下拉列表文本不是白色 我该怎么解决这个问题?我的CSS知识不是很强。