#java #swing #jtable
#java #swing #jtable
Вопрос:
Я хотел бы изменить цвет ячейки в JTable. Я написал свой собственный класс, который расширяет DefaultTableCellRenderer. Однако мой класс действительно ведет себя непоследовательно. Все, что он делает, это если запись появляется дважды в столбце, она помечается красным. Это результат, который я получаю:
Обратите внимание, что в этом классе я также устанавливаю шрифт для определенного столбца. Это работает нормально. Мне интересно, почему я получаю такое поведение при попытке просто установить цвет.
Вот мой класс:
/*
* 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 < columnData.length; i )
{
String currTableValue = columnData[i];
if(currTableValue.equals(cellValue) amp;amp; i != row)
{
dup = true;
break;
}
}
//we found a dup
if(dup == true)
{
cell.setBackground(Color.red);
}
}
return cell;
}
}
Ответ №1:
DefaultTableCellRenderer - особенно плохая реализация - вы попали в ее печально известную "цветовую память". Чтобы обойти это, вы должны всегда задавать ее свойства цвета
if (myCondition)
comp.setBackground(red)
else
comp.setBackground(normal)
или лучше (я, конечно, предвзят): используйте JXTable в SwingX, он поставляется с полной подключаемой поддержкой для оформления средств визуализации ячеек не только в таблице, но и последовательно в выпадающем списке, дереве, списке..