Java - JTable 自定义 TableCellRenderer + 允许重新排序
Java - JTable Custom TableCellRenderer + Reordering Allowed
我的代码很长,所以我正在为我的问题做一个简短的例子。
我有一个包含 2 列的 JTable,均包含数字。我需要一列,假设 B 列以不同方式呈现。这就是为什么我创建了一个客户 TableCellRenderer,它将数字转换为 JPanel(几个图标、文本等)。创建 JTable 时,我将 B 列的 class 设置为 JPanel,将 A 列的 class 设置为 Number:
table = new JTable(model)
{
public Class getColumnClass(int column)
{
if(column == 1)
{
return Number.class;
}
if(column == 2)
{
return JPanel.class;
}
return super.getColumnClass(column);
}
}
table.setDefaultRenderer(JPanel.class, (TableCellRenderer) new RendererCurrency());
DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment(JLabel.CENTER);
table.setDefaultRenderer(Number.class , centerRenderer);
到目前为止一切正常,两列都显示正确的值并正确呈现。 当我想要允许重新排序 = 真时,问题就出现了。
只要您在 运行 软件中切换列,列及其值就会切换...
但不是渲染器
这会导致 A 列呈现,B 列成为标准,反之亦然。
这可能是因为我为特定的列索引设置了 class,但我不知道我还应该怎么做。
感谢@Manu,我能够通过将列索引转换为视图来解决此问题:
public Class getColumnClass(int column)
{
if(column == table.convertColumnIndexToView(1))
{
return Number.class;
}
if(column == table.convertColumnIndexToView(2))
{
return JPanel.class;
}
return super.getColumnClass(column);
}
我的代码很长,所以我正在为我的问题做一个简短的例子。
我有一个包含 2 列的 JTable,均包含数字。我需要一列,假设 B 列以不同方式呈现。这就是为什么我创建了一个客户 TableCellRenderer,它将数字转换为 JPanel(几个图标、文本等)。创建 JTable 时,我将 B 列的 class 设置为 JPanel,将 A 列的 class 设置为 Number:
table = new JTable(model)
{
public Class getColumnClass(int column)
{
if(column == 1)
{
return Number.class;
}
if(column == 2)
{
return JPanel.class;
}
return super.getColumnClass(column);
}
}
table.setDefaultRenderer(JPanel.class, (TableCellRenderer) new RendererCurrency());
DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment(JLabel.CENTER);
table.setDefaultRenderer(Number.class , centerRenderer);
到目前为止一切正常,两列都显示正确的值并正确呈现。 当我想要允许重新排序 = 真时,问题就出现了。
只要您在 运行 软件中切换列,列及其值就会切换...
但不是渲染器
这会导致 A 列呈现,B 列成为标准,反之亦然。
这可能是因为我为特定的列索引设置了 class,但我不知道我还应该怎么做。
感谢@Manu,我能够通过将列索引转换为视图来解决此问题:
public Class getColumnClass(int column)
{
if(column == table.convertColumnIndexToView(1))
{
return Number.class;
}
if(column == table.convertColumnIndexToView(2))
{
return JPanel.class;
}
return super.getColumnClass(column);
}