gpt4 book ai didi

java - 在单个单元格上应用 TableCellRenderer

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:49:15 27 4
gpt4 key购买 nike

我正在尝试能够为 JTable 中的单独单元格着色,但到目前为止我只能在整个列上应用 TableCellRenderer,这显然会出现故障。我有一个自定义 JTable:

public class JColorTable extends JTable{
(...)
public void setCellColor(int col, int row, Color newColor) {
getColumnModel().getColumn(col).setCellRenderer(new ColorField(col, row, newColor, background));
repaint();
}
}

ColorField 看起来像这样:

class ColorField extends DefaultTableCellRenderer {

(...))

@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {

JLabel l = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

if (row == newRow && column == newCol) {
l.setBackground(Color.red);
} else {
l.setBackground(defaultColor);
}

return l;
}
}

当我在一列中有一个彩色单元格时,这就像一个魅力,但是当我尝试为该列中的另一个单元格着色时,前一个被删除(由于 ColorField 中的条件不适用于前一列)。

有没有办法只将 ColorField 应用于单个单元格,而不是整列?如果是这样,如何?恐怕我没有找到合适的东西。

最佳答案

JTable 有一个您可以覆盖的方法 getCellRenderer()。当单元格需要渲染时调用它,并根据行和列返回一个单元格。

您的 JTable 需要记录每个单元格使用哪个渲染器(按行和列)。二维数组或 Map 键是 X、Y 值即可。

添加一个方法以在特定单元格(按行和列)上设置渲染器,然后就可以了。

class MyTable extends JTable {

// all the other JTable stuff goes here too ...

public TableCellRenderer getCellRenderer(int row, int column) {
TableCellRenderer myRenderer = getCustomRenderer(row, column);
if (myRenderer != null) {
return myRenderer;
}
// else...
return super.getCellRenderer(row, column);
}

private Map<Integer, Map<Integer, TableCellRenderer>> rendererMap = new ...;

public void setCustomRenderer(int row, int column, TableCellRenderer renderer) {
Map<Integer, TableCellRenderer> m1 = rendererMap.get(row);
if (m1 == null) {
m1 = new ...;
rendererMap.put(row, m1);
}
m1.put(column, renderer);
}

public TableCellRenderer getCustomRenderer(int row, int column) {
Map<Integer, TableCellRenderer> m1 = rendererMap.get(row);
if (m1 == null) {
return null;
}
return m1.get(column);
}
}

getTableCellRenderer 的默认版本使用在列上设置的渲染器(如果有的话),如果没有,则使用基于单元格内容类的渲染器。在许多情况下,默认单元格内容是 Object。这取决于使用的 TableModel

关于java - 在单个单元格上应用 TableCellRenderer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16407086/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com