2012-03-28 5 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

* "Я добавил Todo в коде, но я не знаю, как это сделать ». * Может быть, им нужен тег« // WhatToPutHere? ». ;) –

+0

Возможный дубликат [Изменение цвета ячейки в JTable] (http://stackoverflow.com/questions/5821724/changing-color-of-cell-in-jtable) – Robin

ответ

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). Если номера 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:

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) {/***/} 
    }); 
Смежные вопросы