Komponente zur Anzeige einer Textdatei.

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,

weiß jemand von Euch, wie man JTextPane etwas schneller machen kann?
Die Anzeige bzw. der Textrenderer bremst die Anzeige ab. Das Laden einer
Textdatei (ca. 800KB) dauert bei mir ca. 300ms. Die Anzeige in JTextPane
über 10 Sekunden!

Es ist wahrscheinlich der Renderer, der zuerst alle Zeilen durchgeht um die
korrekten Zeilenumbrüche hinzukriegen.

Kann man es irgendwie beschleunigen? Es muss eine Textkomponente sein,
da der Anwender die Möglichkeite haben soll, den Text oder Teile davon
zu kopieren.

Help! :bahnhof:
 

Sky

Top Contributor
Hi,

hab' mal'n kleines Applet geschrieben, welches genau das tut, was Du beschrieben hast; bei mir dauert einlesen der Datei und anzeigen weniger als 2 Sekunden. Hier mein Code:

Code:
import javax.swing.*;
import java.io.*;

public class ReadAndShowExample extends JApplet {
  private JTextPane m_tpFileContent = new JTextPane();
  private JScrollPane m_spFileContent = new JScrollPane();

  public ReadAndShowExample() {
    initGui();
    String s = readFile();
    m_tpFileContent.setText(s);
  }

  private String readFile() {
    BufferedReader obufReader = null;
    StringBuffer sFileContent = new StringBuffer();
    try {
      FileReader oFileReader = new FileReader("c:\\test.txt");
      obufReader = new BufferedReader(oFileReader);
      String sRow;

      while ( (sRow = obufReader.readLine()) != null) {
        sFileContent.append(sRow);
        sFileContent.append("\n");
      }
      obufReader.close();
    }
    catch (IOException ioe) {
      ioe.printStackTrace();
    }
    return sFileContent.toString();
  }

  private void initGui() {
    this.getContentPane().setLayout(null);
    m_spFileContent.setBounds(20, 9, 608, 451);
    this.getContentPane().add(m_spFileContent, null);
    m_spFileContent.getViewport().add(m_tpFileContent, null);
  }
}

EDIT: Verwendest Du nen Speziellen Renderer?? Zeig dann doch mal bitte deinen Code.

EDIT_2: Mein File war 917.711 Bytes gross.
 
G

Guest

Gast
Hallo,

danke für Deine Antwort.
Ich lese es fast gleich wie Du, zuerst in StringBuffer, dann setze ich den Text
mit textPane.setText(text). Ziemlich trivial das ganze, nichts spezielles dabei.
Das Lesen aus der Datei ist schnell genug (<400ms), nur die anschliessende Anzeige
dauer ewig. Das Textfeld ist bei mir ebenfalls in JScrollPane.
Es ist kein spezieller Renderer bzw. Dokument(Model) gesetzt.
Die Datei, die ich lese, hat (mal so zum Test) ca. 800KB und über 14000 Zeilen.
Es ist für Logdateien gedacht. Um die Sache nicht unnötig kompliziert zu machen,
zeige ich die Log-Datei als Readonly-JTextPane an, statt extra einen Viewer dafür
zu schreiben. Zumindest hatte ich es vor... :roll:

Ich denke, dass das Dokument(Model) des Textfeldes so viel Zeit braucht, um das
"WordWrap" durchzuführen (Aufbau von GapContent). Für jede "richtige" Zeile testet
es die Gesamtlänge, um die "virtuellen" Zeilenumbrüche korrekt zu setzen.

Die Frage ist, wie kann man dies verhindern? :bahnhof:

Ich habe schon versucht eine Schriftart mit fester Zeichenbreite (Courier) zu setzen,
hilft aber nix.
 

Sky

Top Contributor
Poste doch mal deinen Code! Würde mir das gerne mal angucken, wie Du liest und die Daten dann anzeigst...
 
G

Guest

Gast
Wie ich schon schrieb, es ist nur der Aufruf von setText(...), der so viel Zeit
in Anspruch nimmt.

Folgendes Beispiel zeigt das Problem. Öffne es mit einer Datei, die ca. 10000 Zeilen hat,
dann siehst Du, was passiert. Hier zum Test habe ich einen Button eingebaut, der das Laden
startet.
Wenn Du nicht gerade einen Cray im Keller stehen hast, dann sollte es bei Dir auch
paar Sekunden dauern. ;)
Code:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;

public class LogFileView extends JPanel { 
  BorderLayout borderLayout = new BorderLayout();
  JScrollPane scrollPane = new JScrollPane();
  JTextPane textPane = new JTextPane();
  JButton ladenButton = new JButton();

  public LogFileView() {
    initUI();
  }

  private void initUI() {
    setLayout(borderLayout);
    setBorder(BorderFactory.createTitledBorder("Log-Datei"));
    textPane.setEditable(false);
    textPane.setFont(new Font("Courier New", 0, 12));
    ladenButton.setText("Logdatei laden");
    ladenButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
          ladeLogDatei(e);
        }
      });
    scrollPane.getViewport().add(textPane, null);
    add(scrollPane, BorderLayout.CENTER);
    add(ladenButton, BorderLayout.SOUTH);
  }

  void ladeLogDatei(ActionEvent e) {
    long time = System.currentTimeMillis();
    String text = readFile("..\\var\\log\\client.log");
    System.out.println("file:"+(System.currentTimeMillis()-time));

// HIER WIRD'S LANGSAM
    time = System.currentTimeMillis();
    textPane.setText(text);
    System.out.println("ui:"+(System.currentTimeMillis()-time));
    textPane.setCaretPosition(0);
  }

  private String readFile(String filename) {
    InputStream is = null;
    try {
      is = new BufferedInputStream(new FileInputStream(filename), 4096);
      ByteArrayOutputStream bos = new ByteArrayOutputStream(4096);
      OutputStream os = new BufferedOutputStream(bos, 4096);
      int bytesRead = 0;
      byte buffer[] = new byte[4096];
      while((bytesRead = is.read(buffer))>0)
        os.write(buffer, 0, bytesRead);
      os.flush();
      os.close();
      return bos.toString();
    }
    catch (IOException e) {
      e.printStackTrace();
      return null;
    } 
    finally {
      if(is != null) { try { is.close(); } catch(Exception e) {} }
    }
  }


  public static void main(String argv[]) {
    JFrame frame = new JFrame("Test");
    frame.addWindowListener(
      new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
          System.exit(0);
        }
      }
    );
    frame.setSize(800, 600);
    frame.setLocationRelativeTo(null);
    frame.getContentPane().add(new LogFileView());
    frame.setVisible(true);
  }

}
Ideen?
 

Sky

Top Contributor
Handelt es sich denn bei Dir um ASCII-Dateien? Falls ja, dann versuch mal meine 'read'-Methode. Bei mir war sie schneller...

Ich denke, bei deiner Art zu Lesen für den Zeilenumbruch "\r\n" drin steht und bei mir nur ein "\n". Bin mir da aber nicht 100%ig sicher und ich hatte auch nicht die Zeit, dass Problem von Grund auf zu analysieren.

Also, wie gesagt, versuchs mal mit meiner Lese-Methode und meld Dich nochmal zurück.
 
G

Guest

Gast
Ich habe doch schon geschrieben, dass das Lesen aus der Datei keine Rolle spielt,
da es sehr schnell ist. Es geht nur um das Setzen des Textes. :bahnhof:
 

Sky

Top Contributor
Ja, das habe ich auch verstanden. Nur, wenn Du auf 'meine' Art einliest, so ist das Ergebnis anders als bei deinem!

Mach doch mal folgendes:
Code:
String string1 = myRead();
String string2 = yourRead();
System.out.println( "string1 entspricht string2?" + string1.equals(string2);

Dann wirst Du sehen, dass die beiden Strings verschieden sind (haben auch eine verschiedene Länge). Das kommt daher, dass bei 'deiner' Methode eine Zeilenumbruch als "\r\n" und beim mir als "\n" angezeigt wird.
Ich denke, dass der Renderer mit nur "\n" anscheinend besser zurecht kommt. Versuchs einfach mal...
 
G

Guest

Gast
Ich habe die Datei jeweils paar mal mit beiden Methoden hintereinander
in das Textfeld gesetzt. Der Unterschied war minimal. Schwierig zu sagen
was schneller ist. Beides ist ziemlich langsam.
Das Thema ist mir nicht sooo wichtig, das ich viel Zeit dafür verschwende,
ich war aber unangenehm überrascht, dass es so langsam ist.
Ich werde mal bei Gelegenheit eine asynchrone Variante versuchen, kein
Mensch kann 14000 Zeilen auf einemal lesen :wink:

- ca. 50 Zeilen einlesen und setzen, dann im getrennten Thread den Rest
einlesen und mit Document.insertString(doc.getLength(), TEXT, null);
anhängen.

Nochmals danke, dass Du Dir paar Gedanken darüber gemacht hast. :toll:
 
G

Guest

Gast
Ehmm, stimm, danke. Für diese simple Textanzeige auf jeden Fall.
Ich könte mir in den A.. treten. Warum komme ich selbst nicht drauf. :oops:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Maxim6394 JavaFX Scene Builder - Crash bei eigener Komponente AWT, Swing, JavaFX & SWT 2
H JDialog in Größe ändern - Resize-Cursor bleibt betreten der Komponente AWT, Swing, JavaFX & SWT 1
temi JavaFX "Frames" in JavaFx - passende Komponente? AWT, Swing, JavaFX & SWT 13
J Swing Komponente wird unpassend angepasst in der Größe AWT, Swing, JavaFX & SWT 35
M4cM4rco0707 JavaFX Custom-Komponente mit Custom-Controller AWT, Swing, JavaFX & SWT 3
J Komponente wird manchmal falsch gezeichnet AWT, Swing, JavaFX & SWT 0
R Swing Komponente im JFrame überschreinen sich AWT, Swing, JavaFX & SWT 7
Q-bert Dynamische Komponente erzeugen AWT, Swing, JavaFX & SWT 6
G vorgefertigte Buttons oder neue Komponente mit MouseListener? AWT, Swing, JavaFX & SWT 0
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
Tom299 JavaFX Ähnliche Komponente wie der VB6 Frame? AWT, Swing, JavaFX & SWT 2
M JavaFX Progressbar bar und track Komponente zur Laufzeit ändern AWT, Swing, JavaFX & SWT 2
Tort-E JavaFX Daten an WebView Komponente AWT, Swing, JavaFX & SWT 1
G JPanel komponente Löschen AWT, Swing, JavaFX & SWT 7
T Swing Index für Komponente in JPanel? AWT, Swing, JavaFX & SWT 6
T Swing Größe einer Komponente in einem BoxLayout / FlowLayout festlegen AWT, Swing, JavaFX & SWT 7
G Border der Komponente bei Table CellRenderer überschreiben AWT, Swing, JavaFX & SWT 0
P Warten auf komponente AWT, Swing, JavaFX & SWT 2
U LookAndFeel für eine Komponente AWT, Swing, JavaFX & SWT 2
E Mit Netbeans von einer Form auf eine Komponente einer anderen Form zugreifen AWT, Swing, JavaFX & SWT 2
G Zeichnen auf eine schwergewichtige Komponente? AWT, Swing, JavaFX & SWT 0
T Komponente wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
S Swing Komponente wird überblendet AWT, Swing, JavaFX & SWT 27
A Swing Komponente mehrseitig ausdrucken AWT, Swing, JavaFX & SWT 2
V Fertige Komponente zum Anzeigen mehrerer Bilder AWT, Swing, JavaFX & SWT 5
B Swing Komponente an Position eines Objektes ausgeben lassen AWT, Swing, JavaFX & SWT 3
R Swing Komponente austauschen AWT, Swing, JavaFX & SWT 2
M JApplet mit Java 3D Komponente AWT, Swing, JavaFX & SWT 6
M Swing JMenu verdeckt durch Komponente (aber kein AWT und Swing mix!?) AWT, Swing, JavaFX & SWT 3
N Swing Java Komponente zur Darstellung von klickbaren Links, die Java Funktionen ausführen können AWT, Swing, JavaFX & SWT 2
S Swing Eigene Komponente (JPanel) soll ChangeEvents verteilen AWT, Swing, JavaFX & SWT 12
S Spezielle komponente aktualisieren AWT, Swing, JavaFX & SWT 9
GUI-Programmer LayoutManager Kurze Layout Frage - eine komponente mittig? AWT, Swing, JavaFX & SWT 5
1 Swing Spaltenbreite and CellEditor- Komponente anpassen AWT, Swing, JavaFX & SWT 4
R Komponente wieder entfernen AWT, Swing, JavaFX & SWT 13
B Komponente "sauber" entfernen(JToolBar) AWT, Swing, JavaFX & SWT 4
xehpuk Swing Komponente in Graustufen zeichnen AWT, Swing, JavaFX & SWT 2
A Swing GlassPane Cursor wird bei fremder Komponente nicht angezeigt AWT, Swing, JavaFX & SWT 3
darekkay Swing Komponente zur Laufzeit neuinitialisieren AWT, Swing, JavaFX & SWT 6
K Swing Komponente als Bild speichern AWT, Swing, JavaFX & SWT 11
F visuelle Komponente AWT, Swing, JavaFX & SWT 3
padde479 Komponente gesucht AWT, Swing, JavaFX & SWT 2
A Swing Komponente für Swing und JSF durch MVC AWT, Swing, JavaFX & SWT 5
P Swing Eigene Komponente Entwickeln - erben von JComponent oder JPanel? AWT, Swing, JavaFX & SWT 5
A Swing suche OpenSource Date(Time)Picker Komponente AWT, Swing, JavaFX & SWT 9
N Swing außerhalb des Hauptframe Komponente/Frame öffnen AWT, Swing, JavaFX & SWT 2
S Feste Position einer Komponente auf Glasspane AWT, Swing, JavaFX & SWT 6
B Erfragen der Komponente AWT, Swing, JavaFX & SWT 4
M Mausklick an darunterliegende Komponente weiterleiten AWT, Swing, JavaFX & SWT 9
B (Swing) Welche Komponente für unterteilten Text? AWT, Swing, JavaFX & SWT 4
D Wie nennt sich beschriebene Komponente? (-> Autocomplete) AWT, Swing, JavaFX & SWT 5
D Komponente im FlowLayout nicht mittig sondern rechts. Wie? AWT, Swing, JavaFX & SWT 4
G Swing Komponente gesucht (Textfeld mit Liste) AWT, Swing, JavaFX & SWT 2
padde479 Suche eine Komponente (->ToolBar) AWT, Swing, JavaFX & SWT 7
algorismi Browser Komponente AWT, Swing, JavaFX & SWT 3
G Swing Auswahlrechteck über Komponente zeichnen AWT, Swing, JavaFX & SWT 3
0 Swing Drag n' Drop Bug wenn Source und Target gleiche Komponente? AWT, Swing, JavaFX & SWT 4
C Swing Komponente mit setLocation auf JPanel funktioniert nicht AWT, Swing, JavaFX & SWT 3
G Gibt es diese Komponente? AWT, Swing, JavaFX & SWT 11
slawaweis Suche TagCloud Komponente für Swing AWT, Swing, JavaFX & SWT 10
H Swing Eigene Komponente wird nur halb oder komisch angezeigt AWT, Swing, JavaFX & SWT 3
M Combobox soll Farbe einer Komponente setzen AWT, Swing, JavaFX & SWT 2
H Swing Eigene Komponente reagiert falsch auf mouseClicked() AWT, Swing, JavaFX & SWT 5
D swt komponente in swing-frame AWT, Swing, JavaFX & SWT 4
hdi SWT Operation auf GUI-Komponente kommt mal wieder nicht an... AWT, Swing, JavaFX & SWT 9
N Suche nach Komponente / LaF AWT, Swing, JavaFX & SWT 21
A Komponente zur Laufzeit hinzufügen und RICHTIG anzeigen AWT, Swing, JavaFX & SWT 3
T Swing Gibt es eine Komponente für eine farbliche Editorbox? AWT, Swing, JavaFX & SWT 6
S Swing Komponente mit jogl AWT, Swing, JavaFX & SWT 18
Airwolf89 Swing Von anderer Klasse auf Eigenschaften einer Komponente zugreifen AWT, Swing, JavaFX & SWT 5
SuperSeppel13 Komponente transparent übermalen AWT, Swing, JavaFX & SWT 2
I Swing Warten, bis eine GUI-Komponente aktualisiert ist? AWT, Swing, JavaFX & SWT 4
R Lineal an einer Komponente AWT, Swing, JavaFX & SWT 10
R KeyListener - welcher Komponente hinzufügen AWT, Swing, JavaFX & SWT 5
Ham Swing PropertyChangeListener aufrufende Komponente AWT, Swing, JavaFX & SWT 5
hdi LayoutManager GridBagLayout : Komponente hat falsche Größe? AWT, Swing, JavaFX & SWT 2
hdi Swing Suche passende API Klasse(n) für meine Komponente AWT, Swing, JavaFX & SWT 8
Ä Graphics-Komponente auf JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
H Name einer Komponente ermitteln AWT, Swing, JavaFX & SWT 5
Developer_X Swing Problem beim "rezeichnen" -> Überzeichnen der Komponente AWT, Swing, JavaFX & SWT 8
M Suche Java Komponente AWT, Swing, JavaFX & SWT 2
D Swing Eigene Komponente mit JSpinner AWT, Swing, JavaFX & SWT 4
B Swing setDefaultButton geht nicht - Komponente fängt Events ab AWT, Swing, JavaFX & SWT 5
A Suche TreeTable-Komponente AWT, Swing, JavaFX & SWT 12
GilbertGrape ActionListener implementieren oder Eigenen für jede Komponente? AWT, Swing, JavaFX & SWT 9
C Spaltenorientierte Komponente, ähnlich JTabbed gesucht AWT, Swing, JavaFX & SWT 4
V Suche Komponente AWT, Swing, JavaFX & SWT 2
G Komponente zur Laufzeit tauschen. AWT, Swing, JavaFX & SWT 5
G Coverflow -artige Komponente für Swing? AWT, Swing, JavaFX & SWT 2
F eigene Swing-Komponente. Drehregler AWT, Swing, JavaFX & SWT 4
Landei Welche Kalender-Komponente? AWT, Swing, JavaFX & SWT 3
G Komponente in der der Cursor steht zurückgeben? AWT, Swing, JavaFX & SWT 2
P Unsichtbare Komponente in ein Bild rendern? AWT, Swing, JavaFX & SWT 11
G Komponente die im Center und North Bereich liegt zurückgebe? AWT, Swing, JavaFX & SWT 6
O Zwei Listener auf Komponente, warten auf Beendigun? AWT, Swing, JavaFX & SWT 2
G Kennt jemand diese Komponente? AWT, Swing, JavaFX & SWT 2
G Palette Komponente für Swing? AWT, Swing, JavaFX & SWT 8
M Name der Komponente? AWT, Swing, JavaFX & SWT 2
G Komponente oben positionieren (BorderLayout) AWT, Swing, JavaFX & SWT 3
ChaosNo1 Problem mit Komponente auf JPanel adden (beides abgeleitet) AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben