有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

有人知道吗


共 (2) 个答案

  1. # 1 楼答案

    在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"));
    
  2. # 2 楼答案

    正如@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);
        }
    
    }