Изменение цвета ячейки в JTable - PullRequest
1 голос
/ 28 апреля 2011

Я хотел бы изменить цвет ячейки в JTable. Я написал свой собственный класс, который расширяет DefaultTableCellRenderer. Тем не менее, мой класс ведет себя очень неудобно. Все, что он делает, это если запись появляется дважды в столбце, она помечает его красным. Вот результат, который я получаю:

enter image description here

Обратите внимание, что в этом классе я также устанавливаю шрифт для определенного столбца. Это отлично работает. Мне интересно, почему я получаю такое поведение, когда пытаюсь просто установить цвет.

Вот мой класс:

<code>
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package inter2;

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.util.List;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

/**
 * Used to display different fonts for different cells in the table
 */
public class CustomCellRenderer extends DefaultTableCellRenderer
{

    private final int TRANSLATION_COL = 1;
    private final int VARIABLE_COL = 2;

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
            boolean hasFocus, int row, int column)
    {
        Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        //set it so it can display unicode characters
        if (column == TRANSLATION_COL)
        {
            cell.setFont(new Font("MS Mincho",Font.PLAIN, 12));
        }
        //marks a cell red if it is a duplicate variable name
        if(column == VARIABLE_COL)
        {
            MyTable theTable = (MyTable)table;
            String cellValue = theTable.getValueforCell(row, column);
            boolean dup = false;
            String[] columnData = theTable.getColumnData(column);
            //check if this is already in the list
            for(int i =0; i &lt columnData.length; i++)
            {
                String currTableValue = columnData[i];
                if(currTableValue.equals(cellValue) && i != row)
                {
                    dup = true;
                    break;
                }
            }
            //we found a dup
            if(dup == true)
            {
                cell.setBackground(Color.red);
            }
        }
        return cell;
    }
}

1 Ответ

4 голосов
/ 28 апреля 2011

DefaultTableCellRenderer является особенно плохой реализацией - вы попали в ее печально известную «цветовую память».Чтобы обойти это, вы должны установить его цветовые свойства всегда

if (myCondition) 
    comp.setBackground(red)
else 
    comp.setBackground(normal)

или лучше (предвзято, конечно): используйте JXTable в SwingX, он поставляется с полной подключаемой поддержкой для украшениясредства визуализации ячеек, не только в таблице, но и последовательно в comboBox, tree, list ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...