![]() |
| | Themen-Optionen |
| | Nach oben #1 |
| Benutzer Registriert seit: 01.02.2005
Beiträge: 64
|
Ich bin gerade mal wieder dabei einige nützliche Code-Schnipsel zu erstellen. Zur Zeit arbeite ich an einer Konsole, wie man sie aus Videospielen kennt. Bei der Erzeugung des Objektes, wird System.out und System.err Stream auf eine TextArea umgeleitet (Für Debugzwecke sehr nützlich). Weiterhin soll es möglich sein, Befehle /Kommentare einzugeben, bevor man das ganze speichert.- Das Textfeld und den Button hab ich, aber jedesmal, wenn ich einen Befehl eingegeben habe, wird der Cursor in die TextArea gesetzt. Trotz ausdrücklichem "tf.setText("");" und "tf.setCaretPosition(0) Zum Code:
Code: private class JTextAreaOutputStream extends OutputStream
{
JTextArea ta;
JTextField tf;
public JTextAreaOutputStream (JTextArea t, JTextField texf)
{
super();
ta = t;
this.tf=texf;
}
public void write (int i)
{
char[] chars = new char[1];
chars[0] = (char) i;
String s = new String (chars);
ta.append(s);
tf.setText("");
tf.setCaretPosition(0);
}
public void write (char[] buf, int off, int len)
{
String s = new String (buf, off, len);
ta.append(s);
tf.setText("");
tf.setCaretPosition(0);
}
}
__________________
|
| | |
| | Nach oben #2 |
| Erfahrener Benutzer Registriert seit: 02.02.2005
Beiträge: 521
|
Hi, 1. Mir ist die Frage nicht so ganz klar, sry 2. Fall es darum geht Komponenten den Fokus zu übergeben, dann versuch mal tf.requestFocusInWindow(); 3. Ich weiß ja nicht ob dein Code nur ein Beispiel ist, aber imho haben grafische Sache nichts in einer Klasse verloren, die von einem OutputStream erbt. |
| | |
| | Nach oben #3 |
| Benutzer Registriert seit: 01.02.2005
Beiträge: 64
|
1) ich will, das der User nicht immer den Cursor manuell zurücksetzen muss, wenn eine Ausgabe erfolgt, sondern weiterhin im Textfeld tippen kann 2) Ok, danke! Funktioniert und ist genau das, was ich wollte. Ich hab die ganze Zeit nach sowas wie "tf.setFocus();" gesucht... 3)Kein Beispielcode, waren aber nur verschiedene Tests, um zu sehen, wie ich den Cursor da wieder reinbekomme. Das "setCaretPosition();" hatte ich z.b. von einem alten Post in Java-Foren.de, als es um ein Autoscroll in einer Textarea ging - da wurde der Cursor immer an das Ende gesetzt. Hab gedacht, dass das funktionieren könnte... Und, was das darin zu suchen hat? Ganz einfaches Beispiel: der User tippt im Textfeld und irgendein Thread nutzt "System.out" -> Der Cursor wandert in die Textarea und er würde (Textarea ist disabled für den User) dann also jedesmal wieder den Focus setzen müssen.
__________________
|
| | |
| | Nach oben #4 | |
| Erfahrener Benutzer Registriert seit: 02.02.2005
Beiträge: 521
|
Dann sind ja jetzt alle Fragen geklärt!? Zitat:
| |
| | |
| | Nach oben #5 |
| Projektleiter Registriert seit: 30.11.2005 Ort: Bottrop
Beiträge: 1.110
|
Einen kleinen Tipp vielleicht noch: Statt diesem char-Array-rumgetrickse könntest du mal String.valueOf(int) versuchen. Dürfte etwas effektiver sein. Also z.B. so: Code: String s = String.valueOf(i); // oder: String s = String.valueOf((char)i); |
| | |
| | Nach oben #6 |
| Benutzer Registriert seit: 01.02.2005
Beiträge: 64
|
ich hab das ganze inzwischen etwas erweitert / geändert... Wie das zusammenhängt: der Outputstream wird als System.out/err festgelegt. -> Alles aus dem Stream erscheint in der Textarea. Weiterhin gibt es ein Textfeld, in dem Befehle an die Applikation eigegeben werden können (über einen eigenen CommandEventListener). Da während der Eingabe des Befehls von irgendwoher eine Ausgabe kommen kann, darf das bei der Eingabe nicht stören und daher muss das Textfeld immer wieder den Fokus zurückerhalten. Das passiert inzwischen über den CaretListener der Textarea, welcher bei bewegen des Cursors automatisch den Fokus an das Textfeld zurückgibt. Oder in kurz: Ausgaben an System.out/err -> Textarea Eingaben im Textfeld -> Aufsplitten in Command und Arguments -> Event an internen EventListener oder an den des Users senden (je nach Art der Eingabe, Konsolenbefehle beginnen mit "#") und, @pago: ...ich werds mal probieren!
__________________
|
| | |
| | Nach oben #7 |
| Erfahrener Benutzer Registriert seit: 02.02.2005
Beiträge: 521
|
Trotzdem isses unlogisch in nem OutputStream nen TextArea einzubauen, lieber zwei Klassen (aber lassen wir das, das endet sonst nur im Streit Noch ne Anmerkung: Nur weil du deinem JTextArea was anhängst, bekommt es nicht den Focus! Der CaretListener ist also unnötig. Es genügt praktisch wenn du einmal am Anfang sagst tf.requestFocusInWindow(); wenn dann der User irgendwo anders hinklickt ist es sein Problem (und evtl. auch sein wille!?) dass eine andere Komponente den Focus hat. Von alleine holt sich eine Komponente nämlich nicht den Focus |
| | |
| | Nach oben #8 |
| Erfahrener Benutzer Registriert seit: 23.11.2005 Ort: Stadtallendorf
Beiträge: 139
|
Toll, da gibts endlich mal wieder einen Thread in der Java Abteilung und ich komm zu spät.
__________________ Die Menschen wünschen sich Unsterblichkeit, aber wissen nichts anzufangen an einem verregneten Sonntag Nachmittag. |
| | |
| | Nach oben #9 | ||
| Benutzer Registriert seit: 01.02.2005
Beiträge: 64
| Zitat:
Zitat:
meinst du ein EventQueue.invokeLater() - So weit ich weiß ist ta.append (String) threadsicher (als Ausnahme in Swing)? Oder wie willst du das mit mehreren Klassen lösen? XXXFrame.setAreaText(String)?
__________________
| ||
| | |
| | Nach oben #10 |
| Johannes Müller Registriert seit: 15.09.2005 Ort: Königreich Flieden
Beiträge: 519
|
Für diesen zweck ist es imho schon ok, nen outputstream mit ner komponente zu verbinden. allerdings würde ich das ganze etwas abstrakter halten und statt TextArea und TextField zwei TextComponent verwenden. ich weiß ja nicht, ob das in der aufrufenden klasse schon geschieht, aber ich würde im konstruktor die textarea "disablen", dann kann der cursor nicht mehr darein gesetzt werden und man kann nichts an der programmausgabe ändern. außerdem würde ich statt OutputStream von BufferedOutputStream erben, da es bei so einer Ausgabe meist ^längere^ Strings ausgegeben werden können die gleich per writeLine(String) in das Textfeld geaddet werden.
__________________ Weißt Bescheid - Scheiß wie weit |
| | |
| | Nach oben #11 |
| Benutzer Registriert seit: 01.02.2005
Beiträge: 64
|
Der Vorschlag mit dem "BufferedOutputStream" ist nicht schlecht - aber leider soll diese Klasse "System.out" bzw. "System.err" einlesen. Und die sind ein PrintStream, welcher meinen Wissens nur OutputStreams, aber keine BufferedOutpuStreams unterstützt... TextArea wird bereits im Constructor des Fensters "gedisabled".
__________________
|
| | |
| | Nach oben #13 | ||
| Benutzer Registriert seit: 01.02.2005
Beiträge: 64
|
So, ich hab das jetzt mal in verschiedenen Kombinationen getestet: Code: JTextAreaOutputStream extends BufferedOutputStream und ein Code: System.setOut (new PrintStream (new BufferedOutputStream(new JTextAreaOutputStream(mixOutFrame.getTextArea(), mixOutFrame.getTextField()))); System.setErr (new PrintStream (new BufferedOutputStream(new JTextAreaOutputStream(mixOutFrame.getTextArea(), mixOutFrame.getTextField()))); Ich hab für diese Klasse ein Test-Programm geschrieben, welches erst System.out nutzt, und dann eine Exception wirft. mit dem original Code ist damit folgende Ausgabe auf der Textarea: Zitat:
Zitat:
Entweder hab ich jetzt da nen Denkfehler drin, oder es geht nicht.
__________________
| ||
| | |
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Probleme mit dem PEAR Paket HTML_Template_PHPLIB | Ben | PEAR, PECL und Frameworks | 19 | 12.02.2007 10:51 |
| JTextField + Eingabeprüfung auf JButton reagieren (nicht Enter) | risa | Desktop-Applikationen und Grafik | 16 | 02.04.2006 23:57 |
| Hilfe benötigt... | arcor | Allgemeine Java-Programmierung | 6 | 25.01.2006 19:19 |
| getter-Methoden automatisch gernerieren lassen ?? | ehli75 | Allgemeine Java-Programmierung | 2 | 20.02.2005 15:04 |
| Inhalt von JTextField einlesen klappt nicht | Nightsky | Allgemeine Java-Programmierung | 3 | 27.09.2004 09:22 |