问题描述: 使用JComboBox过滤JTable会生成ArrayIndexOutOfBoundsException。
回答: ArrayIndexOutOfBoundsException是一个Java异常,表示数组访问越界。在使用JComboBox过滤JTable时,如果没有正确处理数组索引,就有可能导致这个异常的出现。
解决这个问题的方法是在过滤JTable时,确保选择的过滤条件在表格数据的范围内。可以通过以下步骤来实现:
以下是一个示例代码,演示如何使用JComboBox过滤JTable:
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方法来设置行过滤器。
对于腾讯云相关产品和产品介绍链接地址,可以参考腾讯云官方文档或者咨询腾讯云的客服人员获取更详细的信息。
领取专属 10元无门槛券
手把手带您无忧上云