2012-03-28 71 views
1

我有一個JTable和一個JTextField,我想突出顯示與JTextField中文本對應的單元格。我在代碼中添加了Todo,但我不知道如何去做。通過自定義表模型突出顯示JTable中的單元格

怎麼可能在表模型中做到這一點?任何人都可以建議一個代碼片段?

的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

*「我將待辦事項的代碼,但我不知道該怎麼做。「*可能他們需要一個'/ WhatToPutHere?'標籤。 ;) – 2012-03-28 12:45:14

+0

[更改JTable中單元格的顏色]的可能重複(http://stackoverflow.com/questions/5821724/changing-color-of-cell-in-jtable) – Robin 2012-03-28 12:49:00

回答

1

TableModel肯定不是這個功能的地方。這屬於渲染器。有關更多詳細信息,請參閱Swing tutorial about renderers

我投票結束這個問題,作爲Changing color of cell in JTable(或particular one table header color java swing)的副本,它解釋瞭如何實現此功能。與您的文本字段的耦合是唯一的新事物,這是相當微不足道的。在這些線程諮詢克列奧帕特拉的答案,並給她一些更多的信貸

1

正如已經提到的,TableModel是不正確的地方爲了這。代替JTable.preparedRenderer(TableCellRenderer renderer, int row, int column)。如果rowcolumn數字相同,則可以更改作爲顯示返回的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) {/***/} 
    });