簡體   English   中英

從JTable中刪除列

[英]Remove column from a JTable

我正在制作一個與圖形相關的程序,因此需要從JTable動態創建/刪除列以模擬鄰接表。 我已經可以在需要時創建列,但是不能刪除它們,因為如果刪除列然后創建另一列,則先前的數據(來自已刪除的列)將顯示在最新的列中。

我讀過這是因為沒有從tablemodel中刪除列數據。 我已經看到了隱藏或顯示列的示例,但是我確實需要刪除它們,因此當我獲得數據的二維矩陣時,我既沒有交叉引用也沒有壞數據。

第一次更正:

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;

    }

調用時:

   DefaultTableModel mo = removeCol(i);
    tblTrans = new JTable(mo);

AbstractTableModel ,可以更容易地操縱鄰接矩陣 ,在這里您可以顯式操縱行以忽略一列。 概括來說,

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();
    }
    ...
}

例如

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();
            }
        });
    }
}

因為DefaultModelTable沒有removeColumn,所以可以使用此代碼:

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);

}

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);       
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM