Auto-Scroll versagt ab und zu -.-

Xeonkryptos

Bekanntes Mitglied
Moin Leute,

ich arbeite weiterhin an meinem Chat-Programm-Projekt und bis auf einige Schwierigkeiten funktioniert es eigentlich, aber ich verstehe nicht, wieso das Programm autoscrollt und irgendwann scrollt er einfach nicht mehr automatisch ohne Vorwarnung. woran kann das liegen?

Ich hab das Auto-Scrolling so implementiert:
Java:
caret = (DefaultCaret) taMessageProcess.getCaret();
		caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);

Es klappt immer mal, aber irgendwann, warum auch immer, versagt es den dienst... das taMessageProcess ist in diesem Fall ein JTextArea, welches in eine JScrollPane eingesetzt wurde.
 

hdi

Top Contributor
Afaik musst du da doch gar nix mit irgendeinem Caret machen?! Wenn das Ding in einer JScrollPane liegt sollte diese auch immer mitscrollen wenn das Caret sich außerhalb des Anzeigebereichs bewegt. Nimm die Zeilen doch einfach mal raus...
 

Xeonkryptos

Bekanntes Mitglied
Aber genau deswegen nehme ich ja das Caret... Die JScrollPane scrollt nicht automatisch und google hat mir dann halt unter anderem diese Lösung ausgespuckt und sie funktioniert auch, nur ab und an halt nicht...

Edit: Und wie ich es mir schon gedacht hab, funktioniert das Autoscrollen nicht, wenn ich die Zeilen rausnehme.
 
Zuletzt bearbeitet:

hdi

Top Contributor
Die JScrollPane scrollt nicht automatisch

Sollte sie aber.

Java:
new JScrollPane(new JTextArea());

erzeugt eine JScrollPane, die Scrollbalken anzeigt und automatisch mitscrollt wenn das Caret innerhalb der Textarea aus dem sichtbaren Bereich wandert. Jetzt ist die Frage wie du da zB Text hinzufügst, und welche Events du feuerst.
 

Xeonkryptos

Bekanntes Mitglied
Events feuere ich direkt mit der JTextArea nicht, sondern wenn eine Nachricht reinkommt (Server-Client-Prinzip) über einen InputStream werte ich diese aus und füge sie dann mit der append-Methode in die TextArea hinzu.
 

hdi

Top Contributor
Diese CaretPolicy bezieht sich auf das interne Document der TextArea. Wenn du einfach nur append() machst, bringt dir das nichts. (Mich wundert es, dass es überhaupt manchmal funktioniert).

Mach mal das hier:

Java:
txt.append(text);
txt.setCaretPosition(txt.getText().length()-1);
 

Xeonkryptos

Bekanntes Mitglied
Es klappt immer(!) bis auf ein paar Mal. Es funktioniert in der Regel einwandfrei und läuft auch, aber ab und zu macht es Probleme. Dann startet man das Prog neu und es läuft wieder und das ist halt irgendwie doof. Auch weil die JScrollPane das nicht(!) automatisch macht, zumindest bei mir!

Vielleicht liegt es auch an meiner Initialisierung. Ich poste einfach mal den Teil, der die TextArea initialisiert und den, der die ScrollPane initialisiert.

Java:
taMessageProcess = new JTextArea();
		taMessageProcess.setEditable(false);
		taMessageProcess.setLineWrap(true);
		taMessageProcess.setWrapStyleWord(true);
Java:
spMessageProcess = new JScrollPane(taMessageProcess);
		spMessageProcess
				.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		spMessageProcess.setPreferredSize(new Dimension(300, 400));
		spMessageField = new JScrollPane(taMessageField);
		spMessageField
				.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

So habe ich beide initialisiert. Und zu bemerken ist, dass ohne diesen Befehl von oben mit dem Caret meine andere TextArea, die Nachrichten schreibt, ohne Probleme autoscrollt.

Edit: Hab zu spät gesehen, dass ich das testen soll. Es funktioniert damit nicht, wenn ich meine Caret-Anweisung rausnehme.
 
Zuletzt bearbeitet:

hdi

Top Contributor
Es klappt immer(!)
Man beachte das Ausrufezeichen, um diese Aussage noch zu unterstreichen...

bis auf ein paar Mal.
...komische Definition von immer ;)

Also, nochmal: Wenn du etwas per append() einfügst hat das erstmal keine Auswirkung auf das Caret. Das Caret bleibt da wo es ist. Die ScrollPane richtet sich aber nach diesem Caret, und nicht nach dem Text in der Textarea. Und diese Caret Update Policy bezieht sich auf das Document, das eine TextArea intern hält. So wie es aussieht (ich bin mir da jetzt auch nicht sicher, ohne nachzuschauen) führt ein append() nicht zu irgendeiner Art Notification für das Document, und dann zieht deine CaretPolicy auch nicht. So sieht's zumindest bei mir aus. Bei mir funktioniert dein Code nicht. Und mich wundert es, dass mein Code bei dir nicht funzt. Vllt funkt da ja noch etwas dazwischen. Beobachte mal die Caret-Positon - nimm das setEditable(false) auf der TextArea testweise raus, sonst siehst du das Caret nicht. Es müsste immer ganz am Ende des Textinhalts sein, also hinter dem Text, der zuletzt per append() eingefügt wurde. (Ich meine jetzt unter Verwendung meines codes)
 

Xeonkryptos

Bekanntes Mitglied
Man beachte das Ausrufezeichen, um diese Aussage noch zu unterstreichen...


...komische Definition von immer ;)

Man beachte, dass es heißt: Ausnahmen bestätigen die Regel! :D

So wie es aussieht (ich bin mir da jetzt auch nicht sicher, ohne nachzuschauen) führt ein append() nicht zu irgendeiner Art Notification für das Document, und dann zieht deine CaretPolicy auch nicht. So sieht's zumindest bei mir aus. Bei mir funktioniert dein Code nicht. Und mich wundert es, dass mein Code bei dir nicht funzt.

Ich muss mich an dieser Stelle entschuldigen. Ich habe mehrere If-Clauses um auf bestimmte Bedingungen nach dem Erhalt der Nachrichten zu prüfen, eingebaut und hab an einer zentralen Stelle, dein Code vergessen einzufügen, die, wenn ich es alleine Teste immer ausgeführt wird.

Es scheint nichts dazwischen zu funken, da dein Code einwandfrei klappt, auch wenn ich setEditable(false) drin hab!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Developer_X Swing Java JTextArea auto scroll down AWT, Swing, JavaFX & SWT 6
R auto. Importanweisungen für javafx funktioniert in Eclipse nicht mehr AWT, Swing, JavaFX & SWT 4
Z JavaFX Pane für wechselnde Sub-Panes mit Auto-Resize AWT, Swing, JavaFX & SWT 2
A SWT Auto completion in text box AWT, Swing, JavaFX & SWT 5
A AWT Auto aus einer anderen Klasse her neu zeichnen AWT, Swing, JavaFX & SWT 7
C Auto fahren - Rechteck JFrame AWT, Swing, JavaFX & SWT 6
_dp jTextArea/jTextPanel Auto Höhe AWT, Swing, JavaFX & SWT 5
Daniel_L JTable, (Auto-)RowSorter und NullPointer-Exception AWT, Swing, JavaFX & SWT 6
B Auto. anpassen bei verschiedenen Aulösungen AWT, Swing, JavaFX & SWT 9
D JTable - Auto-Selektion NACH Zelleditierung steuern AWT, Swing, JavaFX & SWT 2
S Swing Alles beenden bei Fenster mit Scroll-Balken AWT, Swing, JavaFX & SWT 6
Mario1409 Swing JTextArea scroll Problem AWT, Swing, JavaFX & SWT 0
L JavaFX Image im ImageView auf Scroll Listener reagieren AWT, Swing, JavaFX & SWT 5
WetWer Scroll Pane AWT, Swing, JavaFX & SWT 2
S Swing Inhalte von Scroll-Panes werden nicht gezeichnet AWT, Swing, JavaFX & SWT 9
H Scroll Panel wird nicht hinzugefügt AWT, Swing, JavaFX & SWT 6
L JTable nicht komplett scroll bar AWT, Swing, JavaFX & SWT 5
C Swing JScrollPane und Scroll-Geschwindigkeit AWT, Swing, JavaFX & SWT 8
O Seltsames Scroll-Problem AWT, Swing, JavaFX & SWT 7
F JScrollPane mit JPanel drinne zeigt keine Scroll-Leisten AWT, Swing, JavaFX & SWT 7
J JScrollBar scroll-Verhalten auf 2 JButtons umleiten? AWT, Swing, JavaFX & SWT 2
C Jtextarea scroll problem AWT, Swing, JavaFX & SWT 3
G Scroll Problem AWT, Swing, JavaFX & SWT 2
H Scroll-Problem bei JScrollPane+JTextPane AWT, Swing, JavaFX & SWT 2
E Verknüpfung verschiedener Scroll-Leisten AWT, Swing, JavaFX & SWT 3
S JTextarea in JScrollpane -> scroll, Zeilenbeschränkung AWT, Swing, JavaFX & SWT 2
S Scroll-Rad in java AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben