我必须在 jtable 数据中搜索文本。例如,“ADMIN”文本出现在 jtable 中的多个位置,然后如何突出显示包含指定值的所有单元格。
有人有什么主意吗 ?
在 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"));
正如@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);
}
}