【问题标题】:Adjust one cell in JTable instead of whole row调整 JTable 中的一个单元格而不是整行
【发布时间】:2015-08-04 14:46:33
【问题描述】:

我遇到了一个小问题,正在努力解决它。基本上发生的事情是我有一个 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;
}

【问题讨论】:

  • 在 TableCellRenderer 中检查和 columnIndex。

标签: java swing jtable tablecellrenderer


【解决方案1】:

不要覆盖 prepareRenderer() 方法。通常,当您希望渲染对输入行有效时,您只会覆盖此方法。这种方法很有用,因为渲染代码在一个地方,您不必为表中的每一列创建自定义渲染器。

但是,对于特定列中单元格的特定呈现,您应该为该列创建自定义呈现器。

阅读 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;
        }
    }
}

请注意,如果用户对表中的列重新排序,您应该转换列索引。

然后要使用渲染,您可以使用以下方法将其添加到各个列:

TableCellRenderer colorRenderer = new ColorRenderer();
table.getColumnModel().getColumn(1).setCellRenderer( colorRenderer );

【讨论】:

  • 正是我需要的。我查看了您链接的指南以及您的代码摘录,它让我到达了我需要的地方。非常感谢camickr。
【解决方案2】:

我同意 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多