JTable与ScrollPane行为不端

时间:2012-12-13 13:51:19

标签: java swing jtable jscrollpane

我有一个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();
        }
    }

3 个答案:

答案 0 :(得分:2)

您似乎使用JTable作为TableModel的视图,其中每个单元格都存在于两种状态之一中。对单元格的可见更改应该仅从模型的更改中 ,这可以在准备单元格renderer时进行检查。特别是,调用方法validate()repaint()应该。他们的存在表明你在没有模型知识的情况下改变观点,这可以解释所看到的异常。

答案 1 :(得分:1)

尝试

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

答案 2 :(得分: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,如果可能的话。更加灵活,开箱即用的列排序和隐藏/重新排序。