java - 如何删除 jtable 中的所有行?

标签 java swing jtable actionlistener selectionmodel

我有一个带有 listselectionlistener 的 jtable 我可以动态地将新行添加到我的表中,当我选择该行时,所选行的内容将出现在文本框中我可以编辑和删除数据,对于我的应用程序我将表数据存储到 xml 文件中,当我添加新行时,它将成功添加到表中。但是当我选择一行并且更新意味着表没有得到更新(这里我调用加载表())。(但更新的值在 xml 文件中正确更改) 这是我创建表的示例代码*

    ListSelectionModel selectionModel;
    JTable table1;
    model = new DefaultTableModel();
    table = new JTable(model);       table.setRowHeight(20);
    selectionModel = table.getSelectionModel();                  
    selectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

 selectionModel.addListSelectionListener(new ListSelectionListener() {
        public void valueChanged(ListSelectionEvent e) {

            stxtBox.setText("");
            ptxtBox.setText("");
            ntxtBox.setText("");

            if (!e.getValueIsAdjusting()) {



             model1 = table.getSelectionModel();
                int lead = model1.getLeadSelectionIndex();
                int columns = table.getColumnCount();
                String sip = "";
                String sport = "";
                String snoq = "";
                for (int col = 0; col < columns; col++) {
                    Object o = table.getValueAt(lead, col);

                    if (col == 0) {
                        sip += o.toString();
                        stxtBox.setText(sip);
                        selectedip = sip;

                    } else if (col == 1) {

                        sport += o.toString();
                        ptxtBox.setText(sport);
                        selectedport = sport;
                    } else {

                        snoq += o.toString();
                        ntxtBox.setText(snoq);
                    }
                    selectedreq = snoq;

                }



            }table.clearSelection();
        }
    });

我像这样加载表格内容

  int rowCount=0;

            File file = new File("serverconfig.xml");

            if (file.exists())

            {

                System.out.print("in load");
                int e = table.getRowCount();

                if(e> 0)
                {

                while (table.getRowCount() > 0) {
                    ((DefaultTableModel) table.getModel()).removeRow(0);
                }

                }

//here i will load table content from my xml file (that's working fine)

问题是当我更新我的表内容时,我将调用 loadtable() 函数,每次我都会收到此错误

java.lang.ArrayIndexOutOfBoundsException: 1 >= 1
    at java.util.Vector.elementAt(Unknown Source)
    at javax.swing.table.DefaultTableModel.getValueAt(Unknown Source)
    at javax.swing.JTable.getValueAt(Unknown Source)
    at Testsample$18.valueChanged(Testsample.java:1810)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
    at javax.swing.DefaultListSelectionModel.insertIndexInterval(Unknown Source)
    at javax.swing.JTable.tableRowsInserted(Unknown Source)
    at javax.swing.JTable.tableChanged(Unknown Source)
    at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)
    at javax.swing.table.AbstractTableModel.fireTableRowsInserted(Unknown Source)
    at javax.swing.table.DefaultTableModel.insertRow(Unknown Source)
    at javax.swing.table.DefaultTableModel.addRow(Unknown Source)
    at javax.swing.table.DefaultTableModel.addRow(Unknown Source)
    at Testsample.loadtable(Testsample.java:577)
    at Testsample$10.actionPerformed(Testsample.java:1551)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)

最佳答案

老话:如果有高级 api 可以达到目标,永远不要使用较低级别的。或者可能是一个相关的故事:一遍又一遍地阅读 api 文档 :-)

对于 DefaultTableModel,删除所有行的高级 API 是:

model.setRowCount(0); 

编辑

查看您的堆栈跟踪,错误不是由删除引起的,而是由访问新添加的行引起的。我的(随机的,没有看到更多或您的代码 :-) 猜测是 rowIndex lead

Object o = table.getValueAt(lead, col);

你必须检查它是否有效,可能是负数(无引导)或仍然是旧的(添加前的索引)请注意,选择状态是由于在 tableModel 中添加/删除数据而更新的(以及如通过用户交互)这里的重要规则是确保在访问客户端代码中的任何状态之前,模型更改后表的内部结构得到更新。您可以通过将其包装在 invokeLater 中来实现:

void updateTextBox() {
    if (selectionModel.getLeadSelectionIndex() >= table.getRowCount() ||
        selectionModel.getLeadSelectionIndex() < 0) return;
    .... // update text panel here
}

public void valueChanged(...) {
    if (e.getValueIsAdjusting()) return;
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
           updateTextBox();
        }
    }));
}

关于java - 如何删除 jtable 中的所有行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11625755/

相关文章:

java - org.hsqldb.HsqlException : unexpected token: WITH

java - 当我完成结果的 Activity 时调用 OnCreate 和 onActivityResult

java - JTattoo 出现在 JMenu 下拉列表中

java - JTable 根据不在表中的属性对行进行排序

java - 使用java在SQL Server中进行动态搜索

java - 我需要一个 tomcat 服务器来使 java jdbc swing 应用程序在 lan 上运行吗

java - 如何检索并将检索到的巨大字符串数据设置为 swing 中的 JTextArea?

java - 如何使 Swing jTable 单元格在 View 和内联编辑状态下都显示 "YY-MM-DD"格式的日期对象?

java - JTable AutoCreateRowSorter 将数字排序为字符串

java - Minecraft 模组出现 Missingtexture 错误