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;
    }
}
4

1 に答える 1

4

サブテーブルをスクロール ペインに追加しないでください。代わりに、BorderLayout を使用して JPanel の中央位置にテーブルを追加してから、テーブル ヘッダーを NORTH 位置に追加してみてください。

これの主な理由は、スクロール ペインがインタラクティブではなく、データが非表示になる可能性があることです。

更新しました

私は電話をしているので、コードを読むのは難しいです:P

メイン テーブル モデルでは、getColumnClass メソッドをオーバーライドし、必要な列の Person.class を返すようにする必要があります (および他の列の正しいクラス タイプ)。

于 2013-02-15T21:38:03.063 に答える