Statusanzeige per JTextPane

Hallo,

ich habe ein Programm, dass automatisiert E-Mails verschickt. Den Vorgang stoße ich einmalig per Buttonklick an, dann wird eine vordefinierte Liste an Mails verschickt.

In meiner MailSender-Klasse lasse ich die erfolgreich verschickten Mails per Logeintrag über eine Loggerklasse in ein Textfile schreiben.

Nun möchte ich die Meldungen auch noch auf meiner GUI in einem JTextPane haben, und zwar immer, nachdem eine Mail verschickt wurde, sprich die GUI soll sich ständig aktualisieren.

Wie mache ich das am Besten, ohne großartig viel Logik in die GUI zu stecken?

Da wo das JTP ist erzeugts Du eine Listener-Instanz und übergibst die der Mailsenderklasse. Wenn die Mail verschickt ist ruft die Mail-Senderklasse die Methode des Listeners auf und dieser fürgt dann nie Info dem JTP hinzu…
Wichtig ist, dass Du die Mails in einem eigenen Thread versendest. Sonst wird ter Text erst am Schluss mit einem mal angezeigt.

  void mailSend(String logInfo);
}

class MailSender{
  private MailSendListener mailSendListener;

 public void setMailSendListener(MailSendListener mailSendListener){
   this.mailSendListener=mailSendListener;
  }
 
 public void sendMails(){
   // nach jeder mail:
   mailSendListener.mailSend("was im TextPane stehen soll");
 }
}

class GUI{
 private final JTextPane log = new JTextPane();
 public GUI( MailSender mailSender){
    mailSender.setMailSendListener(new MailSendListener (){
      @Override
      public void  mailSend(String logInfo){
          // ggf. SwingUtilities.invokeLater()...
          log.setText(log.getText()+"
"+logInfo);
      }
   }
 }
}```

bye
TT

So wäre das aber eher ein Observer statt ein Listener. Das Ganze liesse sich in der MailSender-Klasse auch mit PropertyChangeSupport realisieren, damit würde das Logging auf dem EDT laufen.

Ist zwar schon länger her, erstmal danke für die Lösungen, habs hinbekommen.

Eine Frage noch, wie kann ich einen Autoscroll aktivieren, sprich, dass nach jedem hinzufügen einer neuen Zeile die TextPane ganz nach unten gescrollt wird?

[QUOTE=Orothred]
Eine Frage noch, wie kann ich einen Autoscroll aktivieren, sprich, dass nach jedem hinzufügen einer neuen Zeile die TextPane ganz nach unten gescrollt wird?[/QUOTE]
Hierfür gibt es mehrere Möglichkeiten, einige z.b hier
http://forum.byte-welt.net/threads/10898-Graphics-und-JScrollbar

Die Lösungen für die TextArea hab ich schon gefunden, trotzdem danke. Ich habe ja eine TextPane…

was funktioniert hier nicht? Mindestens scrollRectToVisible sollte hier funktionieren.

Kapier nicht, was die Funktion macht bzw. wie sie mir in dem Fall helfen soll…

Damit kann die Komponente sagen, welcher Ausschnitt sichtbar sein soll.

Alle Lösungen die für die JTextArea funktionieren, funktionieren übrigens auch bei der JTextPane

Habs jetzt mit

probiert, tut sich aber nix. Wird beim Debuggen aber definitiv aufgerufen…

Keine weiteren Ideen mehr hier?

[QUOTE=Orothred]Habs jetzt mit

probiert, tut sich aber nix. Wird beim Debuggen aber definitiv aufgerufen…[/QUOTE]
An der Zeile selbst liegt es definitiv nicht. Da läuft an anderer Stelle im Code etwas falsch. Was liefert denn textPane.getDocument().getLength() ? handelt es sich hierbei überhaupt um die angezeigte TextPane??? Mehr Code - am besten kurz, kompilierbar und ausführbar wäre hilfreich.

Auf die schnelle kurzen, kompilierbaren Code zu liefern ist hier schwierig, ist doch ein etwas größeres Projekt.

textPane.getDocument().getLength() liefert beim ersten Durchlauf 48, beim zweiten 112, beim Dritten 174 (sind wahrscheinlich die Längen der einzelnen Zeilen, die ich schreibe)

Scheint also grundsätzlich zu funktionieren. Irgendwie denk ich scheinbar falsch…

Angaben zum Code:

Ich hab das Prinzip von Timothy_Truckle übernommen, genau so, das funktioniert ja auch. In der GUI rufe ich hier drin

class GUI{
 private final JTextPane log = new JTextPane();
 public GUI( MailSender mailSender){
    mailSender.setMailSendListener(new MailSendListener (){
      @Override
      public void  mailSend(String logInfo){
          // ggf. SwingUtilities.invokeLater()...
          log.setText(log.getText()+"
"+logInfo);
      }
   }
 }

einfach noch textPane.setCaretPosition(textPane.getDocument().getLength()); auf

Wieder keiner neue Ideen? Ich komm echt nicht weiter :frowning:

Bei Google gibt es auch viele Ansaetze dazu:
http://tips4java.wordpress.com/2008/10/22/text-area-scrolling/
http://tips4java.wordpress.com/2013/03/03/smart-scrolling/
Der zweite Blogeintrag ist genial, es wird beim Hinzufuegen immer nach unten gescrollt, aber wenn ein User nach oben scrollt setzt er nicht wieder nach unten. Das ermoeglicht das Lesen alter Logs.
Was macht dein Programm denn genau das es Mails verschicken muss?

Danke, das zweite sieht echt genial aus, werd ich testen.

Kein Problem :smiley:

Funktioniert super, vielen Dank nochmal :slight_smile: