JTable,每列多个类

时间:2019-04-23 12:32:45

标签: java swing jtable

我想做一个表,其中第一行包含String,另一行包含Image

我使用它(将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

2 个答案:

答案 0 :(得分:0)

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

如果您愿意使用(或像安德鲁所说的那样滥用)JTable来基于单元类进行任意渲染,则必须编写自己的渲染器。您可以根据自己的需要来上课,DefaultTableCellRenderer或实现自己的TableCellRenderer

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

答案 1 :(得分:0)

在我看来,“ 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. 将图像存储为ImageIcon,而不是文件的字符串名称