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)回答的所有重要问题和代码都在那里,