2014-10-27 4 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

Вы добавляете какие-либо предметы в стол? Вы показываете код для добавления столбцов, но никакого кода для фактического добавления элементов. –

+0

Я пытаюсь понять, как это сделать. У меня есть 2D-массив вложенных наблюдаемых списков, но я не уверен, как добавить данные в таблицу. –

ответ

0

При создании TableView<S>, S тип отображаемой в каждой строке таблицы объекта. Свойство items таблицы, которое является ObservableList<S>, содержит коллекцию элементов, каждая из которых отображается в строке таблицы.

Если ваши данные в форме ObservableList<ObservableList<Stitch>> stitchList, тогда вам нужен TableView<ObservableList<Stitch>>. (Другими словами, S - ObservableList<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 S с лямбда-выражениями и избавиться от самых уродливых частей кода:

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

Это сработало, спасибо! –

Смежные вопросы