Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTable单元格中的图标导致错误渲染_Java_Swing_Cell_Renderer - Fatal编程技术网

Java JTable单元格中的图标导致错误渲染

Java JTable单元格中的图标导致错误渲染,java,swing,cell,renderer,Java,Swing,Cell,Renderer,我正在尝试使用自定义渲染器将单个单元格的背景设置为给定的图像。在这种情况下,我给一个棋盘木格 这是它以前的样子: 下面是它之后的样子: 编辑:通过一些实验,似乎每个正方形都有一个木头图标。文章仍然可以移动,结果是:(将其放在评论中,因为我不能发布超过2个链接) 在我的代码中,我只是用setIcon(wood)替换了setBackground(暗方) @SuppressWarnings(“串行”) 公共类BoardCellRenderer扩展了DefaultTableCellRenderer{

我正在尝试使用自定义渲染器将单个单元格的背景设置为给定的图像。在这种情况下,我给一个棋盘木格

这是它以前的样子:

下面是它之后的样子:

编辑:通过一些实验,似乎每个正方形都有一个木头图标。文章仍然可以移动,结果是:(将其放在评论中,因为我不能发布超过2个链接)

在我的代码中,我只是用
setIcon(wood)
替换了
setBackground(暗方)

@SuppressWarnings(“串行”)
公共类BoardCellRenderer扩展了DefaultTableCellRenderer{
private ArrayList possibleMoves=new ArrayList();
私有ImageIcon wood=newImageIcon(“resources/images/light_square.png”);
@凌驾
公共组件GetTableCellRenderComponent(JTable表、对象值、布尔isSelected、布尔hasFocus、int行、int列){
getTableCellRenderComponent(表、值、isSelected、hasFocus、行、列);
设置水平对齐(旋转恒定中心);
颜色暗方=新颜色(125、125、125);
//棋盘样式
if(行%2==0和列%2==1)
后退地面(暗方);
//塞蒂肯(木);
else if(行%2==1和列%2==0)
后退地面(暗方);
//塞蒂肯(木);
其他的
挫折地面(颜色:白色);
用于(坐标移动:可能移动)
if(列==move.getX()&行==move.getY()){
挫折背景(新颜色(255,51,51,50));
System.out.println(“突出显示(“+行+”,“+列+”));
}
如果(hasFocus){
setboorder(新的MatteBorder(2,2,2,2,Color.RED));
System.out.println(“hasFocus[array]:“+行+”,“+列”);
System.out.println(“hasFocus[坐标]:“+列+”,“+行”);
}
如果(当选)
setboorder(新的MatteBorder(2,2,2,2,Color.BLUE));
归还这个;
}
public void setPossibleMoves(ArrayList possibleMoves){
this.possibleMoves=possibleMoves;
}
}
似乎每个正方形都有一个木制的图标

渲染器会记住其最后一个状态

所以可能是这样的:

//  set the default values

setBackground(Color.WHITE); 
setIcon(null);  

if(row % 2 == 0 && column % 2 == 1)
    //setBackground(darkSquare);
    setIcon(wood);
else if(row % 2 == 1 && column % 2 == 0)
    //setBackground(darkSquare);
    setIcon(wood);
当然,当您想要在木头上显示一个棋子时,您仍然会遇到问题,因为您需要渲染两个图标,一个用于背景,一个用于棋子

我不确定JTable是否是用于此目的的最佳组件。使用带有JPanel/JLabel网格的JPanel来表示木正方形可能更容易。然后将带有棋子图标的JLabel添加到正方形中。这篇简单的帖子可能会给你一些想法

编辑:

这就是为什么细胞看起来像在打印

可能吧。JLabel的默认设置是显示图标,后跟文本

您可以使用以下方法更改此行为:

setHorizontalTextPosition(JLabel.CENTER);
setVerticalTextPosition(JLabel.CENTER);

在渲染器的构造函数中。然后文本将居中于图标上方。

不要使用渲染器执行此任务,图标/图像图标应存储在XxxTableModel中,然后XxxRenderer负责从模型和棋盘背景绘制图像是否可以简单地将图像绘制到单元格背景,而不是用指定的图像填充?我可以看到JLabels的网格将如何更好地工作(我以前甚至考虑过这样做),但我不确定如何使它像JTable一样易于使用。绘制表的单元格是渲染器的工作。每当需要绘制单元格时,表就会调用渲染器。所以通过设置图标,我覆盖了存储在单元格中的文本?这就是为什么单元格看起来像在打印<代码>…?是将图像的文本表示形式连接到用于表示片段的字符,从而用缩写为
?@user5705019的长字符串填充单元格,请参见编辑。不要忘记点击复选标记“接受”答案,这样人们就知道问题已经解决了。
setHorizontalTextPosition(JLabel.CENTER);
setVerticalTextPosition(JLabel.CENTER);