Выделите ячейку в JTable через пользовательскую модель таблицы - PullRequest
1 голос
/ 28 марта 2012

У меня есть 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);
    }
}

Ответы [ 3 ]

2 голосов
/ 28 марта 2012

Два возможных способа (в том числе SSCCE ) подробно описаны в моем вопросе о Подсветке HighString .... ,

1 голос
/ 28 марта 2012

Как уже упоминалось, 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 - это поле типа int, обновляемое 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) {/***/}
    });
1 голос
/ 28 марта 2012

TableModel, безусловно, не место для этой функциональности.Это принадлежит рендереру.См. Swing учебник о средствах визуализации для получения более подробной информации.

Я проголосовал за закрытие этого вопроса как дубликат Изменение цвета ячейки в JTable (или особенноодин цвет заголовка таблицы java swing ), который объясняет, как добиться этой функциональности.Связь с вашим текстовым полем - единственная новая вещь, и это довольно тривиально.Посмотрите ответы Клеопатры в этих темах и дайте ей еще один кредит

...