java - horizontal - JTable con un ScrollPane portándose mal
jtable scroll vertical (3)
Tengo un componente JPanel
con una JTable
dentro de él. Cuando ejecuto el código como está escrito a continuación, la tabla muestra y actualiza correctamente. Tan pronto como trato de utilizar el enfoque scrollPane
, la tabla no se representa en absoluto. ¿Alguien puede explicarme por qué es esto?
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();
}
}
Esto puede indicar lo obvio, pero recuerde que solo puede agregar un JComponent a un contenedor una vez .
Después
this.setLayout(new BorderLayout());
this.model = new DataModel();
this.table = new JTable(model);
tampoco tú
this.add(table, BorderLayout.CENTER);
// note that table-headers should not be added explicitly
// commented out: this.add(table.getTableHeader(), BorderLayout.NORTH);
o tu
JScrollPane scrollPane = new JScrollPane(table);
this.add(scrollPane);
pero intentar hacer ambas cosas generará problemas.
Recomiendo usar la JXTable de Swingx, si es posible. Clasificación y ocultación / reordenamiento de columnas mucho más flexibles y listas para usar.
Parece que está utilizando una JTable
como vista de un TableModel
de TableModel
en el que cada celda existe en uno de dos estados. Los cambios visibles en una celda deben ser el resultado de un cambio en el modelo, que se puede examinar al preparar el procesador de la celda. En particular, no se debería requerir la invocación de los métodos validate()
y repaint()
. Su presencia sugiere que está alterando la vista sin el conocimiento del modelo, lo que podría explicar la anomalía observada.
Tratar
JScrollPane scrollPane = new JScrollPane(table);
this.add(scrollPane);