将搜索文本字段实现到 jTable 中

2023-12-04

现在我有一个使用 KeyReleased 事件实现的搜索文本字段,当我开始输入例如“Andrew”中的“An”时,它没有找到/更新 jTable,并且在我完成准确输入(区分大小写)我想要的名称之后寻找。

所以,我想要的是从此实现 Filtering 方法site但我有很大的问题。在下面的实现并删除“旧”KeyReleased 事件之后,当我在文本字段“txt_search”中输入某些内容时,jTable 没有任何反应。

我的 IDE (NetBeans) 生成的表代码是(从自定义代码面板复制):

Table_Employee = new javax.swing.JTable();

Table_Employee.setModel(new javax.swing.table.DefaultTableModel(
    new Object [][] {
        {null, null, null, null},
        {null, null, null, null},
        {null, null, null, null},
        {null, null, null, null}
    },
    new String [] {
        "Title 1", "Title 2", "Title 3", "Title 4"
    }
)
);

Table_Employee.setToolTipText("Employee info table");

Table_Employee.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));

Table_Employee.getTableHeader().setReorderingAllowed(false);

Table_Employee.addMouseListener(new java.awt.event.MouseAdapter() {
    public void mouseClicked(java.awt.event.MouseEvent evt) {
        Table_EmployeeMouseClicked(evt);
    }
});
Table_Employee.addKeyListener(new java.awt.event.KeyAdapter() {
    public void keyPressed(java.awt.event.KeyEvent evt) {
        Table_EmployeeKeyPressed(evt);
    }
});

jScrollPane1.setViewportView(Table_Employee);

我将其添加到我的面板类中,其中表是:

import java.awt.Toolkit;
import java.awt.event.WindowEvent;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.swing.JOptionPane;
import net.proteanit.sql.DbUtils;
import java.awt.event.*;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.text.*;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableRowSorter;


public class Employee_info extends javax.swing.JFrame {
Connection conn=null;
ResultSet rs=null;
PreparedStatement pst=null;
private TableRowSorter<DefaultTableModel> sorter;
    /**
     * Creates new form Employee_info
     */
    public Employee_info() {
        initComponents();
        conn=javaconnect.ConnecrDb();
        Update_table();
        Fillcombo();
        currentDate();
        Table_Employee.setAutoCreateRowSorter(true);
        Table_Employee.setFillsViewportHeight(true);
        Table_Employee.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);


        DefaultTableModel model = new DefaultTableModel();
        sorter = new TableRowSorter<DefaultTableModel>(model);
        Table_Employee = new JTable(model);


        txt_search = new JTextField();
        //Whenever filterText changes, invoke newFilter.
        txt_search.getDocument().addDocumentListener(
                new DocumentListener() {
                    public void changedUpdate(DocumentEvent e) {
                        newFilter();
                    }
                    public void insertUpdate(DocumentEvent e) {
                        newFilter();
                    }
                    public void removeUpdate(DocumentEvent e) {
                        newFilter();
                    }
                });
    }

    private void newFilter() {
    RowFilter<DefaultTableModel, Object> rf = null;
    //If current expression doesn't parse, don't update.
    try {
        rf = RowFilter.regexFilter(txt_search.getText(), 0);
    } catch (java.util.regex.PatternSyntaxException e) {
        return;
    }
    sorter.setRowFilter(rf);
}

我真的需要一些帮助,拜托!这是我最后的机会,因为我真的做了谷歌搜索解决方案,并且没有任何改变。

尊重地, 安德鲁


  • JTable 教程中关于过滤和排序的少量修改代码

  • 对于 JCheckBox 的过滤,您可以输入“true”/“false”

code

import java.awt.*;
import java.util.regex.PatternSyntaxException;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

public class TableFilterSorter extends JPanel {

    private boolean DEBUG = false;
    private static final long serialVersionUID = 1L;

    public TableFilterSorter() {
        super(new BorderLayout(5, 5));
        final JTextField filterCpText = new JTextField();
        filterCpText.setFont(new Font("Serif", Font.BOLD, 28));
        filterCpText.setForeground(Color.BLUE);
        filterCpText.setBackground(Color.LIGHT_GRAY);
        JPanel filterCpPanel = new JPanel();
        filterCpPanel.setLayout(new BorderLayout(5, 5));
        filterCpPanel.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));
        filterCpPanel.setBackground(Color.LIGHT_GRAY);
        filterCpPanel.setPreferredSize(new Dimension(300, 30));
        filterCpPanel.add(filterCpText, BorderLayout.CENTER);
        add(filterCpPanel, BorderLayout.NORTH);
        final JTable table = new JTable(new MyTableModel());
        table.setPreferredScrollableViewportSize(new Dimension(500, 160));
        table.setFillsViewportHeight(true);
        JScrollPane scrollPane = new JScrollPane(table);
        add(scrollPane, BorderLayout.CENTER);
        TableModel myTableModel = table.getModel();
        final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(myTableModel);
        table.setRowSorter(sorter);
        filterCpText.getDocument().addDocumentListener(new DocumentListener() {

            private void searchFieldChangedUpdate(DocumentEvent evt) {
                String text = filterCpText.getText();
                if (text.length() == 0) {
                    sorter.setRowFilter(null);
                    table.clearSelection();
                } else {
                    try {
                        sorter.setRowFilter(RowFilter.regexFilter("(?i)" + text, 4));
                        table.clearSelection();
                    } catch (PatternSyntaxException pse) {
                        JOptionPane.showMessageDialog(null, "Bad regex pattern",
                                "Bad regex pattern", JOptionPane.ERROR_MESSAGE);
                    }
                }
            }

            @Override
            public void insertUpdate(DocumentEvent evt) {
                searchFieldChangedUpdate(evt);
            }

            @Override
            public void removeUpdate(DocumentEvent evt) {
                searchFieldChangedUpdate(evt);
            }

            @Override
            public void changedUpdate(DocumentEvent evt) {
                searchFieldChangedUpdate(evt);
            }
        });
    }

    private class MyTableModel extends AbstractTableModel {

        private static final long serialVersionUID = 1L;
        private String[] columnNames = {"First Name", "Last Name", "Sport", "# of Years", "Vegetarian"};
        private Object[][] data = {
            {"Mary", "Campione", "Snowboarding", new Integer(5), false},
            {"Alison", "Huml", "Rowing", new Integer(3), true},
            {"Kathy", "Walrath", "Knitting", new Integer(2), false},
            {"Sharon", "Zakhour", "Speed reading", new Integer(20), true},
            {"Philip", "Milne", "Pool", new Integer(10), false},
            {"Mary", "Campione", "Snowboarding", new Integer(5), false},
            {"Alison", "Huml", "Rowing", new Integer(3), true},
            {"Kathy", "Walrath", "Knitting", new Integer(2), false},
            {"Sharon", "Zakhour", "Speed reading", new Integer(20), true},
            {"Philip", "Milne", "Pool", new Integer(10), false},};

        @Override
        public int getColumnCount() {
            return columnNames.length;
        }

        @Override
        public int getRowCount() {
            return data.length;
        }

        @Override
        public String getColumnName(int col) {
            return columnNames[col];
        }

        @Override
        public Object getValueAt(int row, int col) {
            return data[row][col];
        }

        @Override
        public Class<?> getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }

        @Override
        public boolean isCellEditable(int row, int col) {
            if (col < 2) {
                return false;
            } else {
                return true;
            }
        }

        @Override
        public void setValueAt(Object value, int row, int col) {
            if (DEBUG) {
                System.out.println("Setting value at " + row + "," + col
                        + " to " + value + " (an instance of " + value.getClass() + ")");
            }
            data[row][col] = value;
            fireTableCellUpdated(row, col);
            if (DEBUG) {
                System.out.println("New value of data:");
                printDebugData();
            }
        }

        private void printDebugData() {
            int numRows = getRowCount();
            int numCols = getColumnCount();
            for (int i = 0; i < numRows; i++) {
                System.out.print("    row " + i + ":");
                for (int j = 0; j < numCols; j++) {
                    System.out.print("  " + data[i][j]);
                }
                System.out.println();
            }
            System.out.println("--------------------------");
        }
    }

    private static void createAndShowGUI() {
        JFrame frame = new JFrame("TableDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        TableFilterSorter newContentPane = new TableFilterSorter();
        newContentPane.setOpaque(true);
        frame.setContentPane(newContentPane);
        frame.setLocation(150, 150);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将搜索文本字段实现到 jTable 中 的相关文章

随机推荐

  • 使用MSBuild构建EXE时如何指定文件版本?

    我正在尝试使用 MSBuild Delphi 2010 编译 EXE 我尝试了以下方法 MSBuild exe t Clean Build p config Release ExtraDefines CodeTest property Fi
  • 查找c++执行时间

    我很好奇 C 中是否有内置函数来测量执行时间 我现在使用的是 Windows 在 Linux 中这非常简单 据我所知 Windows 上最好的方法是使用QueryPerformanceCounter and QueryPerformance
  • 我是否需要心跳来保持 TCP 连接打开?

    我有两个通过 TCP IP 进行通信的组件 组件 A 充当服务器 侦听器 组件 B 充当客户端 两人应该尽快沟通 任何时候只能有一个连接 尽管这是这个问题的一部分 我公司的一位高级开发人员表示 我需要在两个组件之间使用应用程序级心跳来确保连
  • SVN 中工作副本 XXX 已锁定且清理失败

    当我执行以下操作时出现此错误svn update 工作副本 XXXXXXXX 已锁定 请 执行 清理 命令 当我运行清理时 我得到 清理无法处理 以下路径 XXXXXXX 我该如何摆脱这个循环 一种方法是 将编辑的项目复制到另一个位置 删除
  • 为什么我需要对这个 .rds 文件使用 mode = wb 和 download.file() ?

    我被挂断了闪亮的应用程序教程第 5 课因为我无法打开counties rds file readRDS threw error reading from connection 我发现我可以打开 rds如果我下载它就好了download fi
  • 用python计算股票的平衡交易量(OBV)

    我正在用 python 做我的第一个项目 我有一个名为 df 的 pandas 数据框 有两列 close 和 volume 我想根据前两列计算 获取 OBV 列 公式如下 如果收盘价高于前一收盘价 则 当前 OBC 先前 OBC 当前交易
  • 将控制台分成两部分以获得两个输出

    我正在创建一个控制台应用程序 我希望有两个输出和一个输入 原因是一个输出始终可见 This is the first output Text flows upwards just like a regular console applica
  • c中opencv中轮廓/对象的质心?

    有没有一些更好的方法可以在 opencv 中找到轮廓的质心 而不使用内置函数 虽然 Sonaten 的答案是完全正确的 但有一个简单的方法可以做到这一点 使用专用的 opencv 函数 moments http opencv itseez
  • 使用 javascript 更改文本区域换行

    对于我的小型 wiki 应用程序 我主要需要使用文本区域来编辑内容以使用软 或虚拟 换行 但是 在某些情况下 最好不包装内容 我想我可以通过简单地使用一个按钮来关闭包装来做到这一点 这是简化的代码
  • 将自定义图标添加到 Woocommerce 购物车和结帐中的运输选项

    我想将图标添加到 Woocommerce 购物车和结账中的运输选项 例如 在 本地取货 选项中 我想在选项旁边显示一个小商店图标 如下所示 https ibb co jz0jJgk 我尝试在 Woocommerce gt 设置 gt 运输选
  • 谁创建了索引?

    是否可以检查谁在 SQL Server 上创建了索引 我只找到列出时间的脚本 select STATS DATE so object id index id StatsDate si name IndexName schema name s
  • 为 Angular 2 身份验证启用 WebAPI CORS

    我在 stackoverflow 上看到了一些答案 但我迷路了 我有 webapi 2 独立的 Angular 2 webapi项目来自模板 我唯一改变的是我添加了 CORS 并将以下行添加到 IdentityConfig cs gt Ap
  • 如何创建可在 Bootstrap 3 中缩放的响应式图像

    我目前正在使用 twitter bootstrap 3 并且在创建响应式图像时遇到问题 我用过img responsive班级 但图像尺寸并未放大 如果我使用width 100 代替max width 100 然后它就完美地工作了 哪里有问
  • ASP.NET MVC:将 ViewModel 相互嵌套,是否存在反模式?

    我有一个项目 其中 ViewModel 相互嵌套 因此它们本质上是域层次结构的字符串类型复制 例如 如果我们的域具有以下关系 组织有 1 到多个环境 环境有 1 到多台机器 那么将会有一个 OrganizationViewModel 其中包
  • Leetcode 200. 岛屿数量 TLE

    问题链接 https leetcode com problems number of islands 给定一个由 1 陆地 和 0 水 组成的二维网格图 计算岛屿的数量 岛屿四面环水 相邻陆地水平或垂直连接而成 您可以假设网格的所有四个边缘
  • R pheatmap:执行聚类并显示每个注释类别的树状图

    我知道如何使用 pheatmap 按注释类别对行 基因 进行分组 并且我知道如何对整组行 基因 执行 Person 的相关聚类 但我想要完成的是执行聚类 并显示独立的每个类别独立的树状图 这可能吗 或者我是否被迫为每个类别创建单独的热图以在
  • 4 个条件中的 2 个以上正则表达式

    我对用户密码有4个要求 至少 1 个 a z 字符 至少 1 个 A Z 字符 至少 1 个 0 9 字符 至少 1 个符号 但是 用户只需满足 4 个条件中的 2 个以上即可 密码VVVV1111 234567 AaAaAaAa or A
  • Python中的一等函数是什么

    我仍然对什么是一流函数感到困惑 如果我理解正确的话 一等函数应该使用一个函数作为对象 它是否正确 这是一流的功能吗 def this is example myarg1 return myarg1 def this is another e
  • 具有位置条件的 MongoDB 分页

    我想要获取按字段排序的数据 例如 db Users find limit 200 sort rating 1 skip 0 这是工作 我得到了排序的数据 并且可以使用分页 但是 如果添加条件 find location near 12 32
  • 将搜索文本字段实现到 jTable 中

    现在我有一个使用 KeyReleased 事件实现的搜索文本字段 当我开始输入例如 Andrew 中的 An 时 它没有找到 更新 jTable 并且在我完成准确输入 区分大小写 我想要的名称之后寻找 所以 我想要的是从此实现 Filter