Удаление строки JTable

Я работаю над 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("-------------------------------------");
 }

}


person TokTok123    schedule 19.03.2013    source источник
comment
Добро пожаловать в StackOverflow! StackOverlow — это сообщество разработчиков, которые помогают отвечать на объективные вопросы, касающиеся разработки программного обеспечения. В его нынешнем состоянии ваш вопрос немного неоднозначен. Я бы рекомендовал сократить ваш вопрос и код, указав только то, что имеет отношение к вашему конкретному вопросу, а также включить что вы уже пробовали. Вы также можете попробовать прочитать FAQ. Удачи!   -  person Zach Latta    schedule 19.03.2013
comment
@zachlatta Есть вопрос, если вы собираетесь внимательно читать.   -  person Smit    schedule 19.03.2013
comment
Смит: Это большая двусмысленность. OP не включает то, что они пробовали до сих пор, а пример кода слишком длинный для такого вопроса.   -  person Zach Latta    schedule 19.03.2013
comment
ЛЮБЫЕ ПРЕДЛОЖЕНИЯ ОЧЕНЬ ЦЕННЫ!!!! 1) Хватит КРИЧАТЬ на нас! 2) Исправить застрявший '!' ключ.   -  person Andrew Thompson    schedule 19.03.2013
comment
‹скрипя зубами›.... несвязанные: а) не выполняйте ручное определение размера/локации никогда, это исключительная задача подходящего менеджера макетов б) Изучите соглашения об именах в Java и придерживайтесь их.   -  person kleopatra    schedule 19.03.2013
comment
... и всегда запускайте наиболее целенаправленное событие, то есть rowsRemoved/rowsInserted (вместо dataChanged) в remove/insertRows   -  person kleopatra    schedule 19.03.2013


Ответы (2)


Я действительно хочу сделать, это удалить несколько строк на основе логических состояний или флажков

создайте цикл, который начинается с последней строки и ведет обратный отсчет до 0.

Затем для каждой строки вы используете метод table.getValueAt(...) для получения логического значения столбца.

Если значение истинно, удалите строку.

person camickr    schedule 19.03.2013
comment
@che .. пожалуйста, что ты имел в виду +1 для начала в последней строке .. я где-то ошибаюсь в своем цикле .. я изменил свое сообщение, чтобы включить мою новую попытку .. - person TokTok123; 20.03.2013
comment
Совет состоял в том, чтобы начать с последней строки и считать до 0. Ваш код начинается с 0 и считает до последней строки. - person camickr; 20.03.2013
comment
Удаление @AMonari должно начинаться с последней строки .. вместо того, чтобы начинаться с другой строки. - person Amarnath; 20.03.2013

//Попробуйте что-то вроде этого

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

    }
person Prinz Km    schedule 10.08.2014