首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用JComboBox过滤JTable会生成ArrayIndexOutOfBoundsException

问题描述: 使用JComboBox过滤JTable会生成ArrayIndexOutOfBoundsException。

回答: ArrayIndexOutOfBoundsException是一个Java异常,表示数组访问越界。在使用JComboBox过滤JTable时,如果没有正确处理数组索引,就有可能导致这个异常的出现。

解决这个问题的方法是在过滤JTable时,确保选择的过滤条件在表格数据的范围内。可以通过以下步骤来实现:

  1. 获取JComboBox的选中项,作为过滤条件。
  2. 遍历JTable的每一行数据。
  3. 对于每一行数据,获取需要过滤的列的值。
  4. 将获取到的值与过滤条件进行比较。
  5. 如果值与过滤条件匹配,则显示该行数据;否则,隐藏该行数据。
  6. 更新JTable的显示。

以下是一个示例代码,演示如何使用JComboBox过滤JTable:

代码语言:txt
复制
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;

public class TableFilterExample extends JFrame {
    private JComboBox<String> filterComboBox;
    private JTextField filterTextField;
    private JTable table;
    private DefaultTableModel tableModel;

    public TableFilterExample() {
        setTitle("JTable Filter Example");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        // 创建过滤条件的下拉框
        filterComboBox = new JComboBox<>();
        filterComboBox.addItem("Option 1");
        filterComboBox.addItem("Option 2");
        filterComboBox.addItem("Option 3");
        filterComboBox.addItem("Option 4");

        // 创建过滤关键字的文本框
        filterTextField = new JTextField();
        filterTextField.getDocument().addDocumentListener(new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent e) {
                filterTable();
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                filterTable();
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                filterTable();
            }
        });

        // 创建表格和表格模型
        table = new JTable();
        tableModel = new DefaultTableModel();
        table.setModel(tableModel);

        // 添加组件到界面
        JPanel filterPanel = new JPanel();
        filterPanel.add(new JLabel("Filter by:"));
        filterPanel.add(filterComboBox);
        filterPanel.add(new JLabel("Keyword:"));
        filterPanel.add(filterTextField);

        add(filterPanel, BorderLayout.NORTH);
        add(new JScrollPane(table), BorderLayout.CENTER);

        // 添加示例数据到表格
        tableModel.addColumn("Column 1");
        tableModel.addColumn("Column 2");
        tableModel.addColumn("Column 3");

        Object[] row1 = {"Data 1", "Data 2", "Data 3"};
        Object[] row2 = {"Data 4", "Data 5", "Data 6"};
        Object[] row3 = {"Data 7", "Data 8", "Data 9"};

        tableModel.addRow(row1);
        tableModel.addRow(row2);
        tableModel.addRow(row3);

        pack();
        setVisible(true);
    }

    private void filterTable() {
        String filterOption = (String) filterComboBox.getSelectedItem();
        String keyword = filterTextField.getText().toLowerCase();

        for (int row = 0; row < tableModel.getRowCount(); row++) {
            boolean match = false;

            for (int column = 0; column < tableModel.getColumnCount(); column++) {
                String cellValue = tableModel.getValueAt(row, column).toString().toLowerCase();

                if (filterOption.equals("Option 1")) {
                    if (cellValue.contains(keyword)) {
                        match = true;
                        break;
                    }
                } else if (filterOption.equals("Option 2")) {
                    if (cellValue.startsWith(keyword)) {
                        match = true;
                        break;
                    }
                } else if (filterOption.equals("Option 3")) {
                    if (cellValue.endsWith(keyword)) {
                        match = true;
                        break;
                    }
                } else if (filterOption.equals("Option 4")) {
                    if (cellValue.equals(keyword)) {
                        match = true;
                        break;
                    }
                }
            }

            if (match) {
                table.getRowSorter().setRowFilter(null);
                tableModel.setValueAt(true, row, tableModel.getColumnCount());
            } else {
                table.getRowSorter().setRowFilter(new RowFilter<DefaultTableModel, Integer>() {
                    @Override
                    public boolean include(Entry<? extends DefaultTableModel, ? extends Integer> entry) {
                        return false;
                    }
                });
                tableModel.setValueAt(false, row, tableModel.getColumnCount());
            }
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(TableFilterExample::new);
    }
}

在这个示例中,我们创建了一个包含过滤条件的下拉框和一个用于输入过滤关键字的文本框。当用户选择过滤条件和输入关键字时,表格会根据这些条件进行过滤,并更新显示结果。

这个示例中使用了DefaultTableModel作为表格模型,通过调用setValueAt方法来设置每一行是否匹配过滤条件。同时,使用了JTable的getRowSorter方法来获取表格的排序器,并通过setRowFilter方法来设置行过滤器。

对于腾讯云相关产品和产品介绍链接地址,可以参考腾讯云官方文档或者咨询腾讯云的客服人员获取更详细的信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券