# Konsole im eigenen Java-Programm



## Nova (5. Sep 2005)

Hallo,

Zuersteinmal sorry falls das schonmal irgendwo besprochenwurde, aber bei den Stichwörtern "Konsole" oder "Konsolenausgabe" erhalte ich "millionen" Treffer die überhauptnix mit meinem Problem zu tun haben.


Das Problem:
Ich möchte in meinem Java-Programm eine Art Konsole haben, dort werden einige Meldungen des Programms ausgegeben aber (einstellbar durch den User) auch System.out und/oder System.err auf diese "interne" Konsole umgeleitet.
Das umleiten mache ich so:

```
System.setErr(new ErrorPrintStream(statusLogLabel));
...
	private class ErrorPrintStream extends PrintStream{
	    public ErrorPrintStream(JLabel errorLog){
	        super(new ErrorOutputStream(errorLog));
	    }
	}
	   
	private class ErrorOutputStream extends OutputStream {
	    private JLabel errorLog;
	      
	    public ErrorOutputStream(JLabel errorLog) {
	        this.errorLog=errorLog;
	    }
	      
	    public void write(int b){
	        char c=(char)b;
	        if (String.valueOf(c).equals("\n")){
	        	errorLog.setText(errorLog.getText() + "
");
	        } else {
	            errorLog.setText(errorLog.getText() + String.valueOf(c));
	        }
	    }
	}
```


Meine Konsole ist ein JLabel welches sich in einem JScrollPane befindet.
Das Problem ist das die Ausgabe sehr langsam ist, wenn eine Exception auftritt und auf der Konsole ausgegeben wird kann man fast zuschauen wie jeder einzelne Buchstabe erscheint (ca.10 Buchstaben pro Sekunde).
Das Problem liegt wohl darin das 
a) ich immer mit setText() den kompletten Text des JLabels ersetze und
b) bei Exceptions jedes Zeichen einzeln geschrieben wird statt alles "in einem Rutsch" zu schreiben
Ich habs jetzt noch nicht ausprobiert, aber je länger der Text in der Konsole wirde desto schlimmer müsste es ja werden...

Da gibts doch sicher eine bessere (schnellere) Lösung, oder?


mfg
Christian


----------



## Beni (5. Sep 2005)

Ja: nimm kein JLabel.

Nimm eines der Textfelder, JTextArea oder so. Die sind eher auf grosse Textmengen ausgelegt (Mit Methoden wie "append"...).

Noch besser: mit einem DefaultStyledDocument, kombiniert mit einer JEditorPane, könntest du die Ausgaben (und Eingaben) farbig gestalten :wink:


----------



## meez (5. Sep 2005)

Willst du in der Konsole auch Befehle absetzten können? Wenn ja, dann empfahle ich Jython...


----------



## Nova (6. Sep 2005)

Hallo,

In JLabel hab ich ja HTML, desshalb hab ich das auch genommen (ein paar Sachen werden farbig und/oder fett ausgegeben um sie hervorzuheben)
Es sollte schon die Möglichkeit geben Text farbig zu gestalten und fettdurck/kursiv/unterstrichen. Mehr brauch ich aber nicht.
JTextArea und so kann das nicht glaube ich?!? Muss ich morgen mal nachschauen...

Zur Not würde es ja schon reichen die Exception-Meldungen als ganzes zu schreiben, die 1-2 Sekunden Verzögerung (wenn überhaupt) bis zum erscheinen des Textes merkt man nicht und dadurch das der Text als Block erscheint merkt man nicht dass die Konsole so langsam arbeitet.
Es werden sonst keine riesigen Texte ausgegeben, nur sowas wie "beginne programmteil a", "ende programmteil b", "Verifizierung erfolgreich" etc.
Schöner wärs allerdings wenn die Konsole wirklich schneller arbeiten würde...


Nein, keine Befehle. Die Konsole dient nur zur Ausgabe!


mfg
Christian


----------



## Sky (6. Sep 2005)

Hi, ich habe mal bei mir gekramt und folgendes ausgegraben, vielleicht hilft es ja: 
	
	
	
	





```
class DebugFrame extends OutputStream {

  // <Alle Debug-Ausgaben sollen ins gleiche Fenster>
  private static JTextPane content;
  private static JFrame frame;
  // </Alle Debug-Ausgaben sollen ins gleiche Fenster>

  // <statische Anteile initialisieren>
  static {
    content = new JTextPane();
    frame = new JFrame();

    content.setEditable( false );
    content.setPreferredSize( new Dimension( 300, 300 ) );
    frame.getContentPane().add( content );
    frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    frame.pack();
    frame.setVisible( true );
  }
  // </statische Anteile initialisieren>

  // Für die farbige Ausgabe...
  private SimpleAttributeSet attributes = new SimpleAttributeSet();

  // <Konstruktor>
  public DebugFrame( Color textColor, boolean bold ) {
    StyleConstants.setForeground( attributes, textColor );
    StyleConstants.setFontSize( attributes, 12 );
    StyleConstants.setBold( attributes, bold );
  }
  // </Konstruktor>

  // <write-Methode>
  public void write( int b ) throws IOException {
    try {
      StyledDocument doc = content.getStyledDocument();
      doc.insertString( doc.getLength(), String.valueOf( ( char )b ), attributes );
    } catch( BadLocationException ex ) {
      ex.printStackTrace();
    }
  }
  // </write-Methode>

}
```


----------

