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
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