Java 带有滚动窗格的JTable行为不正常

Java 带有滚动窗格的JTable行为不正常,java,swing,jtable,jscrollpane,Java,Swing,Jtable,Jscrollpane,我有一个JPanel组件,里面有一个JTable。当我按照下面所写的方式运行代码时,表将正确呈现和更新。只要我尝试使用滚动窗格方法,表就根本不会呈现。有人能解释一下为什么会这样吗 private static class GameHistoryPanel extends JPanel { private DataModel model; private JTable table; private int currentRow;

我有一个
JPanel
组件,里面有一个
JTable
。当我按照下面所写的方式运行代码时,表将正确呈现和更新。只要我尝试使用
滚动窗格
方法,表就根本不会呈现。有人能解释一下为什么会这样吗

    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();
        }
    }
试一试

试一试


这可能是显而易见的,但请记住,您只能将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。更加灵活,开箱即用的列排序和隐藏/重新排序。

这可能是显而易见的,但请记住,您只能将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。更加灵活,开箱即用的列排序和隐藏/重新排序。

您似乎正在使用
JTable
作为
TableModel
的视图,其中每个单元格处于两种状态之一。单元格的可见变化应仅由模型的变化引起,这可在准备单元格的数据时进行检查。特别是,不需要调用方法
validate()
repaint()
。它们的存在表明您在模型不知情的情况下改变了视图,这可以解释所看到的异常现象。

似乎您正在使用
JTable
作为
TableModel
的视图,其中每个单元格处于两种状态之一。单元格的可见变化应仅由模型的变化引起,这可在准备单元格的数据时进行检查。特别是,不需要调用方法
validate()
repaint()
。他们的出现表明你在模型不知情的情况下改变了视图,这可以解释所看到的异常现象。

@AmirAfghani,尝试设置PreferredSizeJScrollPane@Amir阿富汗人随后发布了一篇文章,详细演示了您的问题,简短、可运行、可编译,大约是JFrame、JSCrollPane和JTable@Nikolay库兹涅佐夫的建议太快了,没有SSCCE的一切都是黑暗的:-)将其提取到SSCCE将是困难的-我会看看我能做些什么。奇怪的是,包含桌子的整个面板是灰色的。当它工作时,表格呈现为白色。使用
getPreferredScrollableViewportSize()
是一个(稍微)更好的选择,而使用
JScrollPane
则是一个更好的选择。另请参见?@AmirAfghani,尝试设置PreferredSizeJScrollPane@Amir阿富汗人随后发布了一篇文章,详细演示了您的问题,简短、可运行、可编译,大约是JFrame、JSCrollPane和JTable@Nikolay库兹涅佐夫的建议太快了,没有SSCCE的一切都是黑暗的:-)将其提取到SSCCE将是困难的-我会看看我能做些什么。奇怪的是,包含桌子的整个面板是灰色的。当它工作时,表格呈现为白色。使用
getPreferredScrollableViewportSize()
是一个(稍微)更好的选择,而使用
JScrollPane
则是一个更好的选择。你也看到了吗?谢谢你的回答,但事实上这是显而易见的。前者有效,后者无效。为什么不显式地添加表头呢?谢谢你的回答,但这是显而易见的。前者有效,后者无效。为什么不应该明确添加表头?我认为(@trashgood)回答的所有重要问题和代码都在那里,我认为(@trashgood)回答的所有重要问题和代码都在那里,