UpdatePolicy wird nicht richtig gesetzt / funktioniert nicht

Henne079

Aktives Mitglied
Hallo zusammen,

ich bastel an einen kleinem Chatsystem und tüftel nun schon länger an einem Problem, allerdings sind mir die Ideen ausgegangen an was es liegen kann.

Zum Code:
Meine Chatausgabe wird in einem JTextArea wiedergegeben. Ich habe ein Caret erstellt und die UpdatePolicy auf "ALWAYS_UPDATE" gesetzt, damit bei jedem neuem Eintrag nach unten gescrollt wird. Dies ist allerdings nervig, wenn man einen Eintrag weiter oben lesen möchte.
Aus diesem Grund habe ich einen ScrollListener mit Abfrage erstellt, diese prüft ob nach unten gescrollt wurde. Wenn dies der Fall ist, wird die UpdatePolicy auf "ALWAYS_UPDATE" gesetzt. Wenn nicht nach unten gescrollt wurde, dann wird die UpdatePolicy auf "NEVER_UPDATE" gesetzt. In meiner Kontrollausgabe, wird dieser Vorgang auch bestätigt.

ScrollListener mit setzen von UpdatePolicy und Kontrollausgabe. (Ich missbrauche in dem Fall die ClientList als Testausgabe.)
Java:
package Chat.GUI;

import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import javax.swing.text.DefaultCaret;

import Chat.Main.Main;

public class ScrollOL implements AdjustmentListener
{
    @Override
    public void adjustmentValueChanged(AdjustmentEvent event)
    {
        Main.GUI.setClientList(Main.GUI.getScrollOutput().getViewRect().getY()+"");
        Main.GUI.addClientList(Main.GUI.getScrollOutput().getViewRect().getSize().getHeight()+"");
        Main.GUI.addClientList(Main.GUI.getScrollOutput().getView().getSize().getHeight()+"");
        
        if(Main.GUI.getScrollOutput().getViewRect().getY()+Main.GUI.getScrollOutput().getViewRect().getSize().getHeight() == Main.GUI.getScrollOutput().getView().getSize().getHeight())
        {
            Main.GUI.caretO.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
            Main.GUI.addClientList("y");
            Main.GUI.addClientList(Main.GUI.caretO.getUpdatePolicy());
        }
        else
        {
            Main.GUI.caretO.setUpdatePolicy(DefaultCaret.NEVER_UPDATE);
            Main.GUI.addClientList("n");
            Main.GUI.addClientList(Main.GUI.caretO.getUpdatePolicy());
        }
    }
}

Die Funktionen:
  1. Wenn die Einträge den Anzeigebereich überschreiten wird der Scrollbalken angezeigt und bei jedem neuem Eintrag automatisch nach unten gescrollt.
  2. Wenn ich nach oben scrolle und wieder nach ganz unten scrolle und dann ein neuer Eintrag erstellt wird, wird automatisch nach unten gescrollt.
  3. Wenn ich nicht ganz nach unten gescrollt habe und ein neuer Eintrag wird erstellt, dann bleibt der Scrollbalken stehen.
  4. Wenn ich nicht nach unten gescrollt habe und ein neuer Eintrag erstellt wird und ich danach nach ganz unten scrolle und dann wieder ein Eintrag erstellt wird, dann soll automatisch nach unten gescrollt werden.

Das Problem:
Die 4. Funktion funtioniert nicht, obwohl die Testausgaben meinen Erwartungen entsprechen und zeigen, dass die UpdatePolicy auf "ALWAYS_UPDATE" gesetzt wurde.

Ich hoffe, dass dies einigermaßen versändlich ist und ihr eine Idee für das Problem habt.

Grüße
Henne
 
Hallo, ich bins wieder.

Da bisher keine Antworten kamen, aber sich viele das Thema angeschaut haben, bin ich nun am rästeln ob es daran liegt, dass wirklich niemand eine Idee hat. Wie man dieses Problem lösen kann, oder doch daran, dass ich mein Problem zu unverständlich beschrieben habe.

Sollte es an der missverständlichen Beschreibung liegen, werde ich versuchen das Problem nochmal besser zu formulieren.

Oder kennt vielleicht jemand eine andere (leichtere) Möglichkeit dies zu realisieren?
 
Ich bin nicht so fit in GUI Programmierung aber musst du vielleicht deinem GUI irgendwie mitteilen das sich da was geändert hat? Weil du setzt die Updatepolicy bevor das GUI wirklich gecreated wird. Und dann änderst du es während das GUI lauft. Ich denke da wird der Hund begraben sein.
 
Ich danke dir für deine Antwort.

Es gibt die Möglichkeit den Caret des Textfeldes zu setzen. Allerdings ändert dies nichts.

Die Rückgabe meldet auch, dass die UpdatePolicy geändert wurde.

Ich habe nun ein bisschen probiert und festgestellt, dass sobald einmal die UpdatePolicy auf "NEVER_UPDATE" gesetzt wurde, ein setzen auf "ALWAYS_UDATE" zwar angezeigt wird, aber keine Funktion mehr hat.

Es gäbe noch die Möglichkeit, dass ich den Scrollbalken immer selber nach regel, allerdings kann ich mir nicht vorstellen, dass dies die Lösung ist.
 
Ich habe bisher noch keine Lösung gefunden und hoffe das mir jetzt vielleicht jemand helfen kann.

Ich erkläre interessierten das Problem auch gerne direkt über andere Platformen (TS, TeamViewer). Auch schicke ich gerne das Programm um selber den Fehler reproduzieren zu können.
 
Ich habe jetzt ein kleines Test Programm erstellt, allerdings tritt das Problem da auch auf. Ich bin absolut ratlos.
Das Programm befindet sich im Anhang.
Mit den Befehlen "on" und "off" kann die UpdatePolicy geändert werden, mit "get" lässt sich der aktuelle Status abfragen. Alle anderen Eingaben werden als Text ausgegeben.
Vielleicht hat ja jemand von euch jemand eine Idee. Der Sourcecode befindet sich ebenfalls im Anhang.

Ich freue mich über eine Antwort die mich zur Lösung bringt.
Wenn jemand einen komplett anderen Lösungsansatz hat, bin ich auch für diesen offen.
 

Anhänge


Zurück
Oben