Grösse & Position von JScrollBar

Status
Nicht offen für weitere Antworten.

hdi

Top Contributor
Hallo,

ich adde meinem JFrame eine JScrollBar:

Code:
   scroller = new JScrollBar(JScrollBar.VERTICAL);
        scroller.setValueIsAdjusting(true);
        scroller.setAutoscrolls(true);
        scroller.setPreferredSize(new Dimension(20,200));  // <- keine Wirkung!
        add(scroller);

Allerdings nimmt diese das komplette JFrame ein, passt sich also an die Dimensionen des Frames an.
ich hab schon alles versucht: setSize, setPreferredSize, sowohl in Dimensions als auch in Integern angegeben...

ein Layout habe ich beim JFrame nicht explizit eingestellt, d.h. es wird wohl das Standard-Layout sein.

Wieso ignoriert er denn alle Anweisungen die die Grösse bestimmen sollten? Wie krieg ich die ScrollBar jetzt nur rechts an die Seite des Fenster und nicht über das komplette Fenster gestreckt?

danke
 

hdi

Top Contributor
hä?

wenn ich mache:

Code:
ta.add(this);

gibt es eine Runtime-Exception:
Exception in thread "AWT-EventQueue-0" java.lang.ExceptionInInitializerError

und..ich hab ja kein panel, sondern ein JFrame. Ich habe dem JFrame die Scrollbar geaddet.
Es geht ja auch, nur nimmt es den kompletten Platz ein und ich kann die Grösse nicht verstellen..

Also sry wenn ich deine Antwort nicht verstehe, wie gesagt o.g. Code gibt nen Fehler.
Wie soll ich das denn genau zum Panel (=Frame :?:) adden?

danke
 

0x7F800000

Top Contributor
Der standard Layout ist völlig bescheuert und baut dauernd irgendeinen mist.
Da müsstest du schon selbst explizit mit setBounds() die position und größe des Components setzen, was mindestens genauso bescheuert ist. ;) Benutze irgendeinen vernünftigen layout (GridBag kann ich persönlich aber nicht empfehlen: der ist zwar 12831236812 komplexer als der null-layout, aber am ende kommt meistens genau dieselbe sch**ße raus :D , externer TableLayout ist dagegen recht populär und intuitiver zu bedienen, hab ich mal gehört)

Wieso ignoriert er denn alle Anweisungen die die Grösse bestimmen sollten?
Also, wie gesagt, solche empfehlungen und Bitten und freunliche Ratschläge wie "setPreferredSize()" sind dem null-layout völlig wurscht (dem GridBag anscheinend auch^^)

Wie krieg ich die ScrollBar jetzt nur rechts an die Seite des Fenster und nicht über das komplette Fenster gestreckt?
Hm, dieses vorhaben erweckt in mir den verdacht, dass du dir von dieser Konstruktion möglicherweise erhoffst, ein "scrollbares fenster" zu erhalten, etwa wie das Browser-Fenster, das du dir genau jetzt höchstwahrscheinlich anschaust.
Falls du das glaubst, sollte ich dich sicherhaltshalber gleich desillusionieren: mit dem scrolling des fensterinhaltes hat's nichts zu tun, JScrollBar ist eher für sowas wie lautstärkeregelung gedacht. Falls du was scrollen willst, benutze JscrollPane.
 

hdi

Top Contributor
Okay, JScrollPane soll's also sein ;) Danke dass du mir Arbeit erspart hast.

Nur so: Ist das ScrollPane schon selbst ein Fenster oder adde ich das dem Frame wie auch zB ein Button oder eben JScrollBar?

Und wegen dem Layout: naja wie soll's ich denn jetzt machen? TableLayout gibt es ja nicht. Kannst du mir vllt explizit sagen, welches Layout du da benutzen würdest?

vielen dank
 

0x7F800000

Top Contributor
hdi hat gesagt.:
Okay, JScrollPane soll's also sein ;) Danke dass du mir Arbeit erspart hast.
Die Kristallkugel sei Dank^^

Nur so: Ist das ScrollPane schon selbst ein Fenster oder adde ich das dem Frame wie auch zB ein Button oder eben JScrollBar?
nein, JScrollPane ist erstmal ein JComponent (wenn du es genauer wissen willst, lohnt sich doch ein blick in die API ;) )
D.h. du musst ein fenster aufmachen, und das JScrollPane da einfügen. Allerdings nicht direkt ins fenster sondern auf die content pane vom fenster (JFrame ist ein recht vielschichtiges gebilde, der Inhalt sollte mit myFrame.getContentPane().add(whatever) hinzugefügt werden.

Und wegen dem Layout: naja wie soll's ich denn jetzt machen? TableLayout gibt es ja nicht. Kannst du mir vllt explizit sagen, welches Layout du da benutzen würdest?
Gibts nicht? Da ist google anderer Meinung: https://tablelayout.dev.java.net/
Wie gesagt, hab's selbst nicht ausprobiert, aber es wurde mal empfohlen. Ausserdem habe ich mir irgendwann aus WUT auf den GridBagLayout einfach selbst einen simplen Layout-manager gebastelt, der auf der selben idee wie dieser TableLayout basierte, nur nicht so flexibel war (Meiner hieß "MondrianLayout" weil sich damit prima Bilder von Mondrian nachahmen ließen :) )

Was ich selbst benutzen würde kann ich dir nicht sagen: alles was meine momentanen Java-programme ausspucken sind meistens xslt-transformierte css-formatierte xhtml-webseiten, daher jucken mich die ganzen Java-GUI-Layouts momentan eh nicht sonderlich ;)

*edit: sollte der unwahrscheinliche Fall eintreten, dass MondrianLayout irgendjemanden was sagt: das war nicht meiner, meinen hab ich nur ausschließlich für mich verwendet^^ aber ich hoffe mal, der name war origenell genug :p Aber könnte ja trotzdem sein, ist irgendwie doch naheliegend...
 

hdi

Top Contributor
Andrey hat gesagt.:
sollte der unwahrscheinliche Fall eintreten, dass MondrianLayout irgendjemanden was sagt...

JUNGE? dieses lustige zeichen mit dem c in der mitte und einem kreis drum rum kennste aber schon oder? mein anwalt setzt sich mit dir in Verbindung!

Nein also mal b2t:

TableLayout scheint ja keine Standard-Klasse zu sein sondern ein Projekt von irgendwem, so wie's aussieht.

Ich möchte gerne erstmal mehr Basics von Java lernen bevor ich mit individuellen Packages rumtu.

Es kann ja wohl nich so schwer sein, ein Fenster zu machen was eine JTextArea enthält und ein ScrollPane?
Das sind ja nur 2 Elemente, mit irgendeinem Standard-Layout wird man die ja wohl ordentlich setzen können?
 

0x7F800000

Top Contributor
naja, für scrollende JTextArea brauchst du echt nicht viel mit layout-Managern zu tun, denn genau in dem Fall reicht ja, dass alles auf volle fenstergröße gestreckt wird ;)
 

hdi

Top Contributor
ja ne, die scrollpane wird auf fenstergrösse gestreckt! d.h. die textarea liegt dahinter, man sieht nix!
 

0x7F800000

Top Contributor
ich dachte die TextArea sollte eher "darin" und nicht "dahinter" liegen. Nur die scroll pane legst du auf die contentPane vom Fenster, die TextArea fügst du entsprechend in das scroll pane ein.
 

hdi

Top Contributor
also irgendwie versteh ich das nicht, ich hab's jetzt so gemacht:

Code:
    public Console() {
        
        setTitle("Log Console");
        setPreferredSize(new Dimension(400, 250));
        setResizable(false);
        setAlwaysOnTop(true);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        scroller = new JScrollPane();
        scroller.setAutoscrolls(true);
        scroller.setPreferredSize(new Dimension(20, 100));
        getContentPane().add(scroller);
        
        ta = new JTextArea();
        ta.setBackground(Color.black);
        ta.setForeground(Color.orange);
        ta.setFont(new Font("Courier", Font.PLAIN, 11));
        scroller.add(ta);

        pack();
        setVisible(true);
    }

aber es geht halt nicht, das ScrollPane nimmt den ganzen Platz weg, egal was ich bei der grösse einstelle,
und die TextArea wird nicht angezeigt.
 

0x7F800000

Top Contributor
Bringt evtl was, bei TextArea im konstruktor was für rows und columns anzugeben, statt den leeren konstruktor aufzurufen.

edit: hmm, moment, ich probiers grad aus...
 

0x7F800000

Top Contributor
Code:
import javax.swing.*;
import java.awt.*;

public class Console extends JFrame{
	
	JTextArea ta;
	
	public Console() {
	       
        setTitle("Log Console");
        setPreferredSize(new Dimension(400, 250));
        setResizable(false);
        setAlwaysOnTop(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        ta = new JTextArea(40,20);
        ta.setBackground(Color.BLACK);
        ta.setForeground(Color.ORANGE);
        ta.setFont(new Font("Courier", Font.PLAIN, 11));
        ta.setText("Hallo hdi^^");
        
        JScrollPane scroller = new JScrollPane();
        scroller.setViewportView(ta);
        getContentPane().add(scroller);

        pack();
        setVisible(true);
    }
	
	public static void main(String[] args) {
		new Console();
	}
}

Dieses JScrollPane ist auch ein ziemlich komplizierter brocken, statt mit add() müsstest du mit setViewportView das zu scrollende Component angeben.

Außerdem finde ich nicht sehr schön, dass du das fenster automatisch sichtbar machst. Dadurch verhält es sich nicht als eine Abgeleitete Klasse von JFrame, sondern eher als irgendein Prozess, der von selbst losrennt...

Achso, an dem code habe ich da irgendwas umgedreht, nicht einfach so kopieren bitte, da ist einiges abgeändert, was ich zum testen einfacher fand...
 

hdi

Top Contributor
ah ok, prima es geht wunderbar :)

ich hab jetz nur noch eine frage, und zwar erscheint die scrollbar erst wenn mehr text enthalten ist als ins fenster passt. Das ist natürlich sinnig und auch nett, aber mir geht es immer darum, die Klassen weitmöglichst zu verstehen und ihre Methoden zu kennen.

Ich hab jetz rumgekuckt und gesucht, aber dahingehend nix gefunden: kann ich denn nicht einstellen, dass diese Scrollbars schon da sind, auch wenn man noch nicht scrollen kann? Also grau markiert halt dann? Und erst bedienbar werden, wenn der Text den Rahmen sprengt?

hatte mir alle Methoden angekuckt die mir netbeans vorschlägt wenn ich mach:

Code:
scroller.getVerticalScrollBar().

hab dazu nix gefunden, setEnabled() und setVisible() machen das jedenfalls nicht. Oder suche ich an der falschen
Stelle, und das ist eine Einstellung vom scroller, und nicht der ScrollBar selbst? Aber auch hier find ich dazu nix

edit:

ach und noch etwas, diesmal sogar mit etwas sinn ;) ich hab beim scrollpane setAutoScrolls(true) gemacht, trotzdem verfolgt er neuen Text in der TextArea nicht. D.h. zwar die ScrollBar passt sich korrekt an usw, aber sie hüpft nicht automatisch mti den neuen Einträgen mit (heisst: wenn man nix weiter macht, sieht man immer die ersten paar Einträge und nur, wie sich die Liste verlängert (angezeigt durch die Scrollbar), der Inhalt geht aber nicht mit... Wie mach ich das?
 

hdi

Top Contributor
hey, ja dankeschön :)

damit es nicht untergeht: hab schon wieder eine weitere frage (im oberen post per edit eingefügt)
 

hdi

Top Contributor
Super, danke für die Mühe die du dir machst :) Man gibt ja sein bestes, aber man kann/will halt auch nicht unbedingt ein riesen tutorial genauestens durchlesen, wenn man jetzt etwas bestimmtes wissen will.

wenn man keine Ahnung von der Materie hat versteht man 50% sowieso nicht oder überliest es einfach weil man nicht weiss dass es wichtig ist.

Naja... aber ich hab jetzt ein Problem:
Das Autoscrolling funktioniert... so la la. Nicht richtig, irgendwie.

Ich denke dass hat jetzt mit meinem kompletten Programm zu tun.

Die Console (Frame), indem jetzt eben dieses ScrollPane + TextArea ist, ist nämlich ein Observer
von einem Log. Immer, wenn ein neuer Eintrag kommt, wird also die update() Methode aufgerufen.

Und bei mir sieht die in der Console jetzt eben so aus:

Code:
    public void update(Observable o, Object arg) {

        ta.append(Log.getLast() + "\n");    // ta = JTextArea
        JScrollBar autoscroll = scroller.getVerticalScrollBar();   // scroller = JScrollPane
        autoscroll.setValue(autoscroll.getMaximum());
    }

Das ganze funktioniert wie gesagt sehr sehr lahm.. Ich habe zum Test einen Thread der alle 2 sec
eine neue Nachricht addet.

Erstens mal geht die ScrollBar nie ganz nach unten, sondern immer ans vorletzte Element, nicht ans letzte. Komisch, denn ich update das ja NACHDEM ich einen neue Nachricht einfüge.

Zweitens hängt die ScrollBar oft einige Nachrichten hinther, sprich es werden zB 3 NAchrichten geaddet, und dann plötzlich zieht er nach..

Was stimmt denn da nicht? Ich meine es kann ja nicht sein, dass da der PC nicht hinterherkommt ^^ In 2 Sekunden sollte er das eig. schon schaffen. Ist irgendwie strange.

Ich hab zu Testzwecken auch mal das hier gemacht:

Code:
    public void update(Observable o, Object arg) {

        ta.append(Log.getLast() + "\n");    // ta = JTextArea
                System.out.println("message kommt rein...");
        JScrollBar autoscroll = scroller.getVerticalScrollBar();   // scroller = JScrollPane
        autoscroll.setValue(autoscroll.getMaximum());
                System.out.println("scrollbar aktualisiert");
    }

und die 2 nachrichten kommen simultan. Ich kann mich noch dran erinnern dass ich schon öfters Stress hatte mit dem AWT Event Dispatcher und diesen Dingen.
Ich hab's auch schon mit einem "repaint()" am Ende des update-Methode versucht -> kein Ergebnis.

Was ist da Faul, wieso ist das so langsam? Hängt das mit dem Observer zusammen? die Methode synchronizen lässt btw das komplette Programm einfrieren, obwohl es nur einen Thread gibt und keine Deadlocks entstehen können. Denke das liegt auch am Observer.

Naja...ne Idee?

Und danke nochmal
 

0x7F800000

Top Contributor
Khm... Spontan: keine Ahnung! Dass du hier Model-View mit dem Observer-Pattern löst finde ich vorbildlich schön und gut, allerdings gefällt mir folgendes nicht so ganz: bereits in der update() methode schraubst du am ScrollBar herum. Womöglich führt es dazu, dass der Inhalt im TextArea verändert wird, jedoch schafft TextArea nicht, die neue Länge zu berechnen und die Änderung an JScrollPane weiterzumelden. Folge: JScrollBar weiß noch gar nicht, dass er länger werden soll, aber schon befiehlst du explizit ganz nach unten zu scrollen. Erst wenn das alles erledigt ist, kommen beim JScrollPane die meldungen an, dass die Länge des JTextAreas sich verändert hat, aber das bringt ja nichts mehr, die letzte Zeile bleibt unsichtbar.

Ich würde daher folgendes vorschlagen:
Regele das automatische weiterscrollen nicht direkt in der update()-methode, sondern separat in einem Listener, der an der TextArea hängt, etwa irgendwie so:
Code:
ta.addCaretListener(new CaretListener(){
        	public void caretUpdate(CaretEvent e){
        		scroller.getVerticalScrollBar().setValue(
        		scroller.getVerticalScrollBar().getMaximum());
        	}
        });
Dadurch sollten keine chronologische ungereimtheiten mehr auftreten, hoffe ich mal. Allerdings bin ich nicht sicher, ob ausgerechnet der CaretListener was meldet, wenn Text hinzugefügt wird, das musst du entweder schon selber schauen (text area hat da 42348 verschiedene Listener) oder zumindest mal hier ein compilierbares stück code posten, an dem man das ausprobieren kann ;)
 

hdi

Top Contributor
hm funktioniert leider auch nicht.

Hier mal mein Code:
_________________________________________________________________

Code:
import java.awt.EventQueue;

public class Main {

    public static void main(String[] args) {

        /* zur Event-Queue:
         * [url]http://java.sun.com/docs/books/tutorial/uiswing/concurrency/initial.html[/url]
         * [url]http://java.sun.com/docs/books/tutorial/uiswing/concurrency/dispatch.html[/url]
         * */

        EventQueue.invokeLater(new Runnable() {

            public void run() {

                new TestThread().start();
            }
        });

    }
}
_________________________________________________________________

Code:
import java.util.ArrayList;
import java.util.Observable;

/* Log ist eine statische Klasse, die eine Liste von
 * LogEntries enthält. Statisch deshalb, damit sie von 
 * ueberall aus dem Programm, egal welcher Klasse und Methode,
 * aufgerufen werden kann, ohne erst jeder Klasse eine Instanz
 * geben zu muessen o.ae.
 * Der Log ist Observable, weil die Konsole alle Aenderungen
 * des Logs in Echtzeit mitbekommen und bearbeiten soll. */
public class Log extends Observable {

    /* Der einzige Log wird hier gleich statisch erstellt: */
    public static final Log LOG = new Log();
    private ArrayList<LogEntry> list;

    public Log() {
        list = new ArrayList<LogEntry>();
        /* Die Konsole ueberwacht den Log: */
        this.addObserver(new Console());
    }

    public static void add(String message) {
        LOG.list.add(new LogEntry(message));
        /* Wir geben der Konsole Bescheid: */
        LOG.setChanged();
        LOG.notifyObservers();
    }

    /* wird von der Konsole aufgerufen, und zwar jedesmal
     * wenn sie eine Benachrichtung erhaelt, wenn also
     * ein neuer Eintrag gemacht wurde. Genau diesen holt sie
     * sich mit dieser Methode, damit sie ihn anzeigen kann*/
    public static String getLast() {
        return LOG.list.get(LOG.list.size() - 1).getLogEntry();
    }
}
_________________________________________________________________

Code:
import java.text.SimpleDateFormat;
import java.util.Date;

/* Ein LogEntry ist nichts anderes als ein String.
 * Die Klasse bastelt im Konstruktor aus einer gegebenen 
 * Log-Nachricht eine erweiterte Nachricht, die fuer das
 * Debugging nuetzliche, zusaetzliche Infos enthaelt:
 * Die Klasse+Methode, die den Eintrag in den Log erstellt,
 * die Zeilenummer in der das passiert und die Zeit des 
 * Aufrufs.
 * Das Ergebnis ist dann die FORMATTED_MESSAGE.
 * */
public class LogEntry {

    private final int BLANK_AMOUNT_STANDARD = 20;
    private final String FORMATTED_MESSAGE;

    public LogEntry(String message) {

        /* Wir nutzen den StackTrace, um die zusaetzlichen Infos
         * herauszufinden: */
        StackTraceElement ste = Thread.currentThread().getStackTrace()[3];

        String className = ste.getClassName().split("\\.")[1];
        String methodName = ste.getMethodName();
        String line = "" + ste.getLineNumber();
        String time = new SimpleDateFormat("mm:ss").format(new Date());

        /* Hier wird jetzt der individuelle Abstand zwischen 
         * Zustatz-Infos und eigentlicher Nachricht erstellt */
        int steLength = className.length() + methodName.length() + line.length();
        int numBlanks = BLANK_AMOUNT_STANDARD - steLength;
        String blanks = new String();
        while (numBlanks > 0) {
            blanks = new String(blanks.concat(" "));
            numBlanks--;
        }

        /* Alle Infos gesammelt, jetzt den kompletten LogEntry erstellen: */
        FORMATTED_MESSAGE = time + " " + className + ":" + methodName +
                "(" + line + ")" + blanks + "> " + message;
    }

    public String getLogEntry() {

        return FORMATTED_MESSAGE;
    }
}
_________________________________________________________________

Code:
import java.awt.Dimension;
import java.util.Observable;
import java.util.Observer;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.JFrame;


/* Die Konsole ist ein scrollbares Fenster, dass waehrend
 * der Laufzeit in Echtzeit alle Log-Eintrage auflistet. 
 * Damit sie das kann, implementiert sie Observer.
 * (Der Log hat sie als Observer geaddet).
 * */

public class Console extends JFrame implements Observer {

    private Console_TextArea ta;
    private Console_ScrollPane scroller;

    public Console() {
        /* Grundeinstellungen des Fensters: */
        setTitle("Log Console");
        setPreferredSize(new Dimension(450, 300));
        setResizable(false);
        setAlwaysOnTop(true);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        /* Wir basteln uns nun den Bereich im Fenster,
         * in dem alle Nachrichten angezeigt werden sollen:*/
        ta = new Console_TextArea();
        ta.addCaretListener(new CaretListener(){
           public void caretUpdate(CaretEvent e){
               System.out.println("listener");
              scroller.getVerticalScrollBar().setValue(
              scroller.getVerticalScrollBar().getMaximum());
           }
        });

        scroller = new Console_ScrollPane(ta);
        save = new Console_SaveButton(ta);

        getContentPane().add(scroller);


        pack();
        setVisible(true);
    }

    /* Wird vom Log aufgerufen, wenn eine neue Nachricht im Log ist.
     * Wir fuegen diese neue Nachricht einfach in die TextArea ein,
     * und zwar in eine neue Zeile: 
     * */
    public void update(Observable o, Object arg) {

        /* Nachricht einfuegen: */
        ta.append("\n" + Log.getLast());
    }
}
_________________________________________________________________

Code:
import java.awt.Color;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;

public class Console_ScrollPane extends JScrollPane {

    public Console_ScrollPane(Console_TextArea ta) {

        setVerticalScrollBarPolicy(VERTICAL_SCROLLBAR_ALWAYS);
        setViewportView(ta);
        setAutoscrolls(true);
        setWheelScrollingEnabled(true);
        getVerticalScrollBar().setBackground(Color.black);
    }
    
    public JScrollBar getBar(){
        return this.getVerticalScrollBar();
    }
}
_________________________________________________________________

Code:
import java.awt.Color;
import java.awt.Font;
import javax.swing.JTextArea;

public class Console_TextArea extends JTextArea {

    public Console_TextArea() {

        setText("- CONSOLE INITIALIZED -");
        setEditable(false);
        setBackground(Color.black);
        setForeground(Color.orange);

        /* Bitte nur Monotype Schriftarten verwenden */
        setFont(new Font("Courier", Font.PLAIN, 11));
    }
}
_________________________________________________________________

Code:
import java.util.logging.Level;
import java.util.logging.Logger;

class TestThread extends Thread{

    public TestThread() {

    } 
    @Override
    public void run(){

        while(true){
            Log.add("adde neue nachricht..");
            try {
                Thread.sleep(600);
            } catch (InterruptedException ex) {
                Logger.getLogger(TestThread.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}
_________________________________________________________________


So, das wär's. Mir ist gestern Nacht auch noch eingefallen, dass da einfach zu viele Dinge gleichzeitig
laufen, ich meine Observer, AWT Event Dispatcher etc sind ja alles Dinge, die sich selbst organisieren.
Man hat da kaum Einfluss drauf wie was wann genau passiert. Das sind zumindest bisher meine
Erfahrungen damit...

Aber an der Lösung des Problems bin ich stark interessiert, denn dann würd ich mal richtig verstehen
wie diese ganzen komplexen Konstrukte, die man in Java mal eben in nem Einzeler hinhaut, intern
funktionieren.

Bin für jede Hilfe dankbar :)
 

0x7F800000

Top Contributor
bwaa, das nenn ich mal ein kleines übersichtliches beispielprogrammchen ;)
Meldet der "listener" denn etwas, wenn neue meldungen dazukommen?

edit:Und noch was: ich finde das nicht so sinnvoll, zig neue Klassen zu erstellen, die eigentlich nichts neues machen, sondern lediglich die standardeinstellungen von bereits existierenden Klassen abändern. Da kommt ja an Funktionalität nichts hinzu, und code Sparst du dir damit auch nicht... [/b]
 

hdi

Top Contributor
ne der listener meldet eben nicht immer, fast nie sogar. (bei meinem test nur am anfang einmal dann gar nicht mehr).

naja ich finds schon besser ne klasse zu machen für so dinge.. denn die console hat eig. nix damit zu tun und soll sich auch nicht damit "belasten" jetzt irgendwelche einstellungen von komponenten vorzunehmen, die sie anbietet.

da mach ich lieber ne kleine mini-klasse die fast nix neues macht, und hab dann in der console nur eine anweisung:

new My_scrollpane();

als halt ne JScrollPane zu erstellen und da dann anfangen ewig rumzubasteln.

tja, zum thema: keine ahnung, der listener meldet wie gesagt nicht. was auch immer dafür genau zuständig ist (AWT dispatcher?), kommt wohl nich zum zug. liegt vllt echt am observer kA..
 

0x7F800000

Top Contributor
ne, das liegt wohl einfach an dem falschen listener, der caretListener ist eher für bewegungen des carets verantwortlich, das ist ja nicht das was man hier braucht, aber hey: ich blick in dem dschungel grad auch nicht durch, kA welcher listener das sein soll :(
ich schau nochmal...
 

0x7F800000

Top Contributor
aaah... ich glaub ich hab's:
Java API hat gesagt.:
In the JTextComponent based components, changes are broadcasted from the model via a DocumentEvent to DocumentListeners. The DocumentEvent gives the location of the change and the kind of change if desired. The code fragment might look something like:

DocumentListener myListener = ??;
JTextArea myArea = ??;
myArea.getDocument().addDocumentListener(myListener);

Jetzt wird mir auch klar, warum ich keinen listener gefunden hab, den man an dieses textarea dranhängen könnte... es gibt keinen^^ Stattdessen gibts dieses dokument-veränderungs-listener, versuch's mal damit, das müsste so doch endlich mal fuktionieren!
 

hdi

Top Contributor
EDIT 2:



vergesst alles was ich gesagt habe, ich hab die lösung doch nicht :( funktioniert alles nicht.
bei documentlistener stürtzt das prog btw ab wenn ich versuch die scrollbar zu verändern...

keine ahnung mehr ???:L im prinzip hat ja die erste lösung funktioniert, und sollte sie ja auch.
aber warum so langsam, ich check das alles nicht.

ist schon extrem hart für anfänger (und ich glaube auch für richtig gute leute) diese ganzen abläuft etc
die in java zur laufzeit passieren, zu verstehen oder überhaupt zu wissen, wie das gemacht wird.

ich hab zumindest nicht den blassesten dunst davon, wie was wann genau gemacht wird. ich weiss nur
dass alle Elemente in Java sich selbst organisieren , mit diesen ganzen Listenern und dem Zeug, aber
wer weiss schon wirklich was man da tut?

Ich nicht :bahnhof:
 

hdi

Top Contributor
okay also ich denke schön langsam blickt keiner mehr durch.

Die Frage ist nach wie vor:

Wieso funktioniert dieser Code:

Code:
 scrollPaneBar.setValue(scrollPaneBar.getMaximum());

so lahm, bzw. oft (d.h. für etwa 50+ geaddete Nachrichten) gar nicht ?

Die Beobachtung, dass es manchmal ganz gut klappt, manchmal eher schlecht (d.h. Reaktion erst 10 oder mehr
NAchrichten zu spät), und machnmal sogar überhaupt gar nicht, lässt ja darauf schliessen dass heir scheinbar irgendwelche Vorgänge, die Java intern verwaltet, nicht miteinander klar kommen und sich gegenseitig stören.

Die Kombi AWT Dispatcher, der Sachen zeichnet und Fenster verwaltet (ist das so?) und ein Observer scheint
hier wohl ein Problem zu sein..

Allerdings ist das jetzt nicht unbedingt eine Sache, die man überhaupt nicht gebrauchen kann.
Man hat oft Fenster, die Autoscroll haben während neue Infos reinkommen, zB auch mein netbeans
in der Laufzeit (bei System.out.print-Meldungen). Da gibt es ja auch eine ScrollBar und die wandert immer exakt
und flott mit.

Wo liegt hier der Hund begraben? Ich würde das wirklich gerne lösen, denn es nervt schon wenn man
nicht weiss, wie Java etwas handlet wenn man etwas bestimmtes implementiert (zB eben Observer mit sowas)...
 

0x7F800000

Top Contributor
Oh Mensch, hdi, du desillusioniert mich ja total^^ Früher dachte ich, dass ich das alles halbwegs verstanden hätte, jetzt weiß ich aber sicher, dass ich eigentlich doch keinen Plan habe :)

Also, ich hab's jetzt mit den ganzen Listenern ausprobiert, die reagieren auf NICHTS :x bzw ich hab jetzt letztendlich keinen passenden gefunden.

Ich habe es auch mit dem direkten setzen auf maximum versucht, habe festgestellt dass das idiotische scrollbar-dings dauernd 20-30 "abstrakte einheiten" nachhinkt, also tatsächlich nie die letzte zeile zeigt, was ich absolut nicht nachvollziehen kann. :( :roll:

Allerdings habe ich eine andere (imho weniger naheliegende Lösung) ausprobiert, die mit setCaretPosition(text.length()) funktioniert:
Code:
import javax.swing.*;
import java.awt.*;

public class Console extends JFrame{
	
	JTextArea ta;
	JScrollPane scroller;
	
	public Console() {
	       
        setTitle("Log Console");
        setPreferredSize(new Dimension(400, 250));
        setResizable(false);
        setAlwaysOnTop(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        ta = new JTextArea();
        ta.setBackground(Color.BLACK);
        ta.setForeground(Color.ORANGE);
        ta.setFont(new Font("Courier", Font.PLAIN, 11));
        
        scroller = new JScrollPane();
        scroller.setViewportView(ta);
        getContentPane().add(scroller);
        
        pack();
        setVisible(true);
        
        (new BlahThread()).start();
    }
	
	private class BlahThread extends Thread{
		public void run(){
			while(true){
				ta.append("\nblah... "+System.currentTimeMillis());
				ta.setCaretPosition(ta.getText().length());
				try{
					sleep(456);
				}catch(InterruptedException e){
					e.printStackTrace();
				}
			}
		}
	}
	
	public static void main(String[] args) {
		new Console();
	}
}

Also, irgendwie nervt mich das auch mittlerweile gewaltig. Ich wüsste jetzt auch mal gerne, wie dieser Tipp in der Insel (und auch aus den Foren von Sun) gemeint war, wenn er doch nicht funktioniert ???:L
 

hdi

Top Contributor
Wow, funktioniert prächtig :applaus:
Vielen Dank!

Man müsste mal irgendwie eine Seite finden, in der Sun mal genau beschreibt wie Java intern arbeitet.
Ich meine dass alles so leicht geht und sich selbstständig organisiert etc ist ja ganz nett, aber wie man
sieht hat es auch Nachteile. Man hat keinen Einfluss drauf, und jetzt soll mal einer hergehen, und sagen er findet
es total logisch und sonnenklar, dass es mit CaretPosition der TextArea geht aber nicht mit dem ScrollPane...

Man braucht mal eine Abarbeitungsreihenfolge bzw. den Scheduler der da verwendet wird, um ordentlich
programmieren zu können und nicht nur rumzuprobieren, wie wir es jetzt gemacht haben :/

Naja das ist jetzt zumindest endlich gelöst, auch wenn ich's nicht verstehe, aber das muss ja keiner wissen ;)

Danke nochmal für deine Bemühungen =)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Grösse von Logfiles Java Basics - Anfänger-Themen 23
D Grösse eines JPanel hinsichtlich LayoutManager festlegen Java Basics - Anfänger-Themen 4
M ArrayList mit einer Grösse definieren Java Basics - Anfänger-Themen 9
S Jpanel - Grösse ändern Java Basics - Anfänger-Themen 5
M JTable grösse verändern Java Basics - Anfänger-Themen 6
J Button Grösse festlegen Java Basics - Anfänger-Themen 3
F Grösse JTextField verändern Java Basics - Anfänger-Themen 2
G button grösse lässt sich nicht verstellen Java Basics - Anfänger-Themen 9
N Grösse eines Image ändern? Java Basics - Anfänger-Themen 4
C ArrayListen in einer ArrayList der Grösse nach sortieren Java Basics - Anfänger-Themen 5
G Grösse eines JLabels Java Basics - Anfänger-Themen 7
C Fenster grösse festsetzen? Java Basics - Anfänger-Themen 2
U JFrame auf volle Grösse des Monitors Java Basics - Anfänger-Themen 6
L px und x-position Java Basics - Anfänger-Themen 4
ptcho Werte/Position nach dem Funktionsaufruf tauschen? Java Basics - Anfänger-Themen 1
F wie kann ich die Position des letzten Vokals innerhalb einer Zeichenkette ermitteln? Java Basics - Anfänger-Themen 5
G Position einer unbekannten 3-stelligen-Zahl in einem String finden Java Basics - Anfänger-Themen 15
I 2D-Array Position der Liste ausgeben. Java Basics - Anfänger-Themen 2
JD_1998 Array-Position aus einer Methode in einer anderen ausgeben (Kurze Frage) Java Basics - Anfänger-Themen 2
J Itext-Paragraph Position ändern Java Basics - Anfänger-Themen 13
B Berechnung der Position von Kinderelemente von einem Elternknoten Java Basics - Anfänger-Themen 23
J Eine Position im String durch einen Integer - Wert teilen Java Basics - Anfänger-Themen 5
J Java GUI- Objekte Position per Quelltext bestimmen Java Basics - Anfänger-Themen 4
S suche nach varible POSITION ... fuer das pixel-maennchen Java Basics - Anfänger-Themen 4
I Eigenschaften von Position aus anderer Klasse übernehmen Java Basics - Anfänger-Themen 17
Anica Processing Animation Bild-Position ändern Java Basics - Anfänger-Themen 9
H Position verschieben der Elemtente im Array Java Basics - Anfänger-Themen 3
J Eingabe des Scanners an einer bestimmten Position Java Basics - Anfänger-Themen 6
S Position eines Frames Java Basics - Anfänger-Themen 3
S Einfach verkettete Liste Element an bestimmter Position einfügen Java Basics - Anfänger-Themen 24
T Arrayposition um eine Position verschieben Java Basics - Anfänger-Themen 2
V Klassen Bestimmen Sie die erste und letzte Position an der ein 'c' steht? Java Basics - Anfänger-Themen 3
R Position einer Ziffer in einer Zahlenkette Java Basics - Anfänger-Themen 5
V Datentypen Position mit Int und Float berechen und ausgeben Java Basics - Anfänger-Themen 5
Z Wie Position eines Objekts in Liste herausfinden? Java Basics - Anfänger-Themen 15
C Position eines Zeichens in einem String ausgeben Java Basics - Anfänger-Themen 1
J Buchstabe (char) an zufällige Position eines Strings einfügen Java Basics - Anfänger-Themen 1
C [Greasmonkey] Maus Coursor position setzen Java Basics - Anfänger-Themen 1
I Int Array, Zahl an bestimmte position setzten Java Basics - Anfänger-Themen 2
S Bild auf eine Position rotieren?! Java Basics - Anfänger-Themen 4
O Position des Buttons wird nicht geändert.. Java Basics - Anfänger-Themen 6
H Cursor-Position bei Rechtsclick? Java Basics - Anfänger-Themen 2
D 2 Fragen: Position ändern vs. LayoutManager / Bilder einfügen im Vordergrund Java Basics - Anfänger-Themen 3
S Maus Position Java Basics - Anfänger-Themen 6
A Eine Datei Lesen und bestimmte Position überschreiben Java Basics - Anfänger-Themen 2
S JSplitPane Divider Maximum Position Java Basics - Anfänger-Themen 5
W Position in ArrayList ermitteln Java Basics - Anfänger-Themen 4
M kurze frage: Ohne index.of position von string angeben Java Basics - Anfänger-Themen 16
M Input/Output position in temporären dateien kann nicht gesetzt werden Java Basics - Anfänger-Themen 3
E Y-Position der Maus nehmen Java Basics - Anfänger-Themen 5
R mit DefaultStyledDocument die Caret-Position ändern? Java Basics - Anfänger-Themen 5
V Position in einem Vektor Java Basics - Anfänger-Themen 3
M LinkedList aktuelle position Java Basics - Anfänger-Themen 3
E Position erkennen und überlappungen feststellen Java Basics - Anfänger-Themen 4
M Fixe Position von GUI Komponenten ? Java Basics - Anfänger-Themen 9
B JMenu Position bestimmen Java Basics - Anfänger-Themen 7
H B-Baum: Knoten Position als Parameter oder als Variable im Objekt? Java Basics - Anfänger-Themen 4
TheKing Spieler Position mit Array vergleichen Java Basics - Anfänger-Themen 2
T Image Position erkennen Java Basics - Anfänger-Themen 6
L die Position von Suchtreffern von Lucene finden Java Basics - Anfänger-Themen 2
S Datentypen In ArrayList nach Element suchen und Position ausgeben Java Basics - Anfänger-Themen 9
K Kreis mit neuer Position zeichnen Java Basics - Anfänger-Themen 3
S OOP Wie bei Spiel "17+4" eine Karte an bestimmte Position hinzufügen Java Basics - Anfänger-Themen 13
M Zufällige Position Java Basics - Anfänger-Themen 3
A Elemente 2er int[] auf Gleichheit und Position überprüfen Java Basics - Anfänger-Themen 7
M Position des BufferedReader Java Basics - Anfänger-Themen 6
J Programm-Fesnter Position Java Basics - Anfänger-Themen 4
O Maus / Pixel Position bei mir und bei anderen. Java Basics - Anfänger-Themen 8
F Position JTextField Java Basics - Anfänger-Themen 4
B aktuelle Position einer JTextArea ermitteln Java Basics - Anfänger-Themen 6
C Position eines Fensters bestimmen Java Basics - Anfänger-Themen 3
H problem mit button position Java Basics - Anfänger-Themen 4
G Bestimmte Position im array auslesen Java Basics - Anfänger-Themen 8
M Array, Int-wert Ziffer je Position zuweisen Java Basics - Anfänger-Themen 3
B String vom Server nach Position... (erledigt) Java Basics - Anfänger-Themen 6
H Exception: illegal component position Java Basics - Anfänger-Themen 5
G Position eines Objekts auf Webseite herausfinden Java Basics - Anfänger-Themen 9
G TrayIcon: Wie aktuelle Position des Icons erhalten? Java Basics - Anfänger-Themen 2
D Fensterrahmen und Position ändern. Java Basics - Anfänger-Themen 5
M Maus position abfragen und setzen? Java Basics - Anfänger-Themen 1
G Position Java Basics - Anfänger-Themen 7
R Position in ArrayList ermitteln Java Basics - Anfänger-Themen 5
R Element an Position in ArrayList checken Java Basics - Anfänger-Themen 4
D Dateizugriff - An bestimmter Position Lesen (Random Access) Java Basics - Anfänger-Themen 2
H Finde Position Java Basics - Anfänger-Themen 4
J mouseover Text => Bildanzeige an bestimmter Position.Wie Java Basics - Anfänger-Themen 2
B Position einer Ziffer im String bestimmen Java Basics - Anfänger-Themen 4
T Zeichen eines Strings an festgelegter Position einfügen Java Basics - Anfänger-Themen 8
J Jedes Element in 2 Arrays mit gleicher Position addieren Java Basics - Anfänger-Themen 12
C Absolute Cursor Position oder doch relative? Java Basics - Anfänger-Themen 4
L Gezielte Infos aus Datei holen - Suche nach Position/Wort Java Basics - Anfänger-Themen 22
M Servlet position bestimmen Java Basics - Anfänger-Themen 3
T aktuelle Position in einer Datei Java Basics - Anfänger-Themen 4
B String in ein RandomAccessFile einfügen (bestimmte Position) Java Basics - Anfänger-Themen 4
bernd An der Position des Cursors String einfügen Java Basics - Anfänger-Themen 11
C Position im Objekt-Stream Java Basics - Anfänger-Themen 2
G x-,y-position java-applet Java Basics - Anfänger-Themen 2
StrikeTom JScrollBar horizontal Java Basics - Anfänger-Themen 5
O JScrollPane , JScrollBar Java Basics - Anfänger-Themen 3
J JScrollBar JScrollPane Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben