如何在JTable内部呈现另一个JTable?

4
我正在尝试将一个JTable嵌套在另一个JTable的列中(使用CellRenderer)。
示例(错误的)输出:
为什么以下示例没有输出表格中的表格?
import java.awt.Component;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;

public class Test {

    public static void main(String[] args) {
        JTable table = new JTable(new CustomTableModel());
        table.setDefaultRenderer(Person.class, new CustomRenderer());
        JPanel panel = new JPanel();
        panel.add(new JScrollPane(table));
        JFrame frame = new JFrame();
        frame.setContentPane(panel);
        frame.pack();
        frame.setVisible(true);
    }
}

@SuppressWarnings("serial")
class CustomTableModel extends AbstractTableModel {

    @Override
    public int getColumnCount() {
        return 2;
    }

    @Override
    public int getRowCount() {
        return 1;
    }

    @Override
    public Object getValueAt(int row, int col) {
        if (col == 0) {
            return new Person("Bob");
        } else {
            return "is awesome!";
        }
    }
}

@SuppressWarnings("serial")
class CustomRenderer extends JPanel implements TableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int col) {
        JTable t = new JTable(new CustomTableModel());
        add(new JScrollPane(t));
        return this;
    }
}

class Person {

    public String name = "";

    public Person(String name) {
        this.name = name;
    }
}
1个回答

4
不要将子表添加到滚动窗格中。取而代之的是,尝试将表格添加到具有BorderLayout的JPanel的中心位置,然后将表头添加到NORTH位置。这样做的主要原因是滚动窗格不会是交互式的,可能会隐藏数据。
更新:
我在用手机看代码,所以很难读懂 :P
在您的主表模型中,您需要重写getColumnClass方法,并确保为所需列(和其他列的正确类类型)返回Person.class。

我会尝试滚动窗格,但是关于不返回这个问题 - 我认为最好的做法是只实例化渲染器的主要组件一次。编辑:我仍然收到一个没有滚动窗格的字符串值 - 我将上传一个截图。 - sdasdadas
1
最好能够减少短暂对象的数量,但是无论如何您每次交互都要创建JTable。 - MadProgrammer
没错,但这些都是次要的问题,因为滚动窗格并没有阻止 JTable 的显示。 - sdasdadas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接