Java 通过JTable从ArrayList中删除项

Java 通过JTable从ArrayList中删除项,java,swing,arraylist,error-handling,jtable,Java,Swing,Arraylist,Error Handling,Jtable,我有一个JTable,其中包括ArrayList中的项目,但是每当我试图从ArrayList中删除已删除行的内容时,我会得到一个索引自动边界异常,这取决于我想要删除的行的数量及其位置。我将如何着手解决这个问题 可运行代码: remove.addActionListener(e->{ int k=0; int[]行=table.getSelectedRows(); TableModelTM=table.getModel(); 而(行数.长度>0) { 而(k基本上,当你删除一行时,所有的索引都会

我有一个
JTable
,其中包括
ArrayList
中的项目,但是每当我试图从
ArrayList
中删除已删除行的内容时,我会得到一个
索引自动边界异常
,这取决于我想要删除的行的数量及其位置。我将如何着手解决这个问题

可运行代码:

remove.addActionListener(e->{
int k=0;
int[]行=table.getSelectedRows();
TableModelTM=table.getModel();
而(行数.长度>0)
{ 

而(k基本上,当你删除一行时,所有的索引都会改变。所以你需要做的是,复制所有选定的行,但不是索引,而是实际的行值

JTable table = getTable();
if (table.getSelectedRowCount() > 0) {
    List<Vector> selectedRows = new ArrayList<>(25);
    DefaultTableModel model = getModel();
    Vector rowData = model.getDataVector();
    for (int row : table.getSelectedRows()) {
        int modelRow = table.convertRowIndexToModel(row);
        Vector rowValue = (Vector) rowData.get(modelRow);
        selectedRows.add(rowValue);
    }

不关心值的索引是什么。

基本上,当您删除一行时,所有索引都会更改。因此,您需要做的是复制所有选定的行,但不是索引,而是实际的行值

JTable table = getTable();
if (table.getSelectedRowCount() > 0) {
    List<Vector> selectedRows = new ArrayList<>(25);
    DefaultTableModel model = getModel();
    Vector rowData = model.getDataVector();
    for (int row : table.getSelectedRows()) {
        int modelRow = table.convertRowIndexToModel(row);
        Vector rowValue = (Vector) rowData.get(modelRow);
        selectedRows.add(rowValue);
    }

不关心值的索引是什么。

如果从模型的开头删除行,索引将更改

一种解决方案是一次删除一行,所有选定的索引都将重置,以便始终删除适当的索引:

下面是一个示例,说明如何为JList和JTable执行此操作:

import java.awt.*;
import java.awt.event.*;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.*;
import javax.swing.table.*;

public class ItemDeletion extends JPanel
{
    private JList<String> list;
    private JTable table;

    public ItemDeletion()
    {
        setLayout( new BorderLayout(5, 5) );

        String[] items =
        {
            "One",
            "Two",
            "Three",
            "Four",
            "Five",
            "Six",
            "Seven",
            "Eight",
            "Nine",
            "Ten"
        };

        //  Add the list

        DefaultListModel<String> listModel = new DefaultListModel<String>();

        for (String item: items)
            listModel.addElement( item );

        list = new JList<String>( listModel );


        JButton listDelete = new JButton( "Delete From List" );
        listDelete.addActionListener( new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                DefaultListModel model = (DefaultListModel)list.getModel();
                int row = list.getSelectedIndex();

                while (row != -1)
                {
                    model.removeElementAt( row );
                    row = list.getSelectedIndex();
                }
            }
        });

        JPanel listPanel = new JPanel( new BorderLayout(5, 5) );
        listPanel.add(new JScrollPane( list ), BorderLayout.CENTER);
        listPanel.add(listDelete, BorderLayout.PAGE_END);

        //  Add the table

        DefaultTableModel tableModel = new DefaultTableModel(0, 1);
        List<String> tableItems = Arrays.asList( items );
        Collections.shuffle( tableItems );

        for (String item: tableItems)
        {
            System.out.println( item );
            tableModel.addRow( new String[]{item} );
        }

        table = new JTable( tableModel );

        table.setAutoCreateRowSorter(true);
        ((DefaultRowSorter)table.getRowSorter()).toggleSortOrder(0);

        JButton tableDelete = new JButton( "Delete From Table" );
        tableDelete.addActionListener( new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                DefaultTableModel model = (DefaultTableModel)table.getModel();
                int row = table.getSelectedRow();

                while (row != -1)
                {
                    int modelRow = table.convertRowIndexToModel( row );
                    model.removeRow( modelRow );
                    row = table.getSelectedRow();
                }
            }
        });

        JPanel tablePanel = new JPanel( new BorderLayout(5, 5) );
        tablePanel.add(new JScrollPane( table ), BorderLayout.CENTER);
        tablePanel.add(tableDelete, BorderLayout.PAGE_END);

        add(listPanel, BorderLayout.LINE_START);
        add(tablePanel, BorderLayout.LINE_END);
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("Multiple Item Deletion");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new ItemDeletion(), BorderLayout.NORTH);
        frame.setLocationByPlatform( true );
        frame.pack();
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
    }
}
import java.awt.*;
导入java.awt.event.*;
导入java.util.array;
导入java.util.ArrayList;
导入java.util.Collections;
导入java.util.List;
导入javax.swing.*;
导入javax.swing.table.*;
公共类ItemDelete扩展了JPanel
{
私人名单;
专用JTable表;
公共项目删除()
{
setLayout(新边界布局(5,5));
字符串[]项=
{
“一个”,
“两个”,
“三”,
“四”,
“五个”,
“六”,
“七”,
“八”,
“九”,
“十”
};
//添加列表
DefaultListModel listModel=新的DefaultListModel();
用于(字符串项:项)
listModel.addElement(项目);
列表=新JList(列表模型);
JButton listDelete=新JButton(“从列表中删除”);
listDelete.addActionListener(新ActionListener()
{
@凌驾
已执行的公共无效操作(操作事件e)
{
DefaultListModel=(DefaultListModel)list.getModel();
int row=list.getSelectedIndex();
while(行!=-1)
{
模型移除组件(世界其他地区);
row=list.getSelectedIndex();
}
}
});
JPanel列表面板=新的JPanel(新的BorderLayout(5,5));
添加(新的JScrollPane(列表),BorderLayout.CENTER);
listPanel.add(listDelete,BorderLayout.PAGE_END);
//添加表格
DefaultTableModel tableModel=新的DefaultTableModel(0,1);
List tableItems=Arrays.asList(items);
集合。洗牌(表项);
用于(字符串项:tableItems)
{
系统输出打印项次(项);
addRow(新字符串[]{item});
}
table=新的JTable(tableModel);
表.setAutoCreateRowSorter(真);
((DefaultRowSorter)table.getRowSorter()).toggleSortOrder(0);
JButton tableDelete=新JButton(“从表中删除”);
tableDelete.addActionListener(新ActionListener()
{
@凌驾
已执行的公共无效操作(操作事件e)
{
DefaultTableModel=(DefaultTableModel)table.getModel();
int row=table.getSelectedRow();
while(行!=-1)
{
int modelRow=table.convertRowIndexToModel(行);
model.removeRow(modelRow);
行=表。getSelectedRow();
}
}
});
JPanel tablePanel=新的JPanel(新的边界布局(5,5));
添加(新的JScrollPane(表),BorderLayout.CENTER);
tablePanel.add(tableDelete,BorderLayout.PAGE_END);
添加(listPanel,BorderLayout.LINE_START);
添加(tablePanel,BorderLayout.LINE_END);
}
私有静态void createAndShowGUI()
{
JFrame frame=新JFrame(“多项目删除”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(newitemdelection(),BorderLayout.NORTH);
frame.setLocationByPlatform(真);
frame.pack();
frame.setVisible(true);
}
公共静态void main(字符串[]args)
{
invokeLater(新的Runnable()
{
公开募捐
{
createAndShowGUI();
}
});
}
}

如果从模型开头删除行,索引将更改

一种解决方案是一次删除一行,所有选定的索引都将重置,以便始终删除适当的索引:

下面是一个示例,说明如何为JList和JTable执行此操作:

import java.awt.*;
import java.awt.event.*;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.*;
import javax.swing.table.*;

public class ItemDeletion extends JPanel
{
    private JList<String> list;
    private JTable table;

    public ItemDeletion()
    {
        setLayout( new BorderLayout(5, 5) );

        String[] items =
        {
            "One",
            "Two",
            "Three",
            "Four",
            "Five",
            "Six",
            "Seven",
            "Eight",
            "Nine",
            "Ten"
        };

        //  Add the list

        DefaultListModel<String> listModel = new DefaultListModel<String>();

        for (String item: items)
            listModel.addElement( item );

        list = new JList<String>( listModel );


        JButton listDelete = new JButton( "Delete From List" );
        listDelete.addActionListener( new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                DefaultListModel model = (DefaultListModel)list.getModel();
                int row = list.getSelectedIndex();

                while (row != -1)
                {
                    model.removeElementAt( row );
                    row = list.getSelectedIndex();
                }
            }
        });

        JPanel listPanel = new JPanel( new BorderLayout(5, 5) );
        listPanel.add(new JScrollPane( list ), BorderLayout.CENTER);
        listPanel.add(listDelete, BorderLayout.PAGE_END);

        //  Add the table

        DefaultTableModel tableModel = new DefaultTableModel(0, 1);
        List<String> tableItems = Arrays.asList( items );
        Collections.shuffle( tableItems );

        for (String item: tableItems)
        {
            System.out.println( item );
            tableModel.addRow( new String[]{item} );
        }

        table = new JTable( tableModel );

        table.setAutoCreateRowSorter(true);
        ((DefaultRowSorter)table.getRowSorter()).toggleSortOrder(0);

        JButton tableDelete = new JButton( "Delete From Table" );
        tableDelete.addActionListener( new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                DefaultTableModel model = (DefaultTableModel)table.getModel();
                int row = table.getSelectedRow();

                while (row != -1)
                {
                    int modelRow = table.convertRowIndexToModel( row );
                    model.removeRow( modelRow );
                    row = table.getSelectedRow();
                }
            }
        });

        JPanel tablePanel = new JPanel( new BorderLayout(5, 5) );
        tablePanel.add(new JScrollPane( table ), BorderLayout.CENTER);
        tablePanel.add(tableDelete, BorderLayout.PAGE_END);

        add(listPanel, BorderLayout.LINE_START);
        add(tablePanel, BorderLayout.LINE_END);
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("Multiple Item Deletion");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new ItemDeletion(), BorderLayout.NORTH);
        frame.setLocationByPlatform( true );
        frame.pack();
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
    }
}
import java.awt.*;
导入java.awt.event.*;
导入java.util.array;
导入java.util.ArrayList;
导入java.util.Collections;
导入java.util.List;
导入javax.swing.*;
导入javax.swing.table.*;
公共类ItemDelete扩展了JPanel
{
私人名单;
专用JTable表;
公共项目删除()
{
setLayout(新边界布局(5,5));
字符串[]项=
{
“一个”,
“两个”,
“三”,
“四”,
“五个”,
“六”,
“七”,
“八”,
“九”,
“十”
};
//添加列表
DefaultListModel listModel=新的DefaultListModel();
用于(字符串项:项)
listModel.addElement(项目);
列表=ne