我有一个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();
}
}
答案 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,如果可能的话。更加灵活,开箱即用的列排序和隐藏/重新排序。