我有一个JTable和一个JTextField,我想突出显示与JTextField中的文本对应的单元格。我在代码中添加了Todo,但我不知道该怎么做。
如何在表模型中执行此操作?任何人都可以建议一个代码段吗?
的TableModel:
public class ArtikelTableModel extends AbstractTableModel {
private List<Object[]> data;
private String[] headers;
private String wordToBeFind = "";
public ArtikelTableModel(List<Object[]> data, String[] headers) {
this.data = data;
this.headers = headers;
}
public List<Object[]> getData() {
return data;
}
public void setData(List<Object[]> data) {
this.data = data;
}
public String getWordToBeFind() {
return wordToBeFind;
}
public void setWordToBeFind(String wordToBeFind) {
this.wordToBeFind = wordToBeFind;
}
public int getRowCount() {
return data.size();
}
public int getColumnCount() {
return headers.length;
}
public Object getValueAt(int rowIndex, int columnIndex) {
String celValue = (String) data.get(rowIndex)[columnIndex];
System.out.println(celValue);
return celValue;
}
@Override
public void fireTableDataChanged() {
super.fireTableDataChanged();
}
public void findWordInTableAndHighlightIt(String word){
for(int i = 0; i<data.size();i++){
for(int j=0;j<headers.length;j++){
if(word.equals(data.get(i)[j])){
//Todo: highlight the content of the cell and set the cell border color to red
}
}
}
}
}
自定义渲染
public class ArtikelCellRenderer extends DefaultWebTableCellRenderer{
protected static int row;
protected static int col;
protected boolean isSelected;
protected boolean isFocused;
public Component getTableCellRendererComponent(WebTable tbl, Object v, boolean isSelected, boolean isFocused, int row, int col)
{
//Store this info for later use
this.row = row;
this.col = col;
this.isSelected = isSelected;
this.isFocused = isFocused;
super.setValue(v); //Set the value as requested
//Set colors dependant upon if the row is selected or not
if (!this.isSelected) this.setBackground(new Color((float)0.87, (float)0.91, (float)1.0));
else this.setBackground(new Color((float)0.75, (float)0.78, (float)0.85));
//Set a special highlight color if this actual cell is focused
if (this.isFocused) this.setBackground(new Color((float)0.5, (float)0.80, (float)0.6));
//Set a special highlight color if this actual cell matches to the JTtextField text
Todo: ?set background color to green and border color to red
//and then allow the usual component to be returned
return super.getTableCellRendererComponent(tbl, v, isSelected, isFocused, row, col);
}
}
答案 0 :(得分:2)
关于SSCCE,
的问题详细描述了两种可能的方式(包括Highlights subString ....)答案 1 :(得分:1)
TableModel
肯定不是此功能的地方。这属于渲染器。有关详细信息,请参阅Swing tutorial about renderers。
我投票将这个问题作为Changing color of cell in JTable(或particular one table header color java swing)的副本关闭,这解释了如何实现此功能。与文本字段的耦合是唯一的新事物,而且相当简单。在这些主题中查阅kleopatra的答案并给她更多的信用
答案 2 :(得分:1)
如前所述,TableModel
不是正确的地方。
改为覆盖JTable.preparedRenderer(TableCellRenderer renderer, int row, int column)
。如果row
和column
数字相同,您可以更改作为显示返回的Component
的背景颜色(通常为JLabel
);
这是一个突出显示鼠标所在行的示例:
@Override
public Component prepareRenderer(final TableCellRenderer renderer, final int row, final int column) {
final Component c = super.prepareRenderer(renderer, row, column);
if (row == this.itsRow) {
c.setBackground(Color.RED);
}
return c;
}
其中this.itsRow
是由MouseMotionListener
更新的int字段:
this.addMouseMotionListener(new MouseMotionListener() {
public void mouseMoved(MouseEvent e) {
SubclassedJTable.this.itsRow = SubclassedJTable.this.rowAtPoint(e.getPoint());
SubclassedJTable.this.repaint();
}
public void mouseDragged(MouseEvent e) {/***/}
});