2012-04-17 11 views
5

Quindi sto lavorando con un JTable, che è legato a un modello di dati personalizzato del mio. Questo è tutto funzionale, ma il problema che sto avendo è che ogni volta che apporto una modifica alla tabella (firing tableDataChanged, tableStructureChanged, ecc.) Tutte le larghezze delle colonne si resettano ai valori predefiniti. Capisco dalla ricerca che questo ha a che fare con il TableColumnModel assegnato di default. Al di fuori di questa reimpostazione, sono soddisfatto della funzionalità dello DefaultTableColumnModel, ma vorrei solo mantenere la larghezza delle colonne se un utente dovrebbe ridimensionarle (trascinando il bordo dell'intestazione della colonna).Come mantenere le larghezze delle colonne specificate dall'utente in una tabella J?

Sono a conoscenza di setPreferredWidth() per TableColumns e sono riuscito a farlo correttamente; Suppongo che la mia domanda sia quale tipo di evento dovrei ascoltare per salvare e impostare questa larghezza preferita. Ho provato ad aggiungere un PropertyChangeListener all'intestazione della tabella, ma otterrei uno StackOverflow ogni volta che ho provato a ridimensionare (presumo che fosse in esecuzione in modo ricorsivo). Sto perfettamente bene con l'aggiunta di un membro dati aggiuntivo nel modello dati per le larghezze delle colonne, e memorizzandolo lì, ma non so quando/come impostare queste larghezze in modo che non vengano sovrascritte dallo fireTableStructureChanged(), ecc. Pensieri?

+1

Prima di chiudere il processo, leggere le larghezze delle colonne e salvarle in un file delle proprietà. Quando apri il tuo processo, leggi il file delle proprietà e, se esiste, imposta le larghezze della colonna. Potrebbe essere necessario estendere il DefaultTableColumnModel in modo da poter controllare le larghezze della colonna. –

+0

Effettua questo in qualsiasi chiamata a fireTableStructureChanged(), non solo all'inizio del programma, quindi se aggiungo o rimuovo le colonne nel modello di dati (dove deve rigenerare le colonne) lo fa. Ho provato a sovrascrivere 'fireTableStructureChanged()' per impostare manualmente le larghezze delle colonne, ma apparentemente non ha alcun effetto. Immagino di non essere esattamente sicuro di dove si trova questa generazione di colonne e dove sovrascriverlo. – kcoppock

+0

Ho sempre fatto le larghezze delle colonne basate sui dati. Se trovo qualcosa, fornirò una risposta. –

risposta

1

Prova qualcosa del genere.

import javax.swing.JTable; 
import javax.swing.table.TableColumn; 
import javax.swing.table.TableColumnModel; 

public class ColumnResizer { 

    public static void setColumnPreferredWidth(JTable table, int column, 
      int preferredWidth) { 
     TableColumnModel columnModel = table.getColumnModel(); 
     TableColumn tableColumn = columnModel.getColumn(column); 
     tableColumn.setPreferredWidth(preferredWidth); 
    } 

} 
+0

Mi piace l'idea, e funziona, ma solo fino al prossimo evento di modifica della struttura. Mi ha messo sulla strada giusta, però, e mi sono reso conto ora che tutto si verifica nel metodo 'addColumn()' di 'TableColumnModel'. Ho individuato la fonte qui: http://fuseyism.com/classpath/doc/javax/swing/table/DefaultTableColumnModel-source.html e sto eseguendo l'override per aggiungere un 'column.setPreferredWidth()' anche lì. Legerò un riferimento al mio modello di dati in modo che possa ottenere e impostare le larghezze delle colonne secondo necessità e gestirle lì. Grazie! – kcoppock

1

Che dire

table.setAutoCreateColumnsFromModel(false);

Ho avuto questo problema pure, questo ha funzionato per me!

Problemi correlati