2

内部にコンポーネントJPanelがあります。JTable以下に記述されているコードを実行すると、テーブルが正しくレンダリングおよび更新されます。このアプローチを使用しようとするとすぐにscrollPane、テーブルがまったくレンダリングされません。誰かが私にこれがなぜなのか説明できますか?

    private static class GameHistoryPanel extends JPanel {

        private DataModel model;
        private JTable table;
        private int currentRow;
        private int currentColumn;
        private final Dimension HISTORY_PANEL_DIMENSION = new Dimension(190,460);


        public GameHistoryPanel() {
            this.setLayout(new BorderLayout());
            this.model = new DataModel();
            this.table = new JTable(model);
            this.add(table.getTableHeader(), BorderLayout.NORTH);
            this.add(table, BorderLayout.CENTER);
//            JScrollPane scrollPane = new JScrollPane();
//            scrollPane.setViewportView(table);
//            this.add(scrollPane);
            setPreferredSize(HISTORY_PANEL_DIMENSION);
            this.currentRow = 0;
            this.currentColumn = 0;
        }

        public void increment(Board board, Move move) {
            model.setValueAt(move, currentRow, currentColumn);
            if(board.currentPlayer().getAlliance() == Alliance.WHITE) {
                currentColumn++;
            } else if (board.currentPlayer().getAlliance() == Alliance.BLACK) {
                currentRow++;
                currentColumn = 0;
            }
            validate();
            repaint();
        }
    }
4

3 に答える 3

2

各セルが 2 つの状態のいずれかに存在するのJTableas ビューを使用しているようです。TableModelセルへの目に見える変更は、セルのレンダラーを準備する際に調べることができるモデルへの変更によってのみ生じる必要があります。特に、メソッドandの呼び出しは必須ではありませ。それらの存在は、モデルの知識なしにビューを変更していることを示唆しており、異常が見られたことを説明できます。validate()repaint()

于 2012-12-13T15:42:45.427 に答える
1

これは当たり前のことかもしれませんが、コンテナに JComponent を追加できるのは1 回だけであることを覚えておいてください。

this.setLayout(new BorderLayout());
this.model = new DataModel();
this.table = new JTable(model);

あなたのどちらか

this.add(table, BorderLayout.CENTER);
// note that table-headers should not be added explicitly
// commented out: this.add(table.getTableHeader(), BorderLayout.NORTH);

もしくは、あなた

JScrollPane scrollPane = new JScrollPane(table);
this.add(scrollPane);

ただし、両方を実行しようとすると問題が発生します。

可能であれば、Swingx の JXTable を使用することをお勧めします。はるかに柔軟で、すぐに使用できる列の並べ替えと非表示/並べ替え。

于 2012-12-13T14:31:29.623 に答える
1

試す

JScrollPane scrollPane = new JScrollPane(table);
this.add(scrollPane);
于 2012-12-13T13:52:46.913 に答える