vertical horizontal ejemplo agregar java swing jtable jscrollpane

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);