如何高亮JTable单元格文本?基于现有搜索代码的实现问询
当前效果与需求
- 加载用户日志的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("&", "&").replace("<", "<").replace(">", ">"); // 高亮匹配的关键词 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
相关产品推荐
相关产品推荐

