Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[SWING] Bug im DefaultTableColumnModel ?

0 views
Skip to first unread message

Sven Kiesewetter

unread,
Oct 17, 2001, 12:50:17 PM10/17/01
to
Hi,

ich hier ne JTable, deren Einträge ich aus diversen Gründen nicht mit
TableSorter aus dem SwingBsp. sortiere. Dabei ist mir folgendes aufgefallen:

Führt man in seinem TableModel (abgeleitet von DefaultTableModel)
(die ersten 4 Zeilen nur zu eurem Verständnis)

Vector colNames = new Vector(super.getColumnCount());
for (int i=0; i<super.getColumnCount(); i++){
colNames.addElement(super.getColumnName(i));
}
super.setDataVector(super.getDataVector(), colNames);


Tritt folgender Fehler auf:

Exception occurred during event dispatching:
java.lang.ArrayIndexOutOfBoundsException: -1 < 0
at java.util.Vector.elementAt(Vector.java:427)
at
javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:276)
at
javax.swing.plaf.basic.BasicTableHeaderUI.getHeaderRenderer(BasicTableHeaderUI.java:341)
at
javax.swing.plaf.basic.BasicTableHeaderUI.paintCell(BasicTableHeaderUI.java:352)
at
javax.swing.plaf.basic.BasicTableHeaderUI.paint(BasicTableHeaderUI.java:333)
at javax.swing.plaf.ComponentUI.update(ComponentUI.java:39)
at javax.swing.JComponent.paintComponent(JComponent.java:398)
at javax.swing.JComponent.paint(JComponent.java:739)
at javax.swing.JComponent.paintChildren(JComponent.java:523)
at javax.swing.JComponent.paint(JComponent.java:748)
at javax.swing.JViewport.paint(JViewport.java:668)
at javax.swing.JComponent.paintChildren(JComponent.java:523)
at javax.swing.JComponent.paint(JComponent.java:748)
at javax.swing.JComponent.paintWithBuffer(JComponent.java:4393)
at javax.swing.JComponent._paintImmediately(JComponent.java:4336)
at javax.swing.JComponent.paintImmediately(JComponent.java:4187)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:370)
at
javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:205)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:154)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:317)
at java.awt.EventDispatchThread.pumpOneEvent(EventDispatchThread.java:103)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:84)


Wie kann das nur sein ? ich hab doch nix an den Daten gemacht.

Gruß, Sven

Christian Kaufhold

unread,
Oct 17, 2001, 5:07:29 PM10/17/01
to
Hello!

Sven Kiesewetter <s.kies...@intershop.de> wrote:

> ich hier ne JTable, deren Einträge ich aus diversen Gründen nicht mit
> TableSorter aus dem SwingBsp. sortiere. Dabei ist mir folgendes aufgefallen:

Aha. Das mache ich eigentlich auch nie.


> Führt man in seinem TableModel (abgeleitet von DefaultTableModel)
> (die ersten 4 Zeilen nur zu eurem Verständnis)

> Vector colNames = new Vector(super.getColumnCount());
> for (int i=0; i<super.getColumnCount(); i++){
> colNames.addElement(super.getColumnName(i));
> }
> super.setDataVector(super.getDataVector(), colNames);

Dieser Code ändert *nichts* an den Daten, verschickt aber einen Event,
das sich "alles" geändert hat. JTable wirft dann - im "einfachen"
Modus (autoCreateColumnsFromModel true) die alten TableColumns weg und
erzeugt neue ...


> Tritt folgender Fehler auf:

> Exception occurred during event dispatching:
> java.lang.ArrayIndexOutOfBoundsException: -1 < 0
> at java.util.Vector.elementAt(Vector.java:427)

[...]

Du rufst den Code oben auf, während eine Spalte "gedraggt" wird (Dies
ist immer dann, wenn (die linke?/eine) Maustaste auf dem Header ge-
drückt ist, (selbst wenn man noch nicht mit dem Draggen angefangen hat
oder es auch nicht vorhat). Während der Zeit sollte man das Table-
ColumnModel nicht modifizieren (und die Model-Änderung von oben tut
das evtl.), da es - selbst für robustere MouseListener als der von
BasicTableHeaderUI - nicht einfach feststellbar ist, ob die Spalte, die
gerade gedraggt wird, entfernt wurde (und auch einfach, weil Basic-
TableHeaderUI es nicht macht - in meinem NewTableHeaderUI habe ich auch
erst einmal geschrieben "That's what you deserve if you do that").

Der Paint-Code findet dann die Dragged-Spalte nicht mehr und überprüft
das nicht -> übergibt -1 an getColumn.

Warte auf mouseReleased, dann SwingUtilities.invokeLater(), dann ist
der Header fertig mit dem Drag-Handling; oder vermeide das Verschicken
von TableStructureChanged, wenn es spezifischere Events gibt.


Christian

0 new messages