有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

prepareRenderer的Java swing问题

我正在用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”的建议。 谢谢


共 (1) 个答案

  1. # 1 楼答案

    setValueAt("O", rowIndex, columnIndex);
    

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

    不要更改模型中的数据。摆脱那句话

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

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