我已经自定义了一个组合框来在选择列表中显示线型,但该按钮仅显示文本。如何在按钮中绘制选定的线型。
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);
}
}
};
}
});
它的渲染方式如下:
我想显示选定的线条示例,而不是样式文本“-fx-lines...”,我该如何解决这个问题?
在选择列表中,行的左侧总是有一个额外的空格,可以去掉这个空格吗?
最佳答案
JavaFX 的工作方式与 Swing 不同,它会缓存 CellFactory 创建的节点,并且仅相应地更新它们,而不是使用它们进行渲染并丢弃它们(这就是为什么您必须实现 updateItem)。 JFX 类将使用一个节点(或“单元格”)作为所谓的按钮单元格,它只是为您显示文本。基本上,您必须调用 cmd.setButtonCell(myCellFactory.call(null)); 。这会将您的自定义单元格之一安装为按钮单元格,并且组合框将自动使用适当的值更新它。
关于用于选择线条样式的 JavaFX 组合框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12166227/