2012-05-01 7 views
2

그래프와 관련된 프로그램을 만들고 있으므로 인접성 테이블을 시뮬레이트하기 위해 JTable에서 열을 동적으로 작성/제거해야합니다. 원하는 경우 열을 만들 수 있지만 열을 제거한 다음 다른 열을 만들면 삭제 된 열의 이전 데이터가 최신 열에 표시되므로 제거 할 수 없습니다.JTable에서 열 제거

열 데이터가 tablemodel에서 제거되지 않았기 때문에이 내용을 읽었습니다. 나는 열을 숨기거나 표시하는 예제를 보았습니다.하지만 실제로는 그들을 제거해야합니다. 그래서 데이터의 2 차원 매트릭스를 얻었을 때 참조 나 잘못된 데이터를 교차시키지 않았습니다.

제 1 보정 :

private DefaultTableModel removeCol(int id){ 
     DefaultTableModel tmp = new DefaultTableModel(); 
     int columnas = modelo.getColumnCount(); 
     for(int i=0;i<columnas;i++){ 
      if(i!=id) 
       tmp.addColumn(modelo.getColumnName(i)); 
     } 
     int rows = modelo.getRowCount(); 
     String datos[] = new String[columnas-1]; 
     for(int row=0;row<rows;row++){ 
      for(int col=0,sel=0;col<columnas;col++,sel++){ 
       if(col!=id) 
        datos[sel] = (String) modelo.getValueAt(row, col); 
       else 
        sel--; 
      } 
      tmp.addRow(datos); 
     } 
     return tmp; 

    } 

호출 :

adjacency matrix 더 쉽게 명시 적으로 행을 조작 할 수있는 AbstractTableModel에서 조작 할 수
DefaultTableModel mo = removeCol(i); 
    tblTrans = new JTable(mo); 
+3

하나의 적은 컬럼을 제외하고 동일한 데이터로 새로운'TableModel'을 제공하는 한 가지 방법이 있습니다. 아마도 더 나은 방법은 열의 가시성을 구성하고 런타임에'columnCount' 및 관련 열을 조정할 수있는 사용자 정의 테이블 모델을 만드는 것입니다. –

+0

첫 번째 옵션을 시도했지만 수정 된 TableModel (디버거를 사용하여 데이터, 열 및 모두가 올바른지 확인)을 얻은 후에 JTable에서 새 모델을 표시 할 수 없다면 이전 모델이 표시됩니다. S 내 게시물의 세부 정보) –

+0

더 나은 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. –

답변

4

하나의 열을 제거하다 할 수 있습니다. DefaultModelTable가 removeColumn을 가지고 있지 않기 때문에 개요에서, 예를 들어

class MatrixModel extends AbstractTableModel { 

    private int rows; 
    private int cols; 
    private Boolean[][] matrix; 

    MatrixModel(int rows, int cols) { 
     this.rows = rows; 
     this.cols = cols; 
     matrix = new Boolean[rows][cols]; 
    } 

    public void deleteColumn(int col) { 
     for (Boolean[] row : matrix) { 
      Boolean[] newRow = new Boolean[row.length - 1]; 
      // TODO: copy remaining values 
      row = newRow; 
     } 
     this.fireTableStructureChanged(); 
    } 
    ... 
} 
2

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Stack; 
import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.TableColumn; 

public class MyDialog extends JDialog { 

    private static final long serialVersionUID = 1L; 
    private String[] columnNames = {"First Name", "Last Name", "Sport", "# of Years", "Vegetarian"}; 
    private Stack<TableColumn> colDeleted = new Stack<TableColumn>(); 

    public MyDialog() { 
     Object[][] data = {{"Mary", "Campione", "Snowboarding", new Integer(5), false}, 
      {"Alison", "Huml", "Rowing", new Integer(3), true}, 
      {"Kathy", "Walrath", "Knitting", new Integer(2), false}, 
      {"Sharon", "Zakhour", "Speed reading", new Integer(20), true}, 
      {"Philip", "Milne", "Pool", new Integer(10), false}}; 
     final JTable table = new javax.swing.JTable(data, columnNames); 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     add(new JScrollPane(table)); 
     final JButton button1 = new JButton("Add Col"); 
     final JButton button = new JButton("Remove Last Col"); 
     button.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent arg0) { 
       if (table.getColumnCount() > 0) { 
        TableColumn colToDelete = table.getColumnModel().getColumn(table.getColumnCount() - 1); 
        table.removeColumn(colToDelete); 
        table.validate(); 
        colDeleted.push(colToDelete); 
        button1.setEnabled(true); 
       } else { 
        button.setEnabled(false); 
       } 
      } 
     }); 
     button1.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent arg0) { 
       if (colDeleted.size() > 0) { 
        table.addColumn(colDeleted.pop()); 
        table.validate(); 
        button.setEnabled(true); 
       } else { 
        button1.setEnabled(false); 
       } 
      } 
     }); 
     JPanel southPanel = new JPanel(); 
     southPanel.add(button); 
     southPanel.add(button1); 
     add(southPanel, BorderLayout.SOUTH); 
     setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
     pack(); 
     setLocation(150, 150); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       MyDialog myDialog = new MyDialog(); 
      } 
     }); 
    } 
} 
0

이 코드를 사용할 수 있습니다

private String[] getRemainingIdentifiers(int columnIndex) { 

    String[] identifiers = new String[table.getColumnCount() - 1]; 
    int k = 0; 

    for(int i = 0; i < table.getColumnCount(); i++) { 
     if(i != columnIndex) { 
      identifiers[k++] = table.getColumnName(i); 
     } 
    } 

    return identifiers; 
} 

private void removeColumn(int columnIndex) { 

    String[][] data = new String[table.getRowCount()][table.getColumnCount() - 1]; 

    for(int i = 0; i < table.getRowCount(); i++) { 
     for(int j = 0; j < table.getColumnCount(); j++) { 

      if(j != columnIndex) { 
       if(table.getValueAt(i, j) == null) { 
        table.setValueAt("", i, j); 
       } 
       if(j < columnIndex) { 
        data[i][j] = table.getValueAt(i, j).toString(); 
       } else { 
        data[i][j - 1] = table.getValueAt(i, j).toString(); 
       } 
      } 
     } 
    } 

    modeltable = new DefaultTableModel(data, getRemainingIdentifiers(columnIndex)); 
    table.setModel(modeltable); 

} 
0

DefaultDataModel 정말 removeColumn() 기능이 없습니다 그래서 실제로 문제를 해결할 수있는 함수를 직접 작성했습니다.

private void removeColumn(int index, JTable myTable){ 
    int nRow= myTable.getRowCount(); 
    int nCol= myTable.getColumnCount()-1; 
    Object[][] cells= new Object[nRow][nCol]; 
    String[] names= new String[nCol]; 

    for(int j=0; j<nCol; j++){ 
     if(j<index){ 
      names[j]= myTable.getColumnName(j); 
      for(int i=0; i<nRow; i++){ 
       cells[i][j]= myTable.getValueAt(i, j); 
      } 
     }else{ 
      names[j]= myTable.getColumnName(j+1); 
      for(int i=0; i<nRow; i++){ 
       cells[i][j]= myTable.getValueAt(i, j+1); 
      } 
     } 
    } 

    DefaultTableModel newModel= new DefaultTableModel(cells, names); 
    myTable.setModel(newModel);  
} 
+0

각 질문에 대한 적용 가능성을 설명하기 위해 적어도 여러 질문에 동일한 대답을 게시하지 마십시오. –

관련 문제