prepareRenderer的Java swing问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了prepareRenderer的Java swing问题相关的知识,希望对你有一定的参考价值。

我正在实现游戏的界面。这个游戏有一个由jtable代表的棋盘。

每个单元格的数字介于0到6之间。

我想让表格显示为“O”而不是数字,如下所示:1 - >绿色2 - >红色等...我已经实现了这个:

public class DTable extends JTable{
@Override
public Component prepareRenderer(TableCellRenderer renderer, int rowIndex, int columnIndex){
    Component component = super.prepareRenderer(renderer, rowIndex, columnIndex);
    component.setBackground(Color.WHITE);

    component.setForeground(Color.BLACK);
    if ((getValueAt(rowIndex, columnIndex) != null)){

        String val = (String) getValueAt(rowIndex, columnIndex);
        setValueAt("O", rowIndex, columnIndex);
        System.out.println("el valor de val es "+val);

        if ("0".equals(val)){
            Color col = new Color(255,255,255);
            component.setForeground(col);
        }
        else if ("1".equals(val)){
            Color col = new Color(255,114,145);
            component.setForeground(col);
        }
        else if ("2".equals(val)){
            Color col = new Color(255,0,0);
            component.setForeground(col);

        }
        else if ("3".equals(val)){
            Color col = new Color(52,146,153);
            component.setForeground(col);

        }
        else if ("4".equals(val)){
            Color col = new Color(0,3,204);
            component.setForeground(col);

        }
        else if ("5".equals(val)){
            Color col = new Color(191,206,20);
            component.setForeground(col);

        }
        else if ("6".equals(val)){
            Color col = new Color(20,206,98);
            component.setForeground(col);

        }
        System.out.println("que pasa aqui");

    }

    return component;
}

问题是它将所有黑色“O”放入细胞中。如果我试图显示“val”的值,第一行给出一个介于0和6之间的数字但是它总是显示“O”。

我相信这里的问题是我没有正确使用prepareRenderer,但我不确定。此外,如果您认为我不应该使用此方法,我愿意接受有关如何将单元格上的数字更改为彩色“O”的建议。谢谢!

答案
setValueAt("O", rowIndex, columnIndex);

问题是您更改了TableModel中的数据。当数据被更改时,表需要重新绘制自己,以便第二次调用prepearRenderer(...)方法,这次单元格的值为“0”。

请勿更改模型中的数据。摆脱那种说法。

相反,您可以更改渲染器中的数据。默认渲染器是JLabel,因此您可以执行以下操作:

//Component component = super.prepareRenderer(renderer, rowIndex, columnIndex);
JLabel renderer = (JLabel)super.prepareRenderer(renderer, rowIndex, columnIndex);
renderer.setText("0");

以上是关于prepareRenderer的Java swing问题的主要内容,如果未能解决你的问题,请参考以下文章

Swin Transformer实战:使用 Swin Transformer实现图像分类。

Swin-Transformer 图像分割实战:使用Swin-Transformer-Semantic-Segmentation训练ADE20K数据集(语义分割)

Swin Transformer v2实战:使用Swin Transformer v2实现图像分类

Swin Transformer v2实战:使用Swin Transformer v2实现图像分类

图像分割2021-Swin-Unet CVPR

Java Swing JTable 设置隔行变色