JavaFX组合框用于选择线条样式

时间:2012-08-28 19:30:43

标签: java javafx-2

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

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 custom combobox

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

在选择列表中,行左边总有一个额外的空格,是否可以摆脱这个空间?

1 个答案:

答案 0 :(得分:2)

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