JTable,每列多个类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JTable,每列多个类相关的知识,希望对你有一定的参考价值。

我想做一张包含第1行StringImage的表。

我使用这个(我将2改为0以获得String表)。我有办法做到这两点吗?

DefaultTableModel table = new DefaultTableModel(model.getRowCount(),model.getColumnCount()) {
    public Class getColumnClass(int column)
    {
        return getValueAt(2, column).getClass();
    }
};

Table with image

Table with string

答案

默认渲染器无法渲染每个类的每个实例,并且不会渲染Image实例。

如果你愿意使用(或者像安德鲁所说的那样滥用)JTable根据单元类进行任意渲染,你必须编写自己的渲染器。您可以将您的课程建立在DefaultTableCellRenderer上,或者根据您的需要实施自己的TableCellRenderer

然后使用JTable.setDefaultRenderer为每个特定的类类型安装渲染器(注意,典型的字符串渲染由默认渲染器处理)。

另一答案

在我看来,“User1,User2,...”应该是列标题而不是TableModel的数据。

行的数据应该是ImageIcon而不是文件的名称。渲染器不应从文件中读取数据。

阅读How to Use Tables上的Swing教程中的部分,了解有关使用JTable的基础知识的更多信息。

如果确实需要在每个单元格中使用混合数据,则可以通过检查单元格中存储的数据的类类型来获取单元格的渲染器。

JTable table = new JTable(data, columnNames)
{
    public TableCellRenderer getCellRenderer(int row, int column)
    {
        int modelColumn = convertColumnIndexToModel(column);                
        Class cellClass = getModel().getValueAt(row, modelColumn).getClass();

        return getDefaultRenderer( cellClass );
    }
};

当然你需要:

  1. 确保单元格值不为空
  2. 将Image存储为ImageIcon,而不是文件的String名称

以上是关于JTable,每列多个类的主要内容,如果未能解决你的问题,请参考以下文章

如何在JTable中选择行或列?

如何仅使用列标题创建JTable,不添加任何行

以编程方式选择JTable中的多个单元格

Jtable ListSelectionListener不响应jtable操作并响应另一个jtable操作,在同一个类中

JTable的TableColumn添加多个JProgressBar

swing 怎样实现表格内容刷新