HELP: JFieldText dynamisch setzen -> langsam

  • Themenstarter Themenstarter ATAMAN
  • Beginndatum Beginndatum
A

ATAMAN

Gast
Hallo Leute,

ich habe folgendes Problem: Ich habe eine GUI geschrieben, die einen externen Prozess überwacht. Die Oberfläche besteht aus mehreren Tabs. Auf einem Tab werden in mehreren JTextFields die aktuellen Daten des Prozesses angezeigt (also dynamisch gesetzt mit setText()). Wenn man die anderen Tabs auswählt läuft die GUI schnell, sobald man aber den mit den Textfeldern auswählt wird die GUI sichtbar langsam. Die Daten werden nicht alle auf ein Mal gesetzt, sondern erst wenn ein Datensatz empfangen wurde, werden die entsprechenden Textfelder gesetzt. Ich habe die Methode die Daten verarbeitet und setzt in einem SwingWorker laufen lassen, das hat aber nichts gebracht.

Hat jemand eine Idee, woran das liegen kann? Gibt es andere Möglichkeiten die Daten zu setzen, ohne das die GUI langsamer wird?

Vielen Dank im Voraus!
 
Die Daten werden nicht alle auf ein Mal gesetzt, sondern erst wenn ein Datensatz empfangen wurde, werden die entsprechenden Textfelder gesetzt.

Vielleicht liegt es einfach daran, dass die Daten verzögert empfangen werden. Dann werden sie natürlich auch verzögert in die Textfelder gesetzt.
 
Naja, die Daten werden permanent empfangen und gesetzt auch dann, wenn der Tab nicht ausgewählt wurde. Die GUI wird aber nur langsam, wenn eben nur dieser ausgewählt ist. In den Textfeldern werden nur die Werte angezeigt, unten in einem Feld, das immer sichtbar ist, werden noch zusätzliche Informationen angezeigt. Und da kann man es gut sehen, dass diese dann langsamer kommen, wenn man den Tab auswählt. Die Tastatureingaben oder Mausklicks werden auch verzögert empfangen.
 
Zeig doch mal den Code mit dem Setzen. Eigentlich dürfte das alleine noch nicht zu der Verzögerung führen.
 
Also, Zeile, die ich auskommentiert habe und wo die GUI dann auch schnell lief ist halt die Standard-Set-Methode:

Java:
((JTextField)child).setText(val);

child - das entsprechende Textfeld
val - der Wert als String

Es sind insgesamt 53 Textfelder. Kann es an der Menge liegen?
 
Es sind insgesamt 53 Textfelder. Kann es an der Menge liegen?

Schon möglich. Aber ist bestimmt eher ein Problem mit EDT und Datenübertragungsmethode, was sich evtl. gegenseitig blockiert. Du hattest ja schon geschrieben, dass du einen SwingWorker eingesetzt hattest und es trotzdem noch so langsam lief. Vielleicht ist da irgendwas bei der Aktualisierung der GUI nicht richtig. Ich denke schon, dass du das mit einem eigenen Thread machen solltest, also eben mit dem SwingWorker.
 
Anscheinend wird das JTextField zu schnell und zu oft mit Daten beliefert (das Neuzeichnen des Textes dauert halt etwas).

Eine schnelle Abhilfe ist manchmal, erst nachzuschauen ob sich der Text überhaupt geändert hat und nur dann neu setzen:

Code:
  jtmp = ((JTextField)child);
  if ( ! jtmp.getText().equals(val)) jtmp.setText(val);

Nächste Variante wäre, einen kleinen Zähler mitlaufen zu lassen und nur jedes 10te/25te etc.. Update abzugreifen.

Bernd
 
Anscheinend wird das JTextField zu schnell und zu oft mit Daten beliefert (das Neuzeichnen des Textes dauert halt etwas).
Bernd

Das war eigentlich auch meine Vermutung, war mir aber nicht sicher. Den SwingWorker habe ich auch nicht mehr rausgenommen. Die Daten werden zwei Mal pro Sekunde gesendet und eigentlich wollte ich sie noch öfter senden lassen. Gibt es vielleicht eine Möglichkeit dieses Neuzeichnen zu beschleunigen? Vielleicht mit anderen Swing-Komponenten? Neugezeichnen wird es ja nur wenn der Tab auch aktiviert wurde oder?
 
Das awt-Textfield ist nativ vom OS (oder war es jedenfalls mal), ebenso java.awt.Label.

Ja, super! Mit dem awt-Textfield geht es wirklich schneller. Ich hätte nicht gedacht, dass es so einen großen Unterschied machen würde. Gibt es eine Möglichkeit den Text im awt-Textfield mittig zu platzieren?

Ich sage schon mal allen VIELEN DANK!

Falls aber jemand noch Ideen oder Lösungsvorschläge hat, so würde mich das weiterhin interessieren, ob man das Problem auch mit JTextField lösen kann. Danke.
 

Neue Themen


Zurück
Oben