JTable 单元格中的图标导致 Misrendering
Icon in JTable Cell Causing Misrendering
我正在尝试使用自定义渲染器将单个单元格的背景设置为给定图像。在这种情况下,我给了一个棋盘木方块。
这是之前的样子:
这是之后的样子:
编辑:稍作试验,似乎每个方块都有木头图标。碎片仍然可以移动,结果是:(把它放在评论中因为我不能 post 超过 2 个链接)
在我的代码中,我只是将 setBackground(darkSquare)
替换为 setIcon(wood)
。
@SuppressWarnings("serial")
public class BoardCellRenderer extends DefaultTableCellRenderer {
private ArrayList<Coordinate> possibleMoves = new ArrayList<Coordinate>();
private ImageIcon wood = new ImageIcon("resources/images/light_square.png");
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
setHorizontalAlignment(SwingConstants.CENTER);
Color darkSquare = new Color(125, 125, 125);
//pattern for the chessboard look
if(row % 2 == 0 && column % 2 == 1)
setBackground(darkSquare);
//setIcon(wood);
else if(row % 2 == 1 && column % 2 == 0)
setBackground(darkSquare);
//setIcon(wood);
else
setBackground(Color.WHITE);
for(Coordinate move : possibleMoves)
if(column == move.getX() && row == move.getY()){
setBackground(new Color(255, 51, 51, 50));
System.out.println("Highlighting (" + row + ", " + column + ")");
}
if(hasFocus){
setBorder(new MatteBorder(2, 2, 2, 2, Color.RED));
System.out.println("hasFocus [array]: " + row + ", " + column);
System.out.println("hasFocus [coordinate]: " + column + ", " + row);
}
if(isSelected)
setBorder(new MatteBorder(2, 2, 2, 2, Color.BLUE));
return this;
}
public void setPossibleMoves(ArrayList<Coordinate> possibleMoves){
this.possibleMoves = possibleMoves;
}
}
it seems that every square is given the wood icon.
渲染器会记住它的最后状态。
所以可能是这样的:
// 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 添加到正方形。这篇简单的帖子 Chess Board 可能会给你一些想法。
编辑:
Would that be why the cell looks like it's printing ...?
可能吧。 JLabel 的默认设置是显示图标后跟文本。
您可以使用以下方式更改此行为:
setHorizontalTextPosition(JLabel.CENTER);
setVerticalTextPosition(JLabel.CENTER);
在渲染器的构造函数中。然后文本将在图标上居中。
我正在尝试使用自定义渲染器将单个单元格的背景设置为给定图像。在这种情况下,我给了一个棋盘木方块。
这是之前的样子:
这是之后的样子:
编辑:稍作试验,似乎每个方块都有木头图标。碎片仍然可以移动,结果是:(把它放在评论中因为我不能 post 超过 2 个链接)
在我的代码中,我只是将 setBackground(darkSquare)
替换为 setIcon(wood)
。
@SuppressWarnings("serial")
public class BoardCellRenderer extends DefaultTableCellRenderer {
private ArrayList<Coordinate> possibleMoves = new ArrayList<Coordinate>();
private ImageIcon wood = new ImageIcon("resources/images/light_square.png");
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
setHorizontalAlignment(SwingConstants.CENTER);
Color darkSquare = new Color(125, 125, 125);
//pattern for the chessboard look
if(row % 2 == 0 && column % 2 == 1)
setBackground(darkSquare);
//setIcon(wood);
else if(row % 2 == 1 && column % 2 == 0)
setBackground(darkSquare);
//setIcon(wood);
else
setBackground(Color.WHITE);
for(Coordinate move : possibleMoves)
if(column == move.getX() && row == move.getY()){
setBackground(new Color(255, 51, 51, 50));
System.out.println("Highlighting (" + row + ", " + column + ")");
}
if(hasFocus){
setBorder(new MatteBorder(2, 2, 2, 2, Color.RED));
System.out.println("hasFocus [array]: " + row + ", " + column);
System.out.println("hasFocus [coordinate]: " + column + ", " + row);
}
if(isSelected)
setBorder(new MatteBorder(2, 2, 2, 2, Color.BLUE));
return this;
}
public void setPossibleMoves(ArrayList<Coordinate> possibleMoves){
this.possibleMoves = possibleMoves;
}
}
it seems that every square is given the wood icon.
渲染器会记住它的最后状态。
所以可能是这样的:
// 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 添加到正方形。这篇简单的帖子 Chess Board 可能会给你一些想法。
编辑:
Would that be why the cell looks like it's printing ...?
可能吧。 JLabel 的默认设置是显示图标后跟文本。
您可以使用以下方式更改此行为:
setHorizontalTextPosition(JLabel.CENTER);
setVerticalTextPosition(JLabel.CENTER);
在渲染器的构造函数中。然后文本将在图标上居中。