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

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);
        });
    }
}

关键细节说明

  1. 颜色循环复用:当关键词数量超过预设的颜色数时,用i % HIGHLIGHT_COLORS.length循环取色,避免数组越界
  2. 清除高亮:每次渲染单元格时调用high.removeAllHighlights(),确保新的高亮不会和旧的叠加
  3. 关键词过滤:拆分后对每个关键词做trim()并跳过空字符串,避免用户输入多个逗号导致的无效匹配
  4. 匹配逻辑优化:找到匹配位置后pos += pattern.length(),防止同一位置被重复高亮(比如关键词是"aa",文本是"aaaa"时,会高亮前两个和后两个,而不是重复高亮第一个)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:40:07