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

您似乎正在使用 aJTable作为 a 的视图,TableModel其中每个单元格都以两种状态之一存在。对单元格的可见更改应该由对模型的更改引起,这可以在准备单元格的渲染器时进行检查。特别是,调用方法validate()repaint()应该是必需的。它们的存在表明您在模型不知情的情况下改变了视图,这可以解释所看到的异常。

于 2012-12-13T15:42:45.427 回答
1

尝试

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

这可能是显而易见的,但请记住,您只能将 JComponent 添加到容器中一次

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 回答