删除JTable行

时间:2013-03-19 00:01:40

标签: java swing jtable row abstracttablemodel

我正在研究jTable,我打算删除特定的行作为要在表上进行的数据操作的一部分。基本上我已经能够成功删除用户指定的行,但我真正想要做的是删除基于布尔状态的多行或者选择作为表的四列的第一部分的复选框。

我附上了关于运行代码的当前结果的屏幕截图,并希望能够根据所选的布尔状态或复选框删除行。

下面是我的代码,包括我的表模型代码,它扩展了AbstractTableModel:

package com.TableRowSelectProgramatically;

import javax.swing.*;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;

@SuppressWarnings("serial")
public class JTableRowSelectProgramatically extends JPanel {

    public MyTableModel MyTableModel;

    public String Cell1 = "ABCD";

    public JTableRowSelectProgramatically() {
        initializePanel();
    }

    private void initializePanel() {

        setLayout(null);
        setPreferredSize(new Dimension(1250, 700));

        // Table model
        MyTableModel = new MyTableModel();

        // Table
        final JTable table = new JTable(MyTableModel);
        table.setFillsViewportHeight(true);

        // Row data
        Object[] values = {Cell1, "EFGH", "IJKL", new Boolean(false)};
        Object[] values2 = {"UVWX","QRST","MNOP", new Boolean(false)};
        Object[] values3 = {"ABCD","YZAB","CDEF", new Boolean(false)};
        final Object[] values4 = {"QWERTY","YTREWQ","QWERTY", new Boolean(false)};

        // Insert row data
        MyTableModel CustomTableModel = (MyTableModel) table.getModel();
        CustomTableModel.insertData(values);
        CustomTableModel.insertData(values2);
        CustomTableModel.insertData(values3);
        CustomTableModel.insertData(values);
        CustomTableModel.insertData(values2);
        CustomTableModel.insertData(values3);
        CustomTableModel.insertData(values);
        CustomTableModel.insertData(values2);
        CustomTableModel.insertData(values3);

        // Create edit menu label
        JLabel labelEditMenu = new JLabel("EDIT MENU:\n");

        // Create add row btn
        JButton addRow = new JButton("Add Row");

        // Attach listener for add row btn
        addRow.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                MyTableModel.insertData(values4);
            }
        });

        // Create delete row btn
        JButton deleteRow = new JButton("Delete Row");

        // Attach listener for delete btn
        deleteRow.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                MyTableModel.removeRow(1);
            }
        });

        // Create scroll pane
        JScrollPane pane = new JScrollPane(table);
        pane.setBounds(30, 30, 500, 500);

        // 
        JTextField AgentIDTextField = new JTextField();

        // Populate the JPanel
        JPanel dataEntryPanel = new JPanel(new FlowLayout());
        //dataEntryPanel.setBackground(Color.orange);
        dataEntryPanel.setBounds(540, 30, 500, 50);
        //dataEntryPanel.add(AgentIDTextField);
        dataEntryPanel.add(labelEditMenu);
        dataEntryPanel.add(addRow);
        dataEntryPanel.add(deleteRow);

        // Join up GUI
        add(pane);
        add(dataEntryPanel);
    }

    // Enable visibity of frame
    public static void showFrame() {
        JPanel panel = new JTableRowSelectProgramatically();

        JFrame frame = new JFrame("Test table");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(panel);
        frame.pack();
        frame.setVisible(true);
    }

    // Launch prog
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JTableRowSelectProgramatically.showFrame();
            }
        });
    }

    // Create custom table model for data entry
    class MyTableModel extends AbstractTableModel {

         private String[] columnNames = {"COLUMN 0", "COLUMN 1", "COLUMN 2", "COLUMN 3"};
         private Vector data = new Vector();

         @Override
         public int getRowCount() {
            return data.size();
         }

         @Override
         public int getColumnCount() {
             return columnNames.length;
         }

         @SuppressWarnings("rawtypes")
        @Override
         public Object getValueAt(int row, int col) {
             return ((Vector) data.get(row)).get(col);
         }

         public String getColumnName(int col){
             return columnNames[col];
         }

         public Class getColumnClass(int c){
             return getValueAt(0,c).getClass();
         }

         public void setValueAt(Object value, int row, int col){
             ((Vector) data.get(row)).setElementAt(value, col);
             fireTableCellUpdated(row,col);
         }

         public boolean isCellEditable(int row, int col){
             if (3 == col){
                 return true;
             }
             else {
                return false;
             }
         }

         public void insertData(Object[] values){
             data.add(new Vector());

             for(int i =0; i<values.length; i++){

                 System.out.println("data.size is: " + data.size());
                 ((Vector) data.get(data.size()-1)).add(values[i]);
             }

             fireTableDataChanged();
         }

         public void removeRow(int row){
             data.removeElementAt(row);
             fireTableDataChanged();
         }
     }
}

删除JTable行的新尝试:

 public void deleteRow() {
 for (int i = 0; i < getRowCount(); i++) {

     Object columnState = getValueAt(i, 3);

     System.out.println("STEP 6 - In row " + i + " boolean value is: " + columnState);

     boolean columnStateAsBoolean = (Boolean) columnState;

     System.out.println("STEP 6 - In row " + i + " Column State As Boolean is: " + columnStateAsBoolean);

     if(columnStateAsBoolean == true) {
         removeRow(i);                   
     }

     System.out.println("-------------------------------------");
 }

}

2 个答案:

答案 0 :(得分:4)

  

我真的想做的是删除基于布尔状态的几行或复选框

创建一个从最后一行开始并向下计数到0的循环。

然后对于每一行,使用table.getValueAt(...)方法获取列的布尔值。

如果值为true,则删除该行。

答案 1 :(得分:0)

//尝试这样的事情

    int rowCount=table.getSelectedRowCount();//get selected row's count
    int row;
    if(rowCount>0)
    {
       while((row=table.getSelectedRow())!=-1)
        (DefaultTableModel)table.getModel().removeRow(table.convertRowIndexToModel(row));

    }