Swing JTable多逗号分隔关键词动态不同颜色高亮改造咨询
实现多关键词不同颜色的JTable单元格高亮
没问题,我帮你调整代码,实现逗号分隔多关键词、每个关键词用不同颜色高亮的效果。主要需要做这几个关键修改:
核心修改点
- 拆分搜索关键词:把输入框里的文本按逗号分割,去除每个关键词的前后空格,过滤掉空字符串
- 准备多组高亮颜色:定义一组备用颜色,给不同关键词分配不同的高亮色(颜色不够时可以循环复用)
- 重置高亮状态:每次渲染单元格前先清除之前的高亮,避免残留上一次的高亮效果
- 遍历关键词逐个高亮:对每个关键词单独处理,用对应的颜色创建高亮画笔,在单元格文本中匹配并高亮
修改后的完整代码
import javax.swing.*; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer; import javax.swing.text.DefaultHighlighter; import java.awt.*; public class TableExample { JFrame f; private JTextField textField; // 新增:定义一组高亮颜色,可根据需求扩展 private final Color[] HIGHLIGHT_COLORS = {Color.YELLOW, Color.CYAN, Color.PINK, Color.LIGHT_GRAY, Color.ORANGE}; TableExample() { f = new JFrame(); String data[][] = {{"101", "lala", "670000"}, {"101", "lala", "670000"}, {"102", "Jai", "780000"}, {"101", "Sachin", "700000"}}; String column[] = {"ID", "NAME", "SALARY"}; JTable jt = new JTable(); jt.setBounds(30, 40, 200, 300); JScrollPane sp = new JScrollPane(jt); DefaultTableModel dtm = new DefaultTableModel(data, column); dtm.setColumnIdentifiers(column); jt.setModel(dtm); JPanel inputpanel = new JPanel(); inputpanel.setLayout(new BoxLayout(inputpanel, BoxLayout.LINE_AXIS)); textField = new JTextField(); JButton button = new JButton("Highlight"); button.addActionListener(e -> { jt.repaint(); }); inputpanel.add(textField); inputpanel.add(button); jt.setDefaultRenderer(Object.class, new CellHighlightRenderer()); JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, inputpanel, sp); f.add(splitPane); f.setSize(300, 400); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 新增:关闭窗口退出程序 } class CellHighlightRenderer extends JTextField implements TableCellRenderer { public DefaultHighlighter high = new DefaultHighlighter(); public CellHighlightRenderer() { setBorder(BorderFactory.createEmptyBorder()); setHighlighter(high); } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { setBackground(isSelected ? table.getSelectionBackground() : table.getBackground()); setForeground(isSelected ? table.getSelectionForeground() : table.getForeground()); setFont(table.getFont()); setValue(value); // 修改:先清除之前的高亮,避免残留 high.removeAllHighlights(); String inputText = textField.getText().trim(); if (!inputText.isEmpty()) { // 修改:拆分关键词,去除空格并过滤空字符串 String[] patterns = inputText.split(","); for (int i = 0; i < patterns.length; i++) { String pattern = patterns[i].trim(); if (pattern.isEmpty()) continue; // 修改:循环使用高亮颜色 Color color = HIGHLIGHT_COLORS[i % HIGHLIGHT_COLORS.length]; DefaultHighlighter.DefaultHighlightPainter painter = new DefaultHighlighter.DefaultHighlightPainter(color); int pos = 0; String cellText = value.toString(); // 遍历匹配当前关键词的所有位置 while ((pos = cellText.indexOf(pattern, pos)) >= 0) { try { high.addHighlight(pos, pos + pattern.length(), painter); pos += pattern.length(); // 移动指针,避免重复匹配同一位置 } catch (Exception e) { e.printStackTrace(); } } } } return this; } protected void setValue(Object value) { setText((value == null) ? "" : value.toString()); } } public static void main(String[] args) { SwingUtilities.invokeLater(() -> { TableExample te = new TableExample(); te.f.setVisible(true); }); } }
关键细节说明
- 颜色循环复用:当关键词数量超过预设的颜色数时,用
i % HIGHLIGHT_COLORS.length循环取色,避免数组越界 - 清除高亮:每次渲染单元格时调用
high.removeAllHighlights(),确保新的高亮不会和旧的叠加 - 关键词过滤:拆分后对每个关键词做
trim()并跳过空字符串,避免用户输入多个逗号导致的无效匹配 - 匹配逻辑优化:找到匹配位置后
pos += pattern.length(),防止同一位置被重复高亮(比如关键词是"aa",文本是"aaaa"时,会高亮前两个和后两个,而不是重复高亮第一个)
内容的提问来源于stack exchange,提问作者Molay
相关产品推荐
相关产品推荐

