2017-05-04 1 views
0

TableView 셀을 셀별로 복사하고 싶습니다. 나중에 수정할 수 있습니다. TableColumn을 인스턴스화 할 수 없기 때문에 열을 설정하는 방법을 알지 못하기 때문에 막혔습니다. rowHeader를 어떻게 처리해야하는지 또는 어떻게 다르게해야하는지 모르겠습니다.TableView 필드를 필드로 복사 (수정하기 위해)

public TableView<ObservableMap<String, CellDescriptor>> copyTableViewDeleteRow(int j) 
{ 
    //FIXME 
    TableView<ObservableMap<String, CellDescriptor>> tableViewCopy = new TableView<ObservableMap<String, CellDescriptor>>(); 

    ObservableList<TableColumn<ObservableMap<String, CellDescriptor>, ?>> columns = tableView.getColumns(); 

    ObservableList<TableColumn<ObservableMap<String, CellDescriptor>, ?>> columnsNew = 
      tableViewCopy.getColumns(); 

    ListOrderedMap<String, CellDescriptor> rowHeader = new ListOrderedMap<>(); 

    int rowIndex = 0; 
    int columnIndex = 0; 
    for (TableColumn<?, ?> column : columns) { 
     String cell = column.getText(); 
     String key = COLUMN_KEY_PREFIX + Integer.toString(columnIndex); 
     CellDescriptor cd = new CellDescriptor(columnIndex, rowIndex, cell, this); 
     rowHeader.put(key, cd); 
     //TODO ? cannot instantiate TableColumn 
     TableColumn<ObservableMap<String, CellDescriptor>, ?> columnNew = 
       //new TableColumn<ObservableList<String>, CellDescriptor>(key, cd); 
       new TableColumn<ObservableMap<String, CellDescriptor>, ?>(cd); 

     ++columnIndex; 
    } 

    ObservableList<ObservableMap<String, CellDescriptor>> itemsNew = 
      tableViewCopy.getItems(); 

    ++rowIndex; 
    for (Object row : tableView.getItems()) { 
     ObservableMap<String, CellDescriptor> e = FXCollections.observableMap(new HashMap<String, CellDescriptor>()); 

     columnIndex = 0; 
     for (TableColumn column : columns) { 

      CellDescriptor cd = (CellDescriptor) column.getCellObservableValue(row).getValue(); 
      CellDescriptor cdNew = cd.clone(); 

      if(rowIndex == 1 && columnIndex == 1) 
       cdNew.setText("xxx"); 

      e.put(COLUMN_KEY_PREFIX + columnIndex, cdNew); 

      ++columnIndex; 
     } 

     itemsNew.add(e); 

     ++rowIndex; 
    }  

    System.out.println("tableViewCopy columns size=" + tableViewCopy.getColumns().size()); // is zero 
    System.out.println("tableViewCopy items size=" + tableViewCopy.getItems().size()); // is three 

    return tableViewCopy; 
} 

크기가 0이므로 열이 누락 된 것처럼 보입니다.

답변

0

데이터 객체에 행을 쓰는 방법으로이 문제를 해결 한 다음 데이터 객체에서 tableView를 만드는 기존 함수를 사용했습니다.

protected TableView<ObservableMap<String, CellDescriptor>> createTableView(TableFile tableFile) 
{ 
    int columns = tableFile.getColumnCount(); 
    int rows = tableFile.getRowCount(); 

    ObservableList<ObservableMap<String, CellDescriptor>> data = FXCollections.observableArrayList(); 

    for (int i = 1; i < rows; i++) 
    { 
     ListOrderedMap<String, CellDescriptor> row = tableFile.getRow(i); 
     ObservableMap<String, CellDescriptor> oRow = FXCollections.observableMap(row); 
     data.add(oRow); 
    } 

    TableView<ObservableMap<String, CellDescriptor>> tableView = new TableView<>(); 
    tableView.setEditable(true); 
    Callback<TableColumn<ObservableMap<String, CellDescriptor>, CellDescriptor>, TableCell<ObservableMap<String, CellDescriptor>, CellDescriptor>> cellFactory 
     = (TableColumn<ObservableMap<String, CellDescriptor>, CellDescriptor> param) -> new ContextMenuCell(); 
    for (int i = 0; i < columns; i++) 
    { 
     String name = tableFile.getHeaderCell(i); 
     String key = tableFile.getKey(i); 
     TableColumn<ObservableMap<String, CellDescriptor>, CellDescriptor> tc = new TableColumn<>(name); 
     tc.setCellValueFactory(new ObservableMapValueFactory<String, CellDescriptor>(key)); 
     tc.setCellFactory(cellFactory); 
     tc.setOnEditCommit(
       (TableColumn.CellEditEvent<ObservableMap<String, CellDescriptor>, CellDescriptor> event) -> 
       { 
        ObservableMap<String, CellDescriptor> map = event.getTableView().getItems().get(event.getTablePosition().getRow()); 
        int ii = event.getOldValue().getI(); 
        int jj = event.getOldValue().getJ(); 
        String text = event.getNewValue().getText(); 
        TableFile tf = event.getOldValue().getTf(); 
        CellDescriptor newValue = new CellDescriptor(ii, jj, text, tf); 
        map.put(key, newValue); 
       }); 
     ContextMenu columnContextMenue = createColumnContextMenu(i); 
     tc.setContextMenu(columnContextMenue); 
     tableView.getColumns().add(tc); 
    } 

    tableView.setItems(data); 
    return tableView; 
} 

데이터 객체는 다음과 같다 :

 ArrayList<ListOrderedMap<String, CellDescriptor>> newData = new ArrayList<>(); 

을 다음과 같이 충전된다 : 다음 함수이다

public void copyTableViewDeleteRow(int j) 
{ 
    ArrayList<ListOrderedMap<String, CellDescriptor>> newData = new ArrayList<>(); 

    //TODO 
    ObservableList<TableColumn<ObservableMap<String, CellDescriptor>, ?>> columns = tableView.getColumns(); 

    ListOrderedMap<String, CellDescriptor> rowHeader = new ListOrderedMap<>(); 

    int rowIndex = 0; 
    int columnIndex = 0; 
    for (TableColumn<?, ?> column : columns) { 
     String cell = column.getText(); 
     String key = COLUMN_KEY_PREFIX + Integer.toString(columnIndex); 
     CellDescriptor cd = new CellDescriptor(columnIndex, rowIndex, cell, this); 
     rowHeader.put(key, cd); 

     ++columnIndex; 
    } 

    newData.add(rowHeader);  

    ObservableList<ObservableMap<String, CellDescriptor>> items = 
      tableViewCopy.getItems(); 

    ++rowIndex; 
    for (Object row : tableView.getItems()) { 
     ListOrderedMap<String, CellDescriptor> newRow = new ListOrderedMap<>(); 

     columnIndex = 0; 
     for (TableColumn column : columns) { 

      CellDescriptor cd = (CellDescriptor) column.getCellObservableValue(row).getValue(); 
      CellDescriptor cdNew = cd.clone(); 

      if(rowIndex == 1 && columnIndex == 1) 
       cdNew.setText("xxx"); 

      newRow.put(COLUMN_KEY_PREFIX + columnIndex, cdNew); 
      ++columnIndex; 
     } 

     items.add(e); 
     newData.add(newRow); 

     ++rowIndex; 
    }  

    this.data = newData; 
} 
관련 문제