lcy_1024 2014-05-07 16:10 采纳率: 0%
浏览 1366

Swing Jtble 排序后,表格数据无法刷新

(源代码文件Test.java在最后已附上)
操作描述:
1.添加 -> 刷新
2.点击表头进行排序
3.清空 -> 刷新
4.刷新按钮失效,会报错,如何解决?(如果不点击表头排序,则功能正常)

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
at java.util.Vector.elementAt(Vector.java:470)
at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:649)
at javax.swing.JTable.getValueAt(JTable.java:2720)
at javax.swing.JTable.prepareRenderer(JTable.java:5718)
at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2114)
at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:2016)
at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1812)
at javax.swing.plaf.ComponentUI.update(ComponentUI.java:161)
at javax.swing.JComponent.paintComponent(JComponent.java:778)
at javax.swing.JComponent.paint(JComponent.java:1054)
at javax.swing.JComponent.paintChildren(JComponent.java:887)
at javax.swing.JComponent.paint(JComponent.java:1063)
at javax.swing.JViewport.paint(JViewport.java:731)
at javax.swing.JComponent.paintChildren(JComponent.java:887)
at javax.swing.JComponent.paint(JComponent.java:1063)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5221)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1482)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1413)
at javax.swing.RepaintManager.paint(RepaintManager.java:1206)
......

整个测试代码文件如下:
Test.java

package examples;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Vector;

public class Test extends javax.swing.JFrame {

private Vector<Vector> tblDate; // 表数据
private Vector<String> tblHeaders; // 表头
private List<Integer> list; // 数据源

public Test() {
    tblDate = new Vector<Vector>();
    tblHeaders = new Vector<String>();
    list = new ArrayList<Integer>();
    tblHeaders.add("编号");
    tblHeaders.add("数据");

    initComponents();
    setLocationRelativeTo(null);
}

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
    // 添加
    list.add(list.size());
}

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
    // 清空
    list.clear();
}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    // 刷新
    tblDate.clear();

    for (int i : list) {
        tblDate.add(new Vector(Arrays.asList(i, "测试数据" + i)));
    }

    jTable1.repaint();
    jTable1.updateUI();
}

// 下面都是NetBeans自动生成代码,不要管
public static void main(String args[]) {
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info
                : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (Exception ex) {
        // TODO
    }

    java.awt.EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            new Test().setVisible(true);
        }
    });
}

@SuppressWarnings("unchecked")
private void initComponents() {
    jScrollPane1 = new javax.swing.JScrollPane();
    jTable1 = new javax.swing.JTable();
    jButton1 = new javax.swing.JButton();
    jButton2 = new javax.swing.JButton();
    jButton3 = new javax.swing.JButton();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jTable1.setModel(new javax.swing.table.DefaultTableModel(
            this.tblDate, this.tblHeaders
    ));
    jTable1.setAutoCreateRowSorter(true);
    jScrollPane1.setViewportView(jTable1);

    jButton2.setText("添加");
    jButton2.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton2ActionPerformed(evt);
        }
    });

    jButton3.setText("清空");
    jButton3.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton3ActionPerformed(evt);
        }
    });

    jButton1.setText("刷新");
    jButton1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton1ActionPerformed(evt);
        }
    });

    javax.swing.GroupLayout layout = new javax.swing
    .GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout
                            .Alignment.LEADING)
                            .addComponent(jScrollPane1, javax.swing.GroupLayout
                                    .PREFERRED_SIZE, 0, Short.MAX_VALUE)
                            .addGroup(layout.createSequentialGroup()
                                    .addGap(0, 168, Short.MAX_VALUE)
                                    .addComponent(jButton2)
                                    .addGap(18, 18, 18)
                                    .addComponent(jButton3)
                                    .addGap(18, 18, 18)
                                    .addComponent(jButton1)))
                    .addContainerGap())
    );
    layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(jScrollPane1,
                            javax.swing.GroupLayout.DEFAULT_SIZE, 190, Short
                                    .MAX_VALUE)
                    .addGap(18, 18, 18)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout
                            .Alignment.BASELINE)
                            .addComponent(jButton1)
                            .addComponent(jButton2)
                            .addComponent(jButton3))
                    .addContainerGap())
    );

    pack();
}

private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JButton jButton3;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTable jTable1;
}
  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-02 01:34
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    从您提供的代码中,我们可以看到有一个ArrayIndexOutOfBoundsException异常被抛出。这通常发生在尝试访问数组中的元素时,但索引超出范围的情况。

    要解决这个问题,我们需要确保我们的tblDatetblHeaders变量的大小是相匹配的,并且它们包含正确的行数。此外,我们还需要检查用户是否正确地选择了表头进行排序。

    以下是一个可能的解决方案:

    1. jButton1ActionPerformed方法中添加一个判断来检查用户的输入是否有效。
    2. jButton2ActionPerformed方法中添加一个循环来处理所有选择的行。

    这是一个修改后的Test类示例:

    private boolean isHeaderSelected(int index) {
        return index == 0 || index == 1; // Check if the selected header is either the first or second column.
    }
    
    private void addLineIfValid(int rowNumber, int columnIndex) {
        if (!isHeaderSelected(columnIndex)) {
            tblDate.add(new Vector(Arrays.asList(rowNumber, "测试数据" + rowNumber)));
        }
    }
    
    private void handleAddActionPerformed(ActionEvent e) {
        // Add a line to the table when 'Add' button is clicked
        int rowIndex = list.size(); // Get the current row number from the list
        int columnIndex = 0; // Set the default column as the first one
        addLineIfValid(rowIndex, columnIndex); // Add a valid line with the given parameters
    }
    
    private void handleRefreshActionPerformed(ActionEvent e) {
        // Refresh the table by clearing and re-populating it with data
        tblDate.clear();
        for (int i : list) {
            tblDate.add(new Vector(Arrays.asList(i, "测试数据" + i)));
        }
        jTable1.repaint();
        jTable1.updateUI();
    }
    

    在这个解决方案中,我们首先检查用户是否选择了有效的列标题。如果选择了无效的列标题,我们将跳过此操作并返回。然后,我们在handleAddActionPerformed方法中处理用户的选择。当用户单击'Add'按钮时,我们获取当前列表中的行号,并使用这个值来确定应该将哪个列作为第一列。接着,我们调用addLineIfValid方法来添加一行到表格中。addLineIfValid方法根据传入的行号和列号来决定是否应添加新行。如果列号不为0或1(即不是第一个或第二个列),则表示用户没有选中有效的列标题,因此我们跳过此操作并返回。

    希望这个解决方案能帮助您解决问题!如果您有其他问题,请随时提问。

    评论

报告相同问题?