2012-04-17 18 views
5

Więc pracuję z JTable, który jest związany z niestandardowym modelem danych własnych. To wszystko jest funkcjonalne, ale problem, który mam, polega na tym, że za każdym razem, gdy dokonuję zmiany w tabeli (zwalnianie tableDataChanged, tableStructureChanged itd.), Wszystkie szerokości kolumn resetują się do wartości domyślnych. Rozumiem z badania, że ​​ma to związek z domyślnie przypisanym TableColumnModel. Poza tym resetowaniem, jestem zadowolony z funkcjonalności DefaultTableColumnModel, ale chciałbym zachować szerokość kolumn, jeśli użytkownik powinien zmienić ich rozmiar (przeciągając krawędź nagłówka kolumny).Jak mogę zachować zdefiniowane przez użytkownika szerokości kolumn w JTable?

Jestem świadomy setPreferredWidth() dla TableColumns i udało mi się to zrobić pomyślnie; Przypuszczam, że moje pytanie brzmi, jakiego rodzaju zdarzeń powinienem słuchać, aby zapisać i ustawić tę preferowaną szerokość. Próbowałem dodać PropertyChangeListener do nagłówka tabeli, ale otrzymałem StackOverflow za każdym razem, gdy próbowałem zmienić rozmiar (zakładam, że był uruchomiony rekursywnie). Nie ma problemu z dodaniem dodatkowego elementu danych w modelu danych dla szerokości kolumn i przechowywaniem go tam, ale po prostu nie wiem kiedy/jak ustawić te szerokości, aby nie zostały one nadpisane przez fireTableStructureChanged(), itp. wydarzenia. Myśli?

+1

Przed zamknięciem procesu należy przeczytać szerokości kolumn i zapisać je w pliku właściwości. Po otwarciu procesu przeczytaj plik właściwości i, jeśli istnieje, ustaw szerokość kolumn. Może być konieczne rozszerzenie obiektu DefaultTableColumnModel, aby możliwe było kontrolowanie szerokości kolumn. –

+0

To faktycznie robi to przy każdym wywołaniu fireTableStructureChanged(), nie tylko na początku programu, więc jeśli dodaję lub usuwam kolumny w modelu danych (gdzie musi on odnawiać kolumny), robi to. Próbowałem przesłonić 'fireTableStructureChanged()', aby ręcznie ustawić szerokość kolumn, ale wygląda na to, że nie ma żadnego efektu. Chyba po prostu nie jestem pewien, gdzie dokładnie występuje to generowanie kolumn i gdzie go przesłonić. – kcoppock

+0

Zawsze robiłem szerokości kolumn z danymi. Jeśli coś znajdę, udzielę odpowiedzi. –

Odpowiedz

1

Spróbuj czegoś takiego.

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

Podoba mi się pomysł i działa, ale tylko do następnego zdarzenia zmiany struktury. Dostałem się jednak na właściwą drogę i zdałem sobie teraz sprawę, że wszystko to dzieje się w metodzie 'addColumn()' w 'TableColumnModel'. Zlokalizowałem źródło tutaj: http://fuseyism.com/classpath/doc/javax/swing/table/DefaultTableColumnModel-source.html i nadpisuję, aby dodać również 'column.setPreferredWidth()'. Wiążę odwołanie do mojego modelu danych, aby mógł on uzyskać i ustawić szerokość kolumn w razie potrzeby, i po prostu go obsłużyć. Dziękuję Ci! – kcoppock

1

Co

table.setAutoCreateColumnsFromModel(false);

miałem ten problem, a także, to pracował dla mnie!

Powiązane problemy