ERLEDIGT
NEIN
NEIN
ANTWORTEN
2
2
ZUGRIFFE
518
518
EMPFEHLEN
-
Hallo Community,
ich möchte gerne den Spaltennamen einer JTable ändern ohne dabei das TableColumnModel der JTable zu manipulieren / komplett neu zu schreiben.
Was ich möchte:
Einzelne Spalten sollen in der Tabelle zur Laufzeit ausgeblendet oder umbenannt werden können.
Das Umbenennen realisiere ich, in dem ich auf das TableColumnModel zugreife und dort die betreffende Spalte entferne, damit nicht die Daten im TableModel gelöscht werden, sondern nur die Spalte ausgeblendet wird.
Das funktioniert auch.
Das Umbenennen der Spalten möchte ich hingegen im TableModel realisieren. (Da auf dieses Model später zugegriffen wird)
Ich habe ein eigenes Model, welches von AbstractTableModel ableitet und eine renameColumn-Methode implementiert. In dieser Methode wird ein fireTableStructureChanged() ausgelöst, das anscheinend dafür sorgt, dass auch das ColumnModel neu geschrieben wird.
Problem:
Wenn nun nach dem Umbenennen das ColumnModel neu geschrieben wird, sind alle vorher ausgeblendeten Spalten wieder sichtbar. Auch die über die GUI vorgenommene Sortierung ist natürlich weg.
Wie verhindere ich das?
Mein bisheriger Ansatz:
Ich lasse das fireTableStructureChanged() im TableModel weg und ändere den Spaltennamen zusätzlich im ColumnModel. Dann bleiben die ausgeblendeten Spalten weiterhin ausgeblendet, das Model wurde verändert und der geänderte Spaltenname ist in der GUI auch sichtbar. Allerdings finde ich diese Lösung nicht so elegant.
--
Ich hoffe mein Anliegen war verständlich. Code Beispiele gibt es gerne auf Anfrage.Geändert von Licorice (21.09.11 um 16:01 Uhr)
-
Hier nochmal ein direkt ausführbares Beispiel.
Wie es aussieht komme ich nicht darum herum ein eigenes ColumnModel zu implementieren!?
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
//package example; import javax.swing.table.DefaultTableModel; /** @author http://www.tutorials.de/members/licorice.html */ public class TableColumnRenameDemo extends javax.swing.JFrame { /** Konstruktor */ public TableColumnRenameDemo() { initComponents(); // Fenster zentrieren setLocationRelativeTo(null); // Eine Spalte vorab verschieben jTable.getColumnModel().moveColumn(1, 2); // Eine andere Spalte voran *ausblenden* javax.swing.table.TableColumn column = jTable.getColumnModel().getColumn(3); jTable.getColumnModel().removeColumn(column); } /** Generated Code */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { jButton_rename = new javax.swing.JButton(); jScrollPane1 = new javax.swing.JScrollPane(); jTable = new javax.swing.JTable(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); jButton_rename.setText("Spalte 2 umbennen"); jButton_rename.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton_renameActionPerformed(evt); } }); jTable.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { {"a", "b", "c", "d"}, {"aa", "bb", "cc", "dd"}, {"aaa", "bbb", "ccc", "ddd"} }, new String [] { "Spalte 1", "Spalte 2", "Spalte 3", "Spalte 4" } ) { Class[] types = new Class [] { java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class }; boolean[] canEdit = new boolean [] { false, false, false, false }; public Class getColumnClass(int columnIndex) { return types [columnIndex]; } public boolean isCellEditable(int rowIndex, int columnIndex) { return canEdit [columnIndex]; } }); jScrollPane1.setViewportView(jTable); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jButton_rename) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 452, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jButton_rename) .addGap(18, 18, 18) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 315, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); pack(); }// </editor-fold> private void jButton_renameActionPerformed(java.awt.event.ActionEvent evt) { /** * * --------------------------------------------------------------------- * Hier soll Spalte 2 umbenannt werden. * Zur Demonstration hier mit einem statischen Feld. * (Mein Model besitzt dazu eine einfachere rename-Methode.) * * Nachdem die Spalte umbenannt wurde, wird das ColumnModel geändert und * somit bereits ausgeblendete Spalten wieder eingeblendet, vom User * verschobene Spalten wieder in der ursprünglichen Reihenfolge * angezeigt. Das will ich verhindern! * * Wie!? * * Komme ich nicht drum herum ein eigenes ColumnModel zu implementieren? * --------------------------------------------------------------------- * */ String[] newColumns = new String[]{ "Spalte 1", "Spalte 2 (umbenannt)", "Spalte 3", "Spalte 4" }; DefaultTableModel dtm = (DefaultTableModel)jTable.getModel(); dtm.setColumnIdentifiers(newColumns); } /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new TableColumnRenameDemo().setVisible(true); } }); } // Variables declaration - do not modify private javax.swing.JButton jButton_rename; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTable jTable; // End of variables declaration }Freue mich über eine Bewertung oder ein Danke.
-
Falls mal jemand über diesen Thread stolpert...
Ich habe jetzt herausgefunden, dass die JTable eine Eigenschaft AutoCreateColumnsFromModel besitzt. Ist diese auf true gesetzt, wird bei einem tableChange-Event das ColumnModel neu erstellt. Somit gehen dadurch darin alle Eigenschaften verloren.
Jetzt müsste man also nur diese Eigenschaft auf false setzen und eine eigene Methode implementieren, die das ColumnModel aktualisiert.Freue mich über eine Bewertung oder ein Danke.
Ähnliche Themen
-
[mySQL] Spaltennamen ohne Angabe des Typs ändern?
Von Frezl im Forum Relationale DatenbanksystemeAntworten: 6Letzter Beitrag: 03.05.10, 14:59 -
JTABLE aktualisieren (ohne Table Model)
Von dumka im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 4Letzter Beitrag: 16.08.08, 01:36 -
SPaltenNamen in JTable zu schreiben
Von kokoriko im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 1Letzter Beitrag: 08.10.07, 11:55 -
Knoten aus JTree als Spaltennamen für JTable
Von JaX1983 im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 0Letzter Beitrag: 23.05.07, 12:14 -
JTable - Spaltennamen wirklich umbenennen
Von Kerwin im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 3Letzter Beitrag: 09.12.06, 12:20





Zitieren
Login





