Java prepareRenderer 的摆动问题
Java swing problems with prepareRenderer
我正在用 swing 实现一个游戏的界面。这个游戏有一个由 jtable 表示的棋盘。
每个单元格都有一个介于 0 和 6 之间的数字。
我想让 table 显示彩色 "O" 而不是数字,如下所示:
1 - > 绿色
2 - > 红色
ETC...
我已经实现了这个:
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 中的数据。当数据更改时,table 需要重新绘制自身,以便第二次调用您的 prepearRenderer(...) 方法,这次单元格的值为“0”。
不要更改模型中的数据。去掉那个语句。
相反,您可以更改渲染器中的数据。默认渲染器是 JLabel,因此您可以执行以下操作:
//Component component = super.prepareRenderer(renderer, rowIndex, columnIndex);
JLabel renderer = (JLabel)super.prepareRenderer(renderer, rowIndex, columnIndex);
renderer.setText("0");
我正在用 swing 实现一个游戏的界面。这个游戏有一个由 jtable 表示的棋盘。
每个单元格都有一个介于 0 和 6 之间的数字。
我想让 table 显示彩色 "O" 而不是数字,如下所示: 1 - > 绿色 2 - > 红色 ETC... 我已经实现了这个:
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 中的数据。当数据更改时,table 需要重新绘制自身,以便第二次调用您的 prepearRenderer(...) 方法,这次单元格的值为“0”。
不要更改模型中的数据。去掉那个语句。
相反,您可以更改渲染器中的数据。默认渲染器是 JLabel,因此您可以执行以下操作:
//Component component = super.prepareRenderer(renderer, rowIndex, columnIndex);
JLabel renderer = (JLabel)super.prepareRenderer(renderer, rowIndex, columnIndex);
renderer.setText("0");