调整 JTable 中的一个单元格而不是整行
Adjust one cell in JTable instead of whole row
我 运行 遇到了一个小问题,正在努力解决它。基本上发生的事情是我有一个 JTable,它由我从 API 调用中获得的数组填充。
我目前拥有的是,如果设备显示为在线,它将变为绿色,如果离线,则变为浅灰色。
问题是它影响了整个 ROW 而不仅仅是状态 CELL。我只希望状态单元格突出显示绿色。任何帮助将非常感激。
custTable = new javax.swing.JTable(model){
@Override
public Component prepareRenderer(TableCellRenderer renderer, int rowIndex,
int columnIndex) {
JComponent component = (JComponent) super.prepareRenderer(renderer, rowIndex, columnIndex);
if(getValueAt(rowIndex,1).toString().equalsIgnoreCase("Online"))
{
component.setBackground(Color.GREEN);
}
else if(getValueAt(rowIndex,1).toString().equalsIgnoreCase("Offline"))
{
component.setBackground(Color.lightGray);
}
return component;
}
不要覆盖 prepareRenderer() 方法。通常,当您希望渲染对输入行有效时,您只会重写此方法。这种方法很有用,因为呈现代码位于一个位置,您不必为 table.
中的每一列创建自定义呈现器
但是,对于特定列中单元格的特定呈现,您应该为该列创建自定义呈现器。
阅读有关 Using Custom Renderers 的 Swing 教程部分,了解更多信息和示例。
教程示例实现了 TableCellRenderer 接口。扩展默认渲染器可能更容易:
class ColorRenderer extends DefaultTableCellRenderer
{
@Override
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (!isSelected)
{
int viewColumn = convertColumnIndexToView(1)
String value = getModel().getValueAt(rowIndex, viewColumn).toString();
if ("Online".equalsIgnoreCase(value))
setBackground( Color.GREEN );
else
setBackground( Color.lightgray );
return this;
}
}
}
请注意,您应该转换列索引,以防用户对 table 中的列重新排序。
然后要使用渲染,您可以使用以下方法将其添加到各个列:
TableCellRenderer colorRenderer = new ColorRenderer();
table.getColumnModel().getColumn(1).setCellRenderer( colorRenderer );
我同意 camickr,但您也可以按以下方式更正您的代码以避免您的问题
@Override
public Component prepareRenderer(TableCellRenderer renderer, int rowIndex,
int columnIndex) {
JComponent component = (JComponent) super.prepareRenderer(renderer, rowIndex, columnIndex);
if(getValueAt(rowIndex,1).toString().equalsIgnoreCase("Online") && columnIndex == 1)
{
component.setBackground(Color.GREEN);
}
else if(getValueAt(rowIndex,1).toString().equalsIgnoreCase("Offline") && columnIndex == 1)
{
component.setBackground(Color.lightGray);
} else {
component.setBackground(isRowSelected(rowIndex)? getSelectedBackground() : getBackground());
}
return component;
}
我 运行 遇到了一个小问题,正在努力解决它。基本上发生的事情是我有一个 JTable,它由我从 API 调用中获得的数组填充。
我目前拥有的是,如果设备显示为在线,它将变为绿色,如果离线,则变为浅灰色。
问题是它影响了整个 ROW 而不仅仅是状态 CELL。我只希望状态单元格突出显示绿色。任何帮助将非常感激。
custTable = new javax.swing.JTable(model){
@Override
public Component prepareRenderer(TableCellRenderer renderer, int rowIndex,
int columnIndex) {
JComponent component = (JComponent) super.prepareRenderer(renderer, rowIndex, columnIndex);
if(getValueAt(rowIndex,1).toString().equalsIgnoreCase("Online"))
{
component.setBackground(Color.GREEN);
}
else if(getValueAt(rowIndex,1).toString().equalsIgnoreCase("Offline"))
{
component.setBackground(Color.lightGray);
}
return component;
}
不要覆盖 prepareRenderer() 方法。通常,当您希望渲染对输入行有效时,您只会重写此方法。这种方法很有用,因为呈现代码位于一个位置,您不必为 table.
中的每一列创建自定义呈现器但是,对于特定列中单元格的特定呈现,您应该为该列创建自定义呈现器。
阅读有关 Using Custom Renderers 的 Swing 教程部分,了解更多信息和示例。
教程示例实现了 TableCellRenderer 接口。扩展默认渲染器可能更容易:
class ColorRenderer extends DefaultTableCellRenderer
{
@Override
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (!isSelected)
{
int viewColumn = convertColumnIndexToView(1)
String value = getModel().getValueAt(rowIndex, viewColumn).toString();
if ("Online".equalsIgnoreCase(value))
setBackground( Color.GREEN );
else
setBackground( Color.lightgray );
return this;
}
}
}
请注意,您应该转换列索引,以防用户对 table 中的列重新排序。
然后要使用渲染,您可以使用以下方法将其添加到各个列:
TableCellRenderer colorRenderer = new ColorRenderer();
table.getColumnModel().getColumn(1).setCellRenderer( colorRenderer );
我同意 camickr,但您也可以按以下方式更正您的代码以避免您的问题
@Override
public Component prepareRenderer(TableCellRenderer renderer, int rowIndex,
int columnIndex) {
JComponent component = (JComponent) super.prepareRenderer(renderer, rowIndex, columnIndex);
if(getValueAt(rowIndex,1).toString().equalsIgnoreCase("Online") && columnIndex == 1)
{
component.setBackground(Color.GREEN);
}
else if(getValueAt(rowIndex,1).toString().equalsIgnoreCase("Offline") && columnIndex == 1)
{
component.setBackground(Color.lightGray);
} else {
component.setBackground(isRowSelected(rowIndex)? getSelectedBackground() : getBackground());
}
return component;
}