如何在jtable中突出显示多个单元格

时间:2013-08-09 07:07:41

标签: java swing jtable

我必须在jtable数据中搜索文本。 例如“ADMIN”文本出现在jtable中的多个位置,然后如何突出显示 所有包含指定值的单元格。

有没有人有任何想法?

2 个答案:

答案 0 :(得分:2)

在SwingX中(偏见我无法抗拒炫耀:-)解决方案归结为安装荧光笔并根据需要使用SearchPredicate进行配置:

// instantiate a background decorator
final ColorHighlighter hl = new ColorHighlighter(HighlightPredicate.NEVER, Color.YELLOW, null);
// register it with the table (of type JXTable)
table.addHighlighter(hl);
// set the predicate, f.i. highlight all cell that contain ADMIN
hl.setHighlightPredicate(new SearchPredicate("ADMIN"));

答案 1 :(得分:1)

正如@kleopatra建议的那样,使用自定义CellRenderer(以下示例只是一个POC,添加方法来更改搜索模式,突出显示颜色等):

import java.awt.Color;
import java.awt.Component;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

public class CellHighlighter {

    private static class CellHighlighterRenderer extends JLabel implements TableCellRenderer {

        public CellHighlighterRenderer() {
            setOpaque(true); // Or color won't be displayed!
        }

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            String val = (String)value;
            Color c;
            if (val.matches(".*MIN.*")) // Add a method to configure the regexpr
                c = Color.YELLOW; // Add a method to configure color
            else
                c = UIManager.getColor("Table.background");
            setBackground(c);
            setText(val);
            return this;
        }
    }

    public static void main(String[] args) {
        String[] columnNames = {
            "Login", "Real name", "Age", "Birthday"
        };
        String[][] data = {
            {"toto", "Toto Mackwert", "73", "18/06/1940"},
            {"adm", "ADMINISTRATOR", "13", "01/01/2000"},
            {"AMINA", "Amina Farou", "3", "01/01/2010"},
        };
        JTable table = new JTable(data, columnNames);
        table.setDefaultRenderer(Object.class, new CellHighlighterRenderer());
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        JScrollPane scrollPane = new JScrollPane(table);
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(scrollPane);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

}
相关问题