首页
学习
活动
专区
工具
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方法来设置行过滤器。

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

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

相关·内容

「旅游信息管理系统」 · Java Swing + MySQL 开发「建议收藏」

业务流程及系统概念模型如下: 游客: 业务管理员: 旅游业务模型: 整体概要设计: 二、界面示例: 首页: 点击报名:如果没有登录提示游客登录 登录界面: 注册界面: 报名: 报名信息管理界面: 报名信息导出生成...游客: 业务管理员: 旅游业务模型: 整体概要设计: 二、界面示例: 首页: 点击报名:如果没有登录提示游客登录 登录界面: 注册界面: 报名: 报名信息管理界面: 报名信息导出生成...,0,1); if(result == JOptionPane.OK_OPTION){ JOptionPane.showMessageDialog(null, "已退出系统,欢迎下次使用...欢迎使用!")...comboBox_sez = new JComboBox(); comboBox_sez.setModel(new DefaultComboBoxModel(new String[] {"男",

2.7K20

脏读,不可重复读,幻读

使用select @@tx_isolation; 命令可以查看MySQL默认的事务隔离级别: ? 每个事务隔离级别导致的数据现象: ?...Serializable级别: 完全串行化的读,每次读都需要获得表级共享锁,读写相互相互互斥,这样可以更好的解决数据一致性的问题,但是同样大大的降低数据库的实际吞吐性能。...例如假设在购买车票的时候,你一开始明明查询只有三张票,但是一再查一次就发现多了五张票,这就是幻读的现象。... table; private JComboBox comboBox;   /**  * Launch the application  *   * @param args  */ public static..., 724, 234); panel.add(scrollPane);   cols.add("编号"); cols.add("类型"); cols.add("铺位");   table = new JTable

1.7K10

JavaSwing 图形界面GUI王者级开发(大纲)

JTextField(文本框) JavaSwing_2.7: JPasswordField(密码框) JavaSwing_2.8: JTextArea(文本区域) JavaSwing_2.9: JComboBox...JavaSwing_4.5: JMenuBar(菜单栏) JavaSwing_4.6: JToolBar(工具栏) JavaSwing_4.7: JPopupMenu(弹出菜单) JavaSwing_4.8: JTable...JavaSwing_5.5: 拖拽功能 JavaSwing_5.6: 系统托盘(System Tray) JavaSwing_5.7: 闪屏(Splash Screen) 6 其他相关 Java绘图: 使用...Graphics类绘制线段、矩形、椭圆/圆弧/扇形、图片、文本 Java图片操作 — 图片的读取、绘制、缩放、裁剪、保存 Java代码截屏:使用 Java 代码截取电脑屏幕并保存 Java模拟鼠标键盘输入事件...— Robot 类 Java操作桌面应用 — Desktop 类 Java操作系统剪贴板(Clipboard)实现复制和粘贴 7 更多操作 如何在Swing组件中使用HTML 8 事件及其监听器

1.3K10

java swing 添加 jcheckbox复选框

值得一提的是在这七个构造方法中,设计器(如果您使用了MyEclipse)使用的是JTable(TableModel dm)这个版本。...而一般情况使用JTable(Vector rowData,Vector columnNames)       在Java方法中,如果参数需要传递接口,可以在调用方法时传递一个(匿名)对象,该对象是一个不具名的类的实例...比如上面的例子JTable(TableModel dm),这是JTable的构造方法,需要的是一个TableModel接口类型的参数(这里只是举例,实际运用比较复杂),我们可以使用如下写法:JTable...在详细说明之前先解释一下JTable的显示原理:       首先是数据来源,您使用JTable的构造方法,大部分重载中参数即包含了数据,比如JTable(VectorrowData, Vector columnNames...66 66 * 此方法用于向方法调用者返回某一单元格的渲染器(即显示数据的组建--或控件) 67 67 * 可以为JCheckBox JComboBox

3.2K00

1小时学会通过Java Swing Design设计java图形化

---- 1、项目创建 使用eclipse直接创建一个java的空项目即可,唯一要注意的就是创建【java】的时候不是点击【class】而是创建【JFrame】,通过【JFrame】才能使用设计工具【Design...2、绝对位置布局Absolute layout 使用这个方式方便拖拽,很方便: 3、工具栏简述: 4、常用控件简述 1、顶层容器:JFrame(窗体),JDialog(对话窗) 2...JLabel 标签 JButton 按钮 JTextArea 文本区 JTextField 文本框 JRadioButton 单选按钮 JCheckBox 复选框 JPasswordField 密码框 JComboBox...下拉列表框 JList 列表 JTable 表格 画的有些乱,但是基本上一眼就能看出来是啥:  表格JTable: JPanel设置上下布局,JScrollPane设置,这样才能显示table的标题列...) { // TODO Auto-generated catch block e.printStackTrace(); } return false; } } UI层添加数据: JTable

85410

java winform开发之JTable全攻略

这两天在研究JTable使用,也有一些收获,所以在这里跟大家分享交流一下,下面的内容将包括:1)JTable的基本用法;2)怎样为JTable添加行点击响应事件,双击后打开窗口;3)怎样为JTable...我的习惯是在frame的构造方法来完成,其实通过查API可以得知,JTable支持多种构造方法,而我认为动态生成数据来说,用Vector对象的形式来生成列头配置及数据配置是比较简单直观的方法,下面来看个例子...BillTable.setModel(tableModel); cmVector = null; dataVector = null;        使用...2)怎样添加行点击事件 首先,在JTable的设计视图中先选中JTable,然后右击,在事件的弹出菜单中依次选中"mouse-click”就可以捕捉表格的点击事件了,在这个事件监听方法中,传入一个java.awt.event.MouseEvent...4)怎样在JTable中动态添加新行 其实这个问题非常简单,只要根据列模型生成相应的行对象,然后通过调用JTable的model对象的addRow方法就ok了,由于过于简单,所以直接贴代码来说明问题:

1.2K30

如何在Java中使用Table

在Java中,开发人员可以使用JTable方法在其应用程序中创建表。JTable是从JComponent类继承的Swing组件。 如何在Java中创建表 要创建表,需要创建JTable类的实例。...400,400); frame.setLocationRelativeTo(null); frame.setVisible(true); } } 如果在Idea中运行此代码,它将生成以下输出...: 当您单击上述任何一个单元格时,您注意到其中的数据是可编辑的。...为了避免这些问题,您可以使用模型创建表格。 如何在Java中使用模型创建表 首先,了解如何处理表数据很重要。所有表(包括使用JTable方法创建的表)都使用表模型来管理其数据。...因此,如果需要使用自定义模型,则需要将其提供给JTable构造函数,如以下示例代码所示: JTable table = new JTable(new MyTableModel()); 要定义表模型,

2K40

java swing一篇轻松学习(高考后可以自学)

设置用户在此窗体上单击“关闭”按钮时默认执行的操作 setDefaultLookAndFeelDecorated (boolean defaultLookAndFeelDecorated) 设置 JFrame 窗口使用的...void main(String[] args) { new Action(); } } 面板:(JPanel) 是一种中间层容器,它能容纳组件并将组件组合在一起,但它本身必须添加到其他容器中使用...cmb=new JComboBox(); //创建JComboBox cmb.addItem("--请选择--"); //向下拉列表中添加一项 cmb.addItem("长命百岁"...frame.setVisible(true); } @Override public void actionPerformed(ActionEvent e) { // TODO 自动生成的方法存根...所使用的 tableHeader 设置为 newHeader setUpdateSelectionOnSort(boolean update) 指定排序后是否应该更新选择 setValueAt(Object

9.3K10

Java-GUI 编程之 JList、JComboBox实现列表框

使用ListCellRenderer改变列表外观 JList、JComboBox实现列表框 无论从哪个角度来看, JList 和 JComboBox 都是极其相似的,它们都有一个列表框,只是 JComboBox...甚至维护这两个组件的 Model 都是相似的, JList 使用 ListModel, JComboBox 使用ComboBoxModel ,而 ComboBoxModel 是 ListModel 的子类...简单列表框 使用JList或JComboBox实现简单列表框的步骤: 创建JList或JComboBox对象 JList(final E[] listData):创建JList对象,把listData数组中的每项内容转换成一个列表项展示...里的所有列表项的存储形式,它甚至不强制存储所有的列表项,只要 ListModel的实现类提供了getSize()和 getElementAt()两个方法 , JList 就可以根据该ListModel 对象来生成列表框...在使用JList和JComboBox时,除了可以使用jdk提供的Model实现类,程序员自己也可以根据需求,自己定义Model的实现类,实现对应的方法使用

3.4K11

java swing图形化界面_javagui界面设计

Swing 提供了许多比 AWT 更好的屏幕显示元素,使用纯 Java 实现,能够更好的兼容跨平台运行。 为了和 AWT 组件区分,Swing 组件在javax.swing....2.1 顶层容器 顶层容器属于窗口类组件,可以独立显示,一个图形界面至少需要一个窗口,例如: # 组件 描述 1 JFrame 一个普通的窗口(绝大多数 Swing 图形界面程序使用 JFrame 作为顶层容器...单选按钮 4 JCheckBox 复选框 5 JToggleButton 开关按钮 6 JTextField 文本框 7 JPasswordField 密码框 8 JTextArea 文本区域 9 JComboBox...进度条 12 JSlider 滑块 选取器组件: # 组件 描述 1 JFileChooser 文件选取器 2 JColorChooser 颜色选取器 其他较为复杂的基本组件: # 组件 描述 1 JTable...创建中间容器(面板容器) JPanel panel = new JPanel(); // 创建面板容器,使用默认的布局管理器 // 3.

1.5K50

【面向对象设计模式】 适配器模式 (二)

Jtable 对数据适配 (1) Jtable 与 TableModel AbstractTableModel模型  JTable适配数据方法 : JTable类可以将实现了TableModel抽象类的数据显示到图形界面中..., 这个接口是 TableModel 抽象类; TableModel子类实现 :  抽象方法多 : Jtable定义了许多抽象方法, 其子类必须实现所有的抽象方法, 这样很麻烦;  TableModel...; 使用对象适配的原因 :   AbstractTableModel 抽象类 : 该抽象类提供了适配器对象需要实现的接口 (抽象方法), 该抽象类又实现了客户端 JTable类 期待的接口, 适配器对象必须继承抽象类...识别适配器 MouseAdapter 为 MouseListener 接口提供桩的实现; 在使用MouseAdapter的时候, 就相当于使用了适配器 : 用户操作鼠标的时候, 将swing组件接收到的鼠标操作适配给相应的动作处理类中..., 即将GUI时间适配给应用程序接口, 使用了Swing适配类, 将一个接口方法委派给一个类的方法去执行; 5.

29510

java学习之路:32.史上最全的Swing常用组件

可以看到创建的按钮涉及整个窗体,这是为什么呢,窗体默认使用边界布局器,创建的组件覆盖整个窗体,我们只需要取消边界布局,改用绝对布局: jf.setLayout(null); //告诉窗体取消边界布局...---- 五.JComboBox | 代表Swing下拉列表框 JComboBox有4种构造方法: 构造方法 解释 JComboBox() 使用默认数据模型创建JComboBox。...> items) 创建一个JComboBox,其中包含指定向量中的元素。 1.使用默认数据模型创建JComboBox。...JComboBox jc =new JComboBox(); jc.setBounds(50,50,80,30);//使用绝对布局,自定义大小 ?...JComboBox jc =new JComboBox(); jc.setBounds(50,50,100,30);//使用绝对布局,自定义大小 jc.addItem("--请选择--"); jc.addItem

6.4K32

java超市仓库管理系统(超市条形码管理系统)

this.setLocationRelativeTo(null); 自由布局参考如下: this.setLayout(null); 创建一个JPanel,其布局也为自由布局;添加所有控件对象到其中; 控件位置与大小可使用以下方法实现...Width,int Height) 对象名.setLocation(int x,int y) 或 对象名.setBounds(int x,int y,int Width,int Height) 注意:在使用自由布局方式布局...table.getSelectedRow();//table为表格对象 获取选定行的商品名称,参考代码如下: table.getValueAt(index,1);//index为选定行的索引值 6、在编写代码时,最好用方法对重复使用的代码进行封装...(jTable.getValueAt(jTable.getSelectedRow(), 2).toString()); String price = jTable.getValueAt(jTable.getSelectedRow...void actionPerformed(ActionEvent arg0) { dispose(); } }); } } 特别说明: 项目中有一处代码错误,导致添加商品中的价格获取到数量

3.4K20

Java基础系列(四十三):集合之Vector&Stack

capacity() { return elementData.length; } /** * 返回的是数组中数据的长度,因为由于动态扩容,数据的长度可能小于数组的长度...返回的 Enumeration 对象将生成此向量中的所有项。生成的第一项为索引0处的项,然后是索引1处的项。...throw new ConcurrentModificationException(); } } /** * 这里传入的是同样是一个函数式接口,用于判断条件的过滤器...,可以配合lambda表达式来使用,符合条件的会被删除 * @param filter 过滤条件 * @return */ @Override @SuppressWarnings...当我们构造Vector时;若使用默认构造函数,则Vector的默认容量大小是10。 当Vector容器的容量不足以容纳全部元素时,Vector的容量增加。

30510

Java基础系列(四十三):集合之Vector&Stack

capacity() { return elementData.length; } /** * 返回的是数组中数据的长度,因为由于动态扩容,数据的长度可能小于数组的长度...返回的 Enumeration 对象将生成此向量中的所有项。生成的第一项为索引0处的项,然后是索引1处的项。...throw new ConcurrentModificationException(); } } /** * 这里传入的是同样是一个函数式接口,用于判断条件的过滤器...,可以配合lambda表达式来使用,符合条件的会被删除 * @param filter 过滤条件 * @return */ @Override @SuppressWarnings...当我们构造Vector时;若使用默认构造函数,则Vector的默认容量大小是10。 当Vector容器的容量不足以容纳全部元素时,Vector的容量增加。

32940
领券