Posso darvi un possibile approccio. Stavo cercando di risolvere lo stesso problema, perché volevo serializzare le informazioni sulla larghezza delle colonne su disco, in modo che la prossima volta che la tabella si aprisse nella mia applicazione, potrei ripristinare le larghezze della colonna in modo appropriato. Qui va:
Fase 1 - ignorare la JTable e aggiungere una proprietà booleana ad esso
class MyTable extends JTable {
private boolean isColumnWidthChanged;
public boolean getColumnWidthChanged() {
return isColumnWidthChanged;
}
public void setColumnWidthChanged(boolean widthChanged) {
isColumnWidthChanged = widthChanged;
}
}
Fase 2 - Aggiungi un TableColumnModelListener() alla tabella
private class TableColumnWidthListener implements TableColumnModelListener
{
@Override
public void columnMarginChanged(ChangeEvent e)
{
/* columnMarginChanged is called continuously as the column width is changed
by dragging. Therefore, execute code below ONLY if we are not already
aware of the column width having changed */
if(!tableObj.hasColumnWidthChanged())
{
/* the condition below will NOT be true if
the column width is being changed by code. */
if(tableObj.getTableHeader.getResizingColumn() != null)
{
// User must have dragged column and changed width
tableObj.setColumnWidthChanged(true);
}
}
}
@Override
public void columnMoved(TableColumnModelEvent e) { }
@Override
public void columnAdded(TableColumnModelEvent e) { }
@Override
public void columnRemoved(TableColumnModelEvent e) { }
@Override
public void columnSelectionChanged(ListSelectionEvent e) { }
}
Passaggio 3: aggiungi un listener del mouse all'intestazione della tabella
private class TableHeaderMouseListener extends MouseAdapter
{
@Override
public void mouseReleased(MouseEvent e)
{
/* On mouse release, check if column width has changed */
if(tableObj.getColumnWidthChanged())
{
// Do whatever you need to do here
// Reset the flag on the table.
tableObj.setColumnWidthChanged(false);
}
}
}
NOTA: Nella mia applicazione, le classi TableHeaderMouseListener e TableColumnWidthListener erano classi interne private della mia classe di applicazione principale. La mia classe di applicazione principale si è mantenuta su un riferimento del tavolo osservato. Pertanto, queste classi interne hanno avuto accesso all'istanza della tabella. Ovviamente, a seconda della configurazione, è necessario fare la cosa appropriata per rendere l'istanza della tabella disponibile per queste altre classi. Spero che questo ti aiuti!
A meno che non lo si cambi, la sorgente sarà sempre la 'DefaultTableColumnModel' della tabella tramite' fireColumnMarginChanged() '. Che problema stai cercando di risolvere? – trashgod
in nessun modo. Ripetendo la domanda @ trashgod: perché? – kleopatra
Se il proprio codice che modifica la dimensione della colonna, è sempre possibile disattivare o rimuovere il listener prima della modifica, apportare la modifica e quindi reattivi o aggiungere nuovamente il listener. – Robin