You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高亮JTable单元格文本?基于现有搜索代码的实现问询

当前效果与需求

  • 加载用户日志的JDialog:
    加载用户日志的JDialog
  • 用户搜索表格行后的效果:
    用户搜索表格行后的效果
  • 期望实现的效果:
    期望实现的效果
    仅需在用户搜索行时,高亮JTable单元格内的匹配文本。

实现单元格匹配文本高亮的方案

要实现JTable单元格内匹配文本的高亮,核心是自定义单元格渲染器(TableCellRenderer),通过HTML标签标记高亮文本片段。以下是基于你现有代码的修改步骤:

1. 新增全局变量保存搜索关键词

在类中添加全局变量存储当前搜索关键词,供渲染器调用:

private String searchKeyword = "";

2. 修改搜索事件代码,优化查询并刷新表格

更新文本框按键释放事件的代码,修复SQL注入问题、实现任意位置匹配,并触发表格刷新:

try {
    dialog.connect();
    searchKeyword = txtSearch.getText().trim();
    
    // 使用参数占位符避免SQL注入,同时实现任意位置匹配
    String query = "SELECT user_log.login_date, user_log.login_time, user_log.logout_time "
            + "FROM user_log WHERE (user_log.login_date LIKE ? OR "
            + "user_log.login_time LIKE ? OR user_log.logout_time LIKE ?) "
            + "AND user_log.username_id = ?";
    
    pst = dialog.con.prepareStatement(query);
    String likePattern = "%" + searchKeyword + "%";
    pst.setString(1, likePattern);
    pst.setString(2, likePattern);
    pst.setString(3, likePattern);
    pst.setString(4, username);
    
    rs = pst.executeQuery();
    
    tblUserLogModel.setRowCount(0);
    if (searchKeyword.isEmpty()) {
        loadUserLog();
    } else {
        while(rs.next()) {
            Object[] userLogData = {rs.getString("login_date"), rs.getString("login_time"), rs.getString("logout_time")};
            tblUserLogModel.addRow(userLogData);
        }
    }
    // 刷新表格触发渲染器重绘
    tblUserLog.repaint();

} catch (Exception e) {
    JOptionPane.showMessageDialog(this, e);
}

3. 自定义高亮单元格渲染器

创建继承自DefaultTableCellRenderer的渲染器,在渲染时对匹配文本添加高亮样式:

private class HighlightTableCellRenderer extends DefaultTableCellRenderer {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        
        if (value != null && !searchKeyword.isEmpty()) {
            String text = value.toString();
            // 转义HTML特殊字符避免显示异常
            text = text.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;");
            // 高亮匹配的关键词
            String highlightedText = text.replaceAll(
                Pattern.quote(searchKeyword), 
                "<span style='background-color: yellow;'>$0</span>"
            );
            setText("<html>" + highlightedText + "</html>");
        } else {
            // 无关键词时正常显示文本
            setText(value != null ? value.toString() : "");
        }
        
        return this;
    }
}

4. 为表格绑定自定义渲染器

在表格初始化代码中(比如窗体构造方法),将渲染器应用到所有列:

// 为每一列设置高亮渲染器
for (int i = 0; i < tblUserLog.getColumnCount(); i++) {
    tblUserLog.getColumnModel().getColumn(i).setCellRenderer(new HighlightTableCellRenderer());
}

效果说明

  • 搜索框为空时,表格正常显示所有日志,无高亮
  • 输入关键词后,表格加载匹配行,单元格内所有匹配的关键词会被黄色背景高亮(可修改<span>的style调整高亮颜色或样式)

内容的提问来源于stack exchange,提问作者Dora

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 14:42:14