2012-08-28 107 views
0

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

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冲程...”,我怎么能解决这个问题 JavaFX custom combobox

我想显示所选行样本?

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

回答

2

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

+2

在ComboBox javadoc的最开始可能会找到这些信息:http://docs.oracle.com/javafx/2/api/javafx/scene/control/ComboBox.html –

+1

在阅读“有关将节点插入组合框项目列表的警告“ –