Portal > Foren > Java > Desktop-Applikationen und Grafik > Automatisch Cursor in JTextField setzen?
Antwort
 
Themen-Optionen
Alt 04.05.2006, 23:10 Nach oben    #1
Benutzer
 
Registriert seit: 01.02.2005
Beiträge: 64
Standard Automatisch Cursor in JTextField setzen?

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) nach dem beschreiben der TextArea?!


Zum Code:
  • Wenn der User die Konsole aufruft, ist der Cursor immer in der TextArea, soll aber im Textfeld sein.
  • Wenn ein Befehl/Kommentar eingegeben wurde, wird zwar das textfeld geleert, aber der Cursor nicht mehr zurückgesetzt.
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);
            }
    }
__________________
  1. My software never has bugs. It just develops random features!
  2. Beta. Software undergoes beta testing shortly before it's released. Beta is Latin for 'still doesn't work.'
  3. There are two ways to write error-free programs. Only the third one works.
Binary ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.05.2006, 07:16 Nach oben    #2
Erfahrener Benutzer
 
Benutzerbild von Gottzilla
 
Registriert seit: 02.02.2005
Beiträge: 521
Standard

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.
Gottzilla ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.05.2006, 10:13 Nach oben    #3
Benutzer
 
Registriert seit: 01.02.2005
Beiträge: 64
Standard

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.
__________________
  1. My software never has bugs. It just develops random features!
  2. Beta. Software undergoes beta testing shortly before it's released. Beta is Latin for 'still doesn't work.'
  3. There are two ways to write error-free programs. Only the third one works.
Binary ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.05.2006, 10:30 Nach oben    #4
Erfahrener Benutzer
 
Benutzerbild von Gottzilla
 
Registriert seit: 02.02.2005
Beiträge: 521
Standard

Dann sind ja jetzt alle Fragen geklärt!?

Zitat:
Zitat von Binary
3)
...
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.
Es ist halt mehr OOP und MVC wenn du eine extra Klasse für den OutputStream hast und eine für die Darstellung. Hab jetzt aber kA wie das alles so bei dir zusammenhängt .
Gottzilla ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.05.2006, 11:41 Nach oben    #5
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.110
Standard

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);
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.05.2006, 13:42 Nach oben    #6
Benutzer
 
Registriert seit: 01.02.2005
Beiträge: 64
Standard

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!
__________________
  1. My software never has bugs. It just develops random features!
  2. Beta. Software undergoes beta testing shortly before it's released. Beta is Latin for 'still doesn't work.'
  3. There are two ways to write error-free programs. Only the third one works.
Binary ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.05.2006, 14:17 Nach oben    #7
Erfahrener Benutzer
 
Benutzerbild von Gottzilla
 
Registriert seit: 02.02.2005
Beiträge: 521
Standard

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 .
Gottzilla ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.05.2006, 14:58 Nach oben    #8
Erfahrener Benutzer
 
Benutzerbild von karahead
 
Registriert seit: 23.11.2005
Ort: Stadtallendorf
Beiträge: 139
Standard

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.
karahead ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.05.2006, 16:04 Nach oben    #9
Benutzer
 
Registriert seit: 01.02.2005
Beiträge: 64
Standard

Zitat:
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
ok, thx!


Zitat:
Trotzdem isses unlogisch in nem OutputStream nen TextArea einzubauen, lieber zwei Klassen
Wie meinst du das?
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)?
__________________
  1. My software never has bugs. It just develops random features!
  2. Beta. Software undergoes beta testing shortly before it's released. Beta is Latin for 'still doesn't work.'
  3. There are two ways to write error-free programs. Only the third one works.
Binary ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.05.2006, 17:21 Nach oben    #10
Johannes Müller
 
Benutzerbild von $traight-$hoota
 
Registriert seit: 15.09.2005
Ort: Königreich Flieden
Beiträge: 519
Standard

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
$traight-$hoota ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.05.2006, 22:14 Nach oben    #11
Benutzer
 
Registriert seit: 01.02.2005
Beiträge: 64
Standard

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".
__________________
  1. My software never has bugs. It just develops random features!
  2. Beta. Software undergoes beta testing shortly before it's released. Beta is Latin for 'still doesn't work.'
  3. There are two ways to write error-free programs. Only the third one works.
Binary ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.05.2006, 22:25 Nach oben    #12
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.110
Standard

Ein BufferedOutputStream erbt von OutputStream. Wenn PrintStream damit umgehen kann, dann kann es auch mit nem BufferedOutputStream leben.
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 06.05.2006, 09:15 Nach oben    #13
Benutzer
 
Registriert seit: 01.02.2005
Beiträge: 64
Standard

So, ich hab das jetzt mal in verschiedenen Kombinationen getestet:

Code:
JTextAreaOutputStream extends BufferedOutputStream
--> Im Constructor ist super(); nicht möglich, da ich dafür einen OutputStream brauche...

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())));
hat einen netten Effekt....

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:
Dies ist ein Test von StdOut
java.lang.Exception: Error: Testerror
at Starttest.testException(Starttest.java:19)
at Starttest.main(Starttest.java:12)
der BufferedOutputStream ergibt nun folgende Ausgabe:

Zitat:
leer
--> Da kommt nix bei raus...

Entweder hab ich jetzt da nen Denkfehler drin, oder es geht nicht.
__________________
  1. My software never has bugs. It just develops random features!
  2. Beta. Software undergoes beta testing shortly before it's released. Beta is Latin for 'still doesn't work.'
  3. There are two ways to write error-free programs. Only the third one works.
Binary ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.05.2006, 07:45 Nach oben    #14
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Nachträglich mal verschoben. Gehört ja ins Swing-Forum.

Der Thread wurde verschoben, wegen ...
... Postings im falschen Forum. Bitte beim nächsten Mal darauf achten.,

verschoben
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ä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


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:30 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

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