0

各行の高さを変えることができる JTable のセル レンダラーを作成しています。テーブルの各列について、隣接する非表示の列をテーブルに追加しました。これには、行の高さの int 値が含まれているだけです。これは非効率的であり、より複雑なサイズ変更を実装すると問題が発生すると思います。

getTableCellRendererComponentからアクセスできるメインクラスによって初期化された静的リストを持つ方法はありますか?

私が現在行っていることのスタンドアロンの例を次に示します。

import java.awt.Component;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;


public class variableRowHeightDemo extends JFrame {

    public variableRowHeightDemo() {
        JTable vr_table = new JTable();

        vr_table.setModel(new DefaultTableModel(
                new Object[][]{
                    {"Height: 30", 30},
                    {"Height: 60", 60},
                    {"Height: 90", 90},},
                new String[]{
                    "String", "int height value"
                }));

        vr_table.setDefaultRenderer(Object.class, new variableRowHeightRenderer());

        add(vr_table);
        pack();
    }

    static class variableRowHeightRenderer extends JTextField implements TableCellRenderer {

        @Override
        public Component getTableCellRendererComponent(JTable table,
                Object value, boolean isSelected, boolean hasFocus, int row,
                int col) {

            // rows heights stored in second invis column
            int height = (int) table.getModel().getValueAt(row, 1);
            table.setRowHeight(row, height);

            this.setText(value.toString());
            return this;
        }
    }

    public static void main(String[] args) {

        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new variableRowHeightDemo().setVisible(true);
            }
        });
    }
}

基本的に、テーブルモデルの外に行の高さを保存したいのですが、行の高さのリストを最終的にせずにサブクラスからそれらにアクセスする方法がわかりません。また、私の実装に明らかな問題がある場合は、それを聞いていただければ幸いです。

ありがとう、

ジェームズ

4

1 に答える 1

2
table.setRowHeight(row, height);

そのコード行は、レンダラーでは使用しないでください。レンダリング内からテーブルのプロパティを変更しないでください。レンダラーが高さを変更し、テーブルが行を再描画するため、投稿したコードは無限ループを引き起こします...

基本的にはテーブルモデルの外に行の高さを格納したいのですが、

モデルにデータを追加するときに table.setRowHeight() メソッドを使用することの何が問題になっていますか? 同時にテーブルを更新できます。

于 2013-05-27T05:22:24.363 に答える