Performante Konsolenausgabe in Fenster (farbig)

Status
Nicht offen für weitere Antworten.

0xdeadbeef

Top Contributor
Irgendwie komme ich immer wieder auf Programme zurück, die (sehr schnell sehr viele) Statusmeldungen in eine Konsole ausgeben. Während das mit JTextArea per "append" einigermaßen performant geht und mit JTextPane farbig, fehlt mir irgendwie nach wie vor eine Möglichkeit, beides (schnell und farbig) zu verbinden. Seitdem ich mich das letzte Mal damit beschäftigt habe, sind ein paar Jahre ins Land gegangen und irgendwie war ich der Meinung, das Problem sollte sich inzwischen irgendwie gelöst haben, aber leider ist dem nicht so. JTextPane ist auch im Jahr 2009 mit Java6 noch ein absolutes Trauerspiel in Sachen Performance.

Egal, was ich mache: sobald ich sehr viele (ein paar tausend) Teilen Text in relativ kurzer Zeit in eine JTextPane einfüge, bricht entweder die JTextPane oder gar die gesamte AWT/Swing-Queue zusammen. Auch dann, wenn ich "invokeLater" bemühe. Bestensfalls kommt AWT/Swing nach ein paar Minuten wieder auf die Beine, aber für einen Vorgang, der nur ein paar Sekunden dauert, minutenlanges Warten in Kauf zu nehmen, ist irgendwie inakzeptabel.

Nach wie vor beschleicht mich der Verdacht, daß das DefaultStyledDocument mit Wasserstoffbomben auf Spatzen geschmissen ist und zudem miserabel lahmarschig implementiert wurde. So oder so ist das Datenmodell mit Sicherheit viel zu komplex, um ein bißchen farbigen Text auszugeben und alleine das (notwendige) Positionieren des Cursors an das Ende des Dokuments scheint extrem viel Zeit zu kosten.

Ich kann irgendwie nicht glauben, daß - wenn schon Sun diesen klassischen Anwendungsfall komplett ignoriert - es in den Weiten des Netzes keine kleine, schlanke, leicht integrierbare Swing-Konsolenklasse gibt, die genau das Gewünschte macht. Leider finde ich nichts.

Ideen?
 

Ebenius

Top Contributor
Ich kann irgendwie Dein Problem nicht nachvollziehen. Nach achttausend Zeilen hab ich dann jetzt mal abgebrochen. Kein Fehler bis dahin. Funktioniert super mit fast null Aufwand: [HIGHLIGHT="Java"]public static void main(String[] args) {
final StyledDocument doc = new DefaultStyledDocument();
final Style styleRoot = doc.addStyle("root", null);
StyleConstants.setFontSize(styleRoot, 16);
final Style styleBold = doc.addStyle("bold", styleRoot);
StyleConstants.setBold(styleBold, true);
final Style styleItalic = doc.addStyle("italic", styleRoot);
StyleConstants.setItalic(styleItalic, true);
final Style styleRed = doc.addStyle("red", styleRoot);
StyleConstants.setBackground(styleRed, Color.RED.darker());
StyleConstants.setForeground(styleRed, Color.WHITE);
StyleConstants.setBold(styleRed, true);

final javax.swing.Timer timer =
new javax.swing.Timer(30, new ActionListener() {

long lineIndex = 0;
int styleIndex = 0;
final Style[] styles = { styleRed, styleBold, styleItalic };

@Override
public void actionPerformed(ActionEvent e) {
try {
doc.insertString(doc.getLength(), (++lineIndex)
+ ": I am a log message. I am truly evil!\n",
styles[styleIndex++]);
styleIndex %= styles.length;
} catch (BadLocationException ex) {
ex.printStackTrace();
((javax.swing.Timer) e.getSource()).stop();
}
}
});

final JTextPane textPane = new JTextPane(doc);
textPane.setPreferredSize(new Dimension(500, 300));

final JFrame f = new JFrame("Styled Document Fun");
f.setContentPane(new JScrollPane(textPane));
f.pack();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.setVisible(true);
timer.start();
}[/HIGHLIGHT]
Natürlich müsste man für ein echtes Log-Fenster oben auch wieder rausschmeißen. Aber warum sollte Sun derart spezifische Anwendungsfälle in speziell unterstützen?

Ebenius
 

0xdeadbeef

Top Contributor
Ich kann irgendwie Dein Problem nicht nachvollziehen.
Na ja, jetzt mal davon abgesehen, daß Du die Konsole nicht scrollst, läuft da halt auch keine ernsthafte Anwendung nebenher. Wie gesagt: alleine das Scrollen der Konsole scheint extrem Performance zu kosten.

Außerdem schreibst Du gerade mal alle 30ms einen Text rein. Das macht für deine 8000 Zeilen satte 160 Sekunden. Ich rede aber von z.B. 1000 Zeilen in 1 Sekunde - das sind dann gerade mal 1ms pro Zeile. Weil die TextPane da nicht annähernd mitkommt, scheint sich ein Messagestau aufzubauen, der auch zum kompletten Kollaps führen kann. Daß die Konsole nicht ganz in Echtzeit schreibt, wäre mir egal, aber ein Kollaps der gesamten AWT-Queue ist unzumutbar.

Hilft mir jetzt jedenfalls irgendwie nicht und der Umstieg auf SWT usw. kommt auch nicht in Frage. Ich suche einfach nach einem performanten farbigen Ersatz für JTextArea/JTextPane - nach Möglichkeit mit Support für automatisches Scrollen.
 

Wildcard

Top Contributor
Wie viel Daten liegen denn gleichzeitig in deinem Buffer? Scrollen und appenden wird ab x MiB definitiv zum Problem, da würde auch ein anderes Widget wenig ändern. Lass die Einträge nach oben raus rotieren wie schon von Ebenius geschrieben.
 

Ebenius

Top Contributor
Ich komme noch immer nicht wirklich in Performance-Engpässe. Scrollen hab ich mir allerdings aufgrund der Uhrzeit geklemmt. :)

[HIGHLIGHT="Java"]public static void main32(String[] args) {
final DefaultStyledDocument doc = new DefaultStyledDocument();
final Style styleRoot = doc.addStyle("root", null);
StyleConstants.setFontSize(styleRoot, 16);
final Style styleBold = doc.addStyle("bold", styleRoot);
StyleConstants.setBold(styleBold, true);
final Style styleItalic = doc.addStyle("italic", styleRoot);
StyleConstants.setItalic(styleItalic, true);
final Style styleRed = doc.addStyle("red", styleRoot);
StyleConstants.setBackground(styleRed, Color.RED.darker());
StyleConstants.setForeground(styleRed, Color.WHITE);
StyleConstants.setBold(styleRed, true);

final JTextPane textPane = new JTextPane(doc);
textPane.setPreferredSize(new Dimension(500, 300));

final Thread pump = new Thread(new Runnable() {

long lineIndex = 0;
int styleIndex = 0;
final Style[] styles = { styleRed, styleBold, styleItalic };

@Override
public void run() {
try {
Thread.sleep(100);
while (true) {
final int numMessages = (int) (Math.random() * 1800);
for (int i = 0; i < numMessages; i++) {
doc.insertString(doc.getLength(), (++lineIndex)
+ ": "
+ "I am an evil Log message!"
+ '\n', styles[styleIndex++]);
styleIndex %= styles.length;
if (lineIndex % 4000 == 0) {
doc.remove(0, doc.getLength());
}
}
Thread.sleep(100);
}
} catch (InterruptedException ex) {
ex.printStackTrace();
} catch (BadLocationException ex) {
ex.printStackTrace();
}
}
});
pump.start();

final JFrame f = new JFrame("Styled Document Fun");
f.setContentPane(new JScrollPane(textPane));
f.pack();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.setVisible(true);
}[/HIGHLIGHT]

Ebenius
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M 2D-Grafik Performante Scatterplots mit J2d oder jOGL AWT, Swing, JavaFX & SWT 3
K Swing Konsolen Programm in GUI - Suche Hilfe bei Konsolenausgabe AWT, Swing, JavaFX & SWT 2
C Konsolenausgabe in TextArea ausgeben AWT, Swing, JavaFX & SWT 8
M suche geeignetes Fenster zur Anzeige AWT, Swing, JavaFX & SWT 49
berserkerdq2 Kann ich ein Rechteck mittig im Fenster halten, egal wie ich die Bildschirmgröße verändere? AWT, Swing, JavaFX & SWT 3
W 2 JTables in einem Swing-Fenster? AWT, Swing, JavaFX & SWT 5
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
TheSepp Fenster um x Pixel bewegen, wenn man auf dem Knopf drückt AWT, Swing, JavaFX & SWT 10
J JavaFx PDF in einem Element in einem Fenster anzeigen. AWT, Swing, JavaFX & SWT 11
K JavaFX unterschiedliche (mehrere Fenster) in seperater Main Methode AWT, Swing, JavaFX & SWT 26
_user_q Kann man ein 2. JavaFX-Fenster auch beenden (exit) statt schließen (close) lassen? AWT, Swing, JavaFX & SWT 8
L Swing Files abspeichern mit Save as Dialog Fenster AWT, Swing, JavaFX & SWT 5
OZAN86 einfaches Fenster öffnen scheitert AWT, Swing, JavaFX & SWT 18
G Zuletzt aktives Fenster, vor dem aktuell aktiven AWT, Swing, JavaFX & SWT 2
sserio Kann man bei JavaFx ein Fenster aufkommen lassen? AWT, Swing, JavaFX & SWT 1
Z GUI Forms - Mehrere Fenster in einem Projekt AWT, Swing, JavaFX & SWT 18
S Swing Alles beenden bei Fenster mit Scroll-Balken AWT, Swing, JavaFX & SWT 6
CptK windowClosed() nur aufrufen, wenn Fenster nicht über Button geschlossen wird AWT, Swing, JavaFX & SWT 1
W Zweites/neues Fenster durch Button öffnen AWT, Swing, JavaFX & SWT 6
CptK Fokus auf geöffnetes Zweit-Fenster setzen und Eingaben außerhalb blocken AWT, Swing, JavaFX & SWT 2
B Text mit Absatz + OK-Button, der Fenster wieder schließt AWT, Swing, JavaFX & SWT 7
MiMa JavaFX Fenster in JavaFX öffnen Schliessen (Initialisierung) AWT, Swing, JavaFX & SWT 20
N Kontextmenü (Popup-Fenster) erstellen AWT, Swing, JavaFX & SWT 3
L Hintergrundbild im Fenster darstellen AWT, Swing, JavaFX & SWT 9
P JavaFX Fenster wird nicht angezeigt (Mac) AWT, Swing, JavaFX & SWT 13
VPChief Buttons Reagieren erst wenn ich Fenster minimiere AWT, Swing, JavaFX & SWT 4
B JavaFX TextField Eingabe in neues Fenster übernehmen AWT, Swing, JavaFX & SWT 4
N Drag and Drop Fenster AWT, Swing, JavaFX & SWT 11
A Swing JTextField an Button übergeben für Popup-Fenster funktioniert nicht AWT, Swing, JavaFX & SWT 3
P JavaFX Zugriff auf Fenster/Layout-Container in eigenen Klassen AWT, Swing, JavaFX & SWT 5
Bluedaishi JavaFX Programm start mit zwei scenen bzw Fenster AWT, Swing, JavaFX & SWT 1
J Fenster mit Inhalten aus einem Array Füllen AWT, Swing, JavaFX & SWT 4
S Swing Fenster State Machine AWT, Swing, JavaFX & SWT 1
A Fenster genau unterhalb von JTextField anzeigen AWT, Swing, JavaFX & SWT 1
J Overlay Panel statt neues Fenster AWT, Swing, JavaFX & SWT 6
S Swing Bei start des Programmes kein Fenster zu sehen AWT, Swing, JavaFX & SWT 1
X Neues Fenster mit Button öffnen und bearbeiten AWT, Swing, JavaFX & SWT 4
platofan23 JAVAFX zweites Fenster öffnen AWT, Swing, JavaFX & SWT 2
M JavaFX Altes Fenster (FXML Datei) löschen AWT, Swing, JavaFX & SWT 16
P JavaFX Fenster lädt nicht mehr AWT, Swing, JavaFX & SWT 4
I AWT Listener während man in anderem Fenster ist AWT, Swing, JavaFX & SWT 4
S JavaFX Fenster aufkommen lassen, wenn mit der Maus über bestimmten Bereich fahren AWT, Swing, JavaFX & SWT 1
L Java- UI zweites Fenster aus einer anderen Klasse öffnen durch ButtonClick AWT, Swing, JavaFX & SWT 4
D Swing Neues (3.) Fenster öffnen AWT, Swing, JavaFX & SWT 2
G JavaFX Fenster 1 Array übertragen zur Fenster 2 AWT, Swing, JavaFX & SWT 0
I JavaFX Fenster wird auf einem anderen Rechner anders dargestellt AWT, Swing, JavaFX & SWT 5
K Fenster welches den Sieger anzeigt AWT, Swing, JavaFX & SWT 5
O JavaFX Fenster scließen AWT, Swing, JavaFX & SWT 4
A Swing Fenster ändert Position bei Mausklick nicht AWT, Swing, JavaFX & SWT 2
S SWT neues Fenster, buttons aus alten etc... AWT, Swing, JavaFX & SWT 0
D Java FXML mehrere Fenster AWT, Swing, JavaFX & SWT 4
L Input aus Sub-Fenster Startfenster übergeben AWT, Swing, JavaFX & SWT 5
B AWT Fenster schließt nicht AWT, Swing, JavaFX & SWT 2
H JavaFX Kriege fehler beim Fenster wechseln AWT, Swing, JavaFX & SWT 7
G Swing Wenn ich mein JFrame Fenster vergrößere die Inhalte anpassen AWT, Swing, JavaFX & SWT 1
U Swing Inhalt vom Fenster wird erst durch Hovern oder Klicken sichtbar AWT, Swing, JavaFX & SWT 3
A Nach klick auf Button neuen Inhalt im gleichen Fenster AWT, Swing, JavaFX & SWT 3
T Fenster schließen AWT, Swing, JavaFX & SWT 4
K JavaFX ObservableList + Fenster AWT, Swing, JavaFX & SWT 6
windl Transparentes / halbtransparentes Fenster AWT, Swing, JavaFX & SWT 1
K Fenster mittig im Vollbildschirm - ok, aber ... AWT, Swing, JavaFX & SWT 2
N Swing Sorry nicht mal ein Fenster öffnen... AWT, Swing, JavaFX & SWT 19
S actionlistener mit 2 fenster integrieren AWT, Swing, JavaFX & SWT 11
G Event Handling TableView daten in ein neues Fenster herauslesen? AWT, Swing, JavaFX & SWT 3
C Benutzername in GUI eingeben und nach Spiel neues Fenster Benutzername wieder anzeigen AWT, Swing, JavaFX & SWT 1
C Durch klicken von Button neues Fenster oeffnen AWT, Swing, JavaFX & SWT 18
D JavaFX (WebStart) Graues Fenster beim Start AWT, Swing, JavaFX & SWT 4
J Button vergrößert sich bei Fenster resize AWT, Swing, JavaFX & SWT 22
L Zweites Fenster mit Thread AWT, Swing, JavaFX & SWT 0
Paul15 Zwei Fenster AWT, Swing, JavaFX & SWT 23
T LayoutManager Methode, um Bildschirm(fenster) für Aktualisierungen zu blockieren bzw. freizugeben gesucht AWT, Swing, JavaFX & SWT 2
C AWT Problem mit Protokol Fenster AWT, Swing, JavaFX & SWT 0
L Daten in neuem Fenster AWT, Swing, JavaFX & SWT 2
D Mit Klick auf Button ein neues Fenster erzeugen AWT, Swing, JavaFX & SWT 11
I JTable: Doppelklick auf Table soll neues Fenster öffnen und Daten aus JTable anzeigen AWT, Swing, JavaFX & SWT 4
A Swing Textübergabe innerhalb der Anwendung in unterschiedlichen Fenster AWT, Swing, JavaFX & SWT 8
wolfgang63 JavaFX Animation, Kreise im vorgegebem Takt durchs Fenster laufen lassen AWT, Swing, JavaFX & SWT 3
K Java Button öffnet neues Fenster AWT, Swing, JavaFX & SWT 5
Z Fenster leer, wenn ich ein JTextField erzeuge AWT, Swing, JavaFX & SWT 3
W Swing JScrollPane für mein Fenster AWT, Swing, JavaFX & SWT 4
X Swing 2 Fenster (1 im Vordergrund) AWT, Swing, JavaFX & SWT 6
X Swing Ein neues Fenster öffen aber ohne ein extra Prozess zu starten AWT, Swing, JavaFX & SWT 1
T JavaFX ControlsFX-Notification öffnet nicht wenn kein JavaFX-Fenster offen. AWT, Swing, JavaFX & SWT 1
E JavaFX JavaFX Fenster nicht schließen AWT, Swing, JavaFX & SWT 4
K JavaFX Fenster aufrufen über Menü AWT, Swing, JavaFX & SWT 1
thet1983 offne Fenster gemeinsam schließen AWT, Swing, JavaFX & SWT 8
H AWT Fenster- und JLabel-Größe automatisch anpassen AWT, Swing, JavaFX & SWT 2
Z JSlider im Modalen-Fenster AWT, Swing, JavaFX & SWT 0
Tort-E JavaFX Fenster nachladen AWT, Swing, JavaFX & SWT 1
V Fenster in einem Fenster anordnen AWT, Swing, JavaFX & SWT 7
I Zwei Fenster nebeneinander anzeigen AWT, Swing, JavaFX & SWT 2
U Fenster beim Vergörßern immer quadratsich AWT, Swing, JavaFX & SWT 7
Q Swing Fenster updaten - Hinzugefügte Komponenten darstellen AWT, Swing, JavaFX & SWT 3
E Alles in einem Fenster AWT, Swing, JavaFX & SWT 5
A Fenster erstellen AWT, Swing, JavaFX & SWT 2
I Swing Beim Fenster das kleine Symbol(ICS) ändern AWT, Swing, JavaFX & SWT 3
K JavaFX Vorschau Bereich/Fenster einer bestehenden Group AWT, Swing, JavaFX & SWT 3
G Scrollbar für das Fenster einfügen AWT, Swing, JavaFX & SWT 3
X Fenster von außen ansprechen AWT, Swing, JavaFX & SWT 7
brunothg Swing JTable -> AUTO_RESIZE_OFF aber das Fenster ausfüllen AWT, Swing, JavaFX & SWT 0

Ähnliche Java Themen


Oben