0

我在选择列表中自定义了一个组合框来显示线型,但按钮只显示一个文本。如何在按钮中绘制选定的线型。

ComboBox<String> cmb = new ComboBox<String>();
cmb.getItems().addAll("-fx-stroke-dash-array: 12 2 4 2;", "-fx-stroke-dash-array: 2 2;");
cmb.setCellFactory(new Callback<ListView<String>, ListCell<String>>()
    {
        @Override public ListCell<String> call(ListView<String> p)
        {
            return new ListCell<String>()
                {
                    private final Group group;
                    private final Line line;
                    { 
                        setContentDisplay(ContentDisplay.GRAPHIC_ONLY); 
                        group = new Group();
                        group.getChildren().add(new Rectangle(100, 30, Color.WHITE));
                        line = new Line(0, 15, 100, 15);
                        group.getChildren().add(line);
                    }

                    @Override protected void updateItem(String style, boolean empty)
                    {
                        super.updateItem(style, empty);
                        if(style != null && !empty)
                        {
                            line.setStyle(style);
                            setGraphic(group);
                        }
                    }
                };
        }
    });

这是它的渲染方式: JavaFX 自定义组合框

我想显示选定的线条样本,而不是样式文本“-fx-stroke...”,我该如何解决?

在选择列表中,行的左侧总是有一个额外的空格,可以去掉这个空格吗?

4

1 回答 1

2

JavaFX 与 Swing 的工作方式不同,它缓存由 CellFactory 创建的节点并仅相应地更新它们,而不是使用它们进行渲染并丢弃它们(这就是您必须实现 updateItem 的原因)。JFX 类将使用一个节点(或“单元”)作为所谓的按钮单元,它只是为您显示文本的单元。基本上,您必须调用cmd.setButtonCell(myCellFactory.call(null));. 这会将您的自定义单元之一安装为按钮单元,并且组合框将使用适当的值自动更新它。

于 2012-08-28T20:24:32.507 回答