ERLEDIGT
JA
JA
ANTWORTEN
6
6
ZUGRIFFE
722
722
EMPFEHLEN
-
Hallo zusammen ,
ich stehe hier ein wenig auf dem Schlauch.
Ich habe eine Klasse LogScreen die mit einer jTextArea initialisiert wird und
zwei Methoden wie
void info(String text)....
void error (String text)....
enthält und in einer GUI LogMeldungen in eine TextArea schreibt.
Desweiteren gibt es da noch eine Klasse LogFile die enthält auch Methoden
wie info ... usw. halt einiges mehr um ein Logfile zu erzeugen ....
Ich möchte nun in der Klasse ClientWorker einen Konstruktor haben, der einmal, wenn er von der
GUI aufgerufen wird z.B.
ClientWorker c = new ClientWorker(LogScreen log);
oder vom Kommandozeilentool
ClientWorker c = new ClientWorker(LogFile log);
Wie mache ich sowas ?
In der Klasse ClientWorker geben alle Methoden per log.info("Text....");
die Meldungen aus.
Ist bestimmt ganz einfach, ich habe aber ebend keine Idee.
Danke schon mal sagt Ibo.
-
01.04.10 23:01 #2SPiKEe Tutorials.de Gastzugang
ich würde das nicht direkt mit überladenen konstruktoren machen da du so unweigerich code duplizierst ...
als konstruktor würde ich einen NULL-konstruktor *keinen übergabe- und rückgabe wert* vorschlagen ...
dann eine methode *public / protected .. je nach dem* welche halt Log an sich implementiert *ich gehe davon aus das LogScreen und LogFile ein gemeinsames super Log oder sowas haben* und dann entweder mit instanceOf *geht das so überhaupt ?* oder einen 2ten übergabe-parameter *bool bietet sich bei >2< varianten an ... ansonsten char um RAM zu schonen* und dann in der implementierung auf diesen an den kritisch stellen prüfen
ansonsten hätte ich so spontan keine andere idee
-
02.04.10 14:07 #3
Was dir fehlt ist eine gemeinsame Schnittstelle der Logger. Wenn du eine gemeinsame Schnittstelle hast, ist das schon gar kein Problem mehr. Dann brauchst du nur noch einen Konstruktor in der ClientWorker-Klasse, der eine Implementierung der Schnittstelle als Parameter erwartet.
Hab mal flott ein Beispiel zusammgezimmert. Es fehlen zwar die imports, aber soll auch nur ein Beispiel sein:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
// Log.java public interface Log { public void info(String info); public void error(String error); } // LogScreen.java public class LogScreen implements Log { private JTextComponent tc; public LogScreen(JTextComponent tc) { this.tc = tc; } public void info(String info) { // In eine TextArea oder was auch immer schreiben } public void error(String error) { // In eine TextArea oder was auch immer schreiben } } // LogFile.java public class LogFile implements Log { private File logFile; public LogFile(File logFile) { this.logFile = logFile; } public void info(String info) { // In eine Datei schreiben } public void error(String error) { // In eine Datei schreiben } } // ClientWorker.java public class ClientWorker { private Log log; public ClientWorker(Log log) { this.log = log; } public void tuWas() { log.info("Es wird was getan"); // Etwas tun // ... // Fehler aufgetreten info.error("Es ist beim etwas tun ein Fehler aufgetreten!"); } } // CMD.java public class CMD { public static void main(String[] args) { ClientWorker cw = new ClientWorker(new LogFile(new File("/var/log/meineLogFile.log"))); cw.tuWas(); } } // GUI.java public class GUI extends JFrame { private ClientWorker cw; private JTextArea logTextArea; private JButton tuWasButton; private JTextArea getLogTextArea() { if(logTextArea == null) { logTextArea = new JTextArea(); } return logTextArea; } private JButton getTuWasButton() { if(tuWasButton == null) { tuWasButton = new JButton("tu was"); tuWasButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { cw.tuWas(); } }); } return tuWasButton; } public GUI() { cw = new ClientWorker(new LogScreen(getLogTextArea())); // Komponenten hinzufügen etc. // ... } public static void main(String[] args) { new GUI(); } }
Man sagt, das Schwert eines Samurai sei seine Seele ...
Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.
Das Schmieden ist eine Kunst; Das Schreiben auch ;)
-
Hallo ,
danke für die Antworten !
Nach einigem hin und her, habe ich mich entschlossen, die Logging KLasse dahingehend
zu erweitern, das auch auf einer TextArea die Meldungen ausgegeben werden können und
bei der Initialisierung ein Flag gesetzt wird, das nicht in ein File geschrieben wird.
Hat letztlich sogar den Vorteil, das man nun für die GUI ein "normales" Logging hat und trotzdem
ein Logfile für Traces erzeugen kann und nur noch eine Klasse benötigt wird.
Danke nochmals und ein frohes Osterfest, wünscht Ibo.
-
Wobei sich wieder die Frage stellt: Warum ein eigenes Logging implementieren, wenn es sie wie Sand am Meer gibt?
-
Hi Zeja,
stimmt schon, aber :
1. Sollte das Logfile von der Optik so aussehen, wie die bisherigen auch ,die von Perl-Scripten erstellt werden , damit da der Anwender nicht umstellen muss.
und
2. wollte ich halt auch direkt das Ganze am Screen ausgeben können.
Wirklich aufwendig, ist das Logging ja auch nicht.
Gruss Ibo!
-
Die Logging APIs lassen dich das aussehen der Logfiles konfigurieren. Mit einem eigenen Appender kannst du auch auf die GUI loggen.
Logging ist sicherlich zunächst nicht schwierig. Bis die Anforderungen zunehmen und man hier und da noch was dazubaut und es immer komplexer wird. Schau dir doch lieber mal eins der Frameworks an. Das Rad neu erfinden ist gerade als Entwickler selten eine gute Idee.
Ähnliche Themen
-
C++ Referenz in Klasse initialisieren
Von Sephizero im Forum C/C++Antworten: 3Letzter Beitrag: 18.06.09, 20:16 -
Objekte initialisieren
Von starbuck86 im Forum Java GrundlagenAntworten: 3Letzter Beitrag: 21.10.08, 17:15 -
Konvertierung der selben Klasse in unterschiedlichen Namespaces
Von realbora im Forum .NET Web und KommunikationAntworten: 13Letzter Beitrag: 12.12.07, 15:47 -
Klassen: Eigene klasse neu Initialisieren und zurückgeben - Aber wie?
Von MC Breit im Forum PHPAntworten: 2Letzter Beitrag: 25.11.04, 15:46 -
Klasse in Funktionen nutzen ohne neu zu initialisieren?
Von danielmueller im Forum PHPAntworten: 4Letzter Beitrag: 17.09.04, 17:52





Zitieren


Login





