Swing GUI und weiter Thread gibt Problem

Grüß Dich,
also was du so sagst klingt erstmal ganz in Ordnung. Vielleicht ist es hilfreich mal das was Du so gebaut hast zu tracen um genauer herauszufinden was schief geht. Falls du keine möglichkeit dazu hast, weil du z.B. keine IDE verwendest so tun es oft auch einfach Ausgabe-Statements (System.out.printeln(...)) um zu verstehen was abgeht.
Mal ne Frage hast du auch die "period" beim schedule mitangegeben?

Takidoso
 
Hi,
also ich hab jetzt mal ein paar ausgaben gemacht.
Habe folgendes herrausgefunden:
- GUI wird gestartet
- in der GUI wird mein invokeLater() aufgerufen
- aufruf der Get-Methode (im Thread), die GUI versucht das dtm darzustellen, da aber das dtm noch leer ist, wird in der GUI nichts angezeigt
- Thread wird durch den Timer aufgerufen (intervall habe ich mit angegeben)
- daten werden in das dtm eingetragen
- GUI aktualisiert sich (Dispatch-Thread) und es wird der TableData-Thread aufgerufen
- nur wird die Get-Methode nicht aufgerufen, d.h. das dtm wird nicht aktualisiert

Woran könnte das liegen?
Gruß Robin

Übrigens, das ist mein Aufruf in der GUI:
Code:
SwingUtilities.invokeLater( new Runnable() { 	
    public void run() {
	System.out.println("invokeLater");
	timer.schedule( new TableData( m_server ),1000,1000 );
	slaveStatusTable.setModel( tableDataThread.getTableData() ); }
	} );
 
Zuletzt bearbeitet:
Niles hat gesagt.:
Hi,
also ich hab jetzt mal ein paar ausgaben gemacht.
Habe folgendes herrausgefunden:
- GUI wird gestartet
- in der GUI wird mein invokeLater() aufgerufen
- aufruf der Get-Methode (im Thread), die GUI versucht das dtm darzustellen, da aber das dtm noch leer ist, wird in der GUI nichts angezeigt
- Thread wird durch den Timer aufgerufen (intervall habe ich mit angegeben)
- daten werden in das dtm eingetragen
- GUI aktualisiert sich (Dispatch-Thread) und es wird der TableData-Thread aufgerufen
- nur wird die Get-Methode nicht aufgerufen, d.h. das dtm wird nicht aktualisiert

Woran könnte das liegen?
Gruß Robin

Übrigens, das ist mein Aufruf in der GUI:
Code:
SwingUtilities.invokeLater( new Runnable() { 	
    public void run() {
	System.out.println("invokeLater");
	timer.schedule( new TableData( m_server ),1000,1000 );
	slaveStatusTable.setModel( tableDataThread.getTableData() ); }
	} );

Grüß Dich,
also Dein Stückchen Code zeigt mir eine kleine Verwechselung bei Dir.
das invokeLater(...) sollte nicht den Timer aufrufen, sondern lediglich das vom TimerTask aus der DB zusammengesuchte dem TableModel übergen.
Denn Du willst ja lediglich einen Task im Hintergrund zücklich aufrufen, der nicht den Thread, der die Event-Queue verarbeitet, belasten!
Momentan scheint folgendes bei Dir zu passieren:
Ein Task wird in Deine Eventqueue gestellt, der einen Timer initialisiert, der einen TimerTask in einer sekunde auslösen wird und dann jede sekunde neu erneut auslöst.
gleich im Anschluß also noch bevor Der Timer aktiv wurde übergist Du ein vermutlich noch leeres Datenmodell an Deinen slaveStatusTable.

schau Dir nochmal das Schema an in den vorherigen Tipps von mir und versuche einfach dies nachzubauen ;-)

viel Glück

Takidoso
 
Hi takidoso,
hab mir ja dein Shema zu herzen genommen. Nur habe ich da einige Probleme dieses Umzusetzen. :confused:

Habe mal meinen Aufruf in der GUI geändert:
Code:
 timer.schedule( new TableData( m_server ) {
    public void run() {
	tableDataThread.run();
	slaveStatusTable.setModel( tableDataThread.getTableData() );}
    },1000,1000 );

so wie es aussieht Funktioniert es so bestens. Es kommen auch keine Array..-Exception mehr. ;-)

Besten Dank erstmal.
Schönen Gruß Niles

P.S.: hoffe so hattest du es gemeint, wenn nicht, sag es.
 
Ah, hab doch noch einen Bug gefunden, wenn ich in der GUI einen Spaltenkopf anklicke und gedrückt lasse (Drag&Drop) kommt eine Array..-Exception. Aber glücklicherweise hat die überhauptkeine Auswirkungen. :p
Kann man das Drag&Drop der Spalten unterbinden?

Gruß Niles
 
Niles hat gesagt.:
Hi takidoso,
hab mir ja dein Shema zu herzen genommen. Nur habe ich da einige Probleme dieses Umzusetzen. :confused:

Habe mal meinen Aufruf in der GUI geändert:
Code:
 timer.schedule( new TableData( m_server ) {
    public void run() {
	tableDataThread.run();
	slaveStatusTable.setModel( tableDataThread.getTableData() );}
    },1000,1000 );

so wie es aussieht Funktioniert es so bestens. Es kommen auch keine Array..-Exception mehr. ;-)

Besten Dank erstmal.
Schönen Gruß Niles

P.S.: hoffe so hattest du es gemeint, wenn nicht, sag es.

ist ja schön, dass es funktioniert, ich hätte es ein wenig anders gemacht. Du scheinst nämich die run() routine von Deinem TableData zu überschreiben, so dass Du nach meinem Verständnis genausogut hättest auch TimerTask anstelle von TableData hinschreiben könntest. Den Aufruf scheinst du über eine Instanz von TableData zu machen (sofern tableDataThread ein TableData ist)

zum Thema Drag & Drop meinst Du vermutlich das verschieben von Spalten in JTable, oder? Es kann sein, dass der Grund ist, dass das Datenmodel zum Zeitpunkt des verschiebens gerade geändert wird. versuche doch mal das Schema anzuwenden, in dem du schlichtweg slaveStatusTable.setModel( tableDataThread.getTableData() ) in ein runnable packst, welches von SwingUtillities.invokeLater(..) aufgerufen wird. vielleicht hilfts (s.Schema)

Takidoso
 
versuche doch mal das Schema anzuwenden, in dem du schlichtweg slaveStatusTable.setModel( tableDataThread.getTableData() ) in ein runnable packst, welches von SwingUtillities.invokeLater(..) aufgerufen wird. vielleicht hilfts (s.Schema)

Hab ich mal gemacht, nur kommt da ebenfalls beim verschieben der Spalten die Exception.

Gruß Niles
 
dann schau doch mal genau von was sie ausgelöst wird, indem du den Aufrufpfad nachgehst, der in dem Exception-Dump migegeben wird.
Du könntest auch versuchsweise mal den Timer mit der 'period' 0 aufrufen, so dasser er erstmal nur einmal aufgerufen wird und nicht zyklisch und ausprobieren ob Du dann auch noch Deine Exception bekommst. Dann wüsstest Du bescheid ob es daran hängt oder nicht.

Takidoso
 
Also wenn ich 'period' auf 0 setze wird das dtm nur einmal ausgelesen und ich kann die Tabellen verschieben, ohne dass eine Exception geworfen wird.
Es liegt wahrscheinlich daran, dass wenn ich den Spaltenkopf anfasse und verschieben will die GUI versucht das dtm zu aktualisieren, es aber nicht richtig kann, da ich den spaltenkopf noch gedrückt halte.
Deshalb wollte ich das Drag'en unterbinden.

Gruß Robin
 
Hier mal die Exception:
java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.Vector.elementAt(Vector.java:434)
at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColum
nModel.java:277)
at javax.swing.JTable.getCellRenderer(JTable.java:3697)
at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:1148)

at javax.swing.plaf.basic.BasicTableUI.paintDraggedArea(BasicTableUI.jav
a:1124)
at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:1079
)
at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:974)
at javax.swing.plaf.ComponentUI.update(ComponentUI.java:142)
at javax.swing.JComponent.paintComponent(JComponent.java:541)
at javax.swing.JComponent.paint(JComponent.java:808)
at javax.swing.JComponent.paintWithOffscreenBuffer(JComponent.java:4787)

at javax.swing.JComponent.paintDoubleBuffered(JComponent.java:4740)
at javax.swing.JComponent._paintImmediately(JComponent.java:4685)
at javax.swing.JComponent.paintImmediately(JComponent.java:4488)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:410)

at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(System
EventQueueUtilities.java:117)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:178)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:454)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchTh
read.java:201)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)
 
Zurück