2014-10-27 72 views
0

我一直在为此奋战一段时间,最后想到我需要一些帮助。用Java-FX固定单元大小表

我想创建一个表,其中每个单元显示特定的颜色。这是基于用户选择的图像动态创建的。

我得到它与TilePane一起工作,但由于表的大小,它运行速度非常慢。

目前,我正在尝试使用TableView进行工作。 TableView正在创建,但尚未填充。我创建TableView和我的自定义TableCell类的代码如下。

我的主要问题是:这是最好的方式去做这件事?如果是这样,我做错了什么?

非常感谢您提供我总是在这里看到的真棒协助。

代码来创建的TableView:

private ObservableList<ObservableList<Stitch>> stitchList; 
private TableView<Stitch> pattern; 

@Override 
protected TableView<Stitch> call() throws Exception { 
    for (int i=0; i< stitchList.size(); i++) { 
     TableColumn<Stitch, Color> column = new TableColumn<>(); 
     column.setCellValueFactory(new Callback<CellDataFeatures<Stitch, Color>, ObservableValue<Color>>() { 

      public ObservableValue<Color> call(CellDataFeatures<Stitch, Color> stitch) { 
       return stitch.getValue().getDisplayColorProperty(); 
      } 
      }); 

     column.setCellFactory(new Callback<TableColumn<Stitch, Color>, TableCell<Stitch, Color>>() { 
      @Override public TableCell<Stitch, Color> call(TableColumn<Stitch, Color> list) { 
       return new StitchCell(); 
      } 
     }); 

     //Set column sizes 
     column.setMinWidth(10); 
     column.setMaxWidth(10); 
     pattern.getColumns().add(column); 
    } 

    return pattern; 
} // End Call 

代码自定义单元格类

public class StitchCell extends TableCell<Stitch, Color> { 

@Override 
protected void updateItem(Color color, boolean empty) { 
    super.updateItem(color, empty); 

    if (empty || color == null) { 
     this.setStyle("-fx-background-color: white"); 
    } else { 
     this.setStyle("-fx-background-color: #" + Integer.toHexString(color.hashCode())); 
    } 
} 
} 
+0

您是否将任何项目添加到表中的任何位置?您显示添加列的代码,但没有代码实际添加项目。 – 2014-10-27 13:44:17

+0

我在想如何去做。我有一个嵌套的可观察列表的二维数组,但我不知道如何将数据添加到表 – 2014-10-27 16:42:41

回答

0

当你创建一个TableView<S>S是表的每一行中显示的对象的类型。该表的items属性是ObservableList<S>,其中包含项目集合,每个项目都显示在表格行中。

如果您的数据的格式为ObservableList<ObservableList<Stitch>> stitchList,那么您需要一个TableView<ObservableList<Stitch>>。 (换句话说,SObservableList<Stitch>。)stitchList的每个元素ObservableList<Stitch>表示表中的一行。

TableView不是用ObservableList<ObservableList>作为表示数据的主要用例,因此您需要做一点工作才能使cellValueFactory正常工作。如果你确信每一行有相同数量的项目,可以或许减少这种有点,但你需要像下面这样:

TableView<ObservableList<Stitch>> pattern = new TableView<>(); 
ObservableList<ObservableList<Stitch>> stitchList = ... ; 

// Set items (i.e. rows) in table: 
pattern.setItems(stitchList); 

// iterate through all rows: 

for (ObservableList<Stitch> row : pattern) { 
    // if this row contains more elements than columns we have already created, 
    // (must be true on first row, may be true on subsequent rows if data not rectangular) 
    // create a new column for each additional element 
    for (int i = pattern.getColumns().size(); i < row.size() ; i++) { 
     TableColumn<ObservableList<Stitch>, Color> column = new TableColumn<>(); 
     final int columnIndex = i ; 
     column.setCellValueFactory(new Callback<CellDataFeatures<ObservableList<Stitch>, Color>, ObservableValue<Color>>() { 
      @Override 
      public ObservableValue<Stitch> call(CellDataFeatures<ObservableList<Stitch>, Stitch>> stitch) { 
       return stitch.getValue() // the row value, i.e. an ObservableList<Stitch> 
          .get(columnIndex) // the Stitch for this cell 
          .getDisplayColorProperty(); 
      } 
     }); 

     column.setCellValueFactory(new Callback<TableColumn<ObservableList<Stitch>, Color>, TableCell<ObservableList<Stitch>, Color>>() { 
      @Override 
      public TableCell<ObservableList<Stitch>, Color> call(TableColumn<ObservableList<Stitch>, Color> col) { 
       return new StitchCell(); 
      } 
     }); 

     column.setMinWidth(10); 
     column.setMaxWidth(10); 
     pattern.getColumns().add(column); 
    } 
} 

如果您使用的是Java 8,可以更换Callback小号用lambda表达式,并摆脱代码中最丑的部分:

for (ObservableList<Stitch> row : pattern) { 
    // if this row contains more elements than columns we have already created, 
    // (must be true on first row, may be true on subsequent rows if data not rectangular) 
    // create a new column for each additional element 
    for (int i = pattern.getColumns().size(); i < row.size() ; i++) { 
     TableColumn<ObservableList<Stitch>, Color> column = new TableColumn<>(); 
     final int columnIndex = i ; 
     column.setCellValueFactory(rowData -> 
      rowData.getValue() // the row value, i.e. an ObservableList<Stitch> 
       .get(columnIndex) // the Stitch for this cell 
       .getDisplayColorProperty()); 

     column.setCellValueFactory(col -> new StitchCell()); 

     column.setMinWidth(10); 
     column.setMaxWidth(10); 
     pattern.getColumns().add(column); 
    } 
} 
+0

工作,谢谢! – 2014-10-27 19:03:26