Auf Einblenden von Scrollbars reagieren

Status
Nicht offen für weitere Antworten.

Tobias

Top Contributor
Hi,

ich möchte darauf reagieeren können, wenn eine JScrollPane beschließt, dass es an der Zeit ist, ScrollBars einzublenden. Hat jemand eine zündende Idee?

mpG
Tobias
 
Code:
...
        ComponentListener componentListener = new ComponentListener() {
            public void componentHidden(ComponentEvent e) {
                checkScrollbar(e.getComponent(), false);
            }
            public void componentMoved(ComponentEvent e) {
            }
            public void componentResized(ComponentEvent e) {
            }
            public void componentShown(ComponentEvent e) {
                checkScrollbar(e.getComponent(), true);
            }
        };
        jScrollPane1.getVerticalScrollBar().addComponentListener(componentListener);
        jScrollPane1.getHorizontalScrollBar().addComponentListener(componentListener);
...
    private void checkScrollbar(Component component, boolean shown){
        if(component instanceof JScrollBar){
            JScrollBar scrollbar = (JScrollBar)component;
            if(scrollbar.getOrientation() == JScrollBar.VERTICAL){
                if(shown)
                    System.out.println("Vertical scrollbar shown");
                else
                    System.out.println("Vertical scrollbar hidden");
            }else{
                if(shown)
                    System.out.println("Horizontal scrollbar shown");
                else
                    System.out.println("Horizontal scrollbar hidden");
            }
        }
    }
...
 
Tja, Pustekuchen...

Also, obige Lösung ist zwar richtig und sah auch toll aus, aber sie passt nicht auf mein Vorhaben:

Ich schreibe ein Programm, das besonders auch auf Touchscreens optimiert wird. Deshalb brauche ich größere Knöpfe zum Hoch- und Runterscrollen. Siehe Screenshot:

scroll.gif


Die Scroll-Buttons sollen dynamisch eingeblendet werden, wenn sie notwendig sind - deshalb will ich darauf reagieren, wenn die JScrollPane beschließt, dass Scrollbars notwendig sind. Da die Scrollbars an sich aber nicht angezeigt werden sollen, hat die Scrollbar die Vertical-/HorizontalScrollbarPolicy NEVER - was unter anderem dazu führt, das der ComponentListener niemals über das Einblenden der Scrollbars informiert wird - es findet schließlich nicht statt.

Was tun?

mpG
Tobias
 
Nimm ne JList, überschreibe dir den ListCellRenderer und gib JButtons zurück und sag dann ensureIndexIsVisible(getSelectedIndex()) bei jedem Button druck!

Und dann hast du das von dir gewünschte Ergebnis 😉
 
Mh, interessante Idee, aber eher nicht das richtige für mich. Die Navigation (also der Inhalt der ScrollPane) steht ja bereits und soll auch nicht mehr verändert werden.

mpG
Tobias
 
@Tobias: ne Kollegin von mir hat das auch mit nem Touchscreen und auch sowas was du willst!

Und die hat das so gemacht, da es der elleganteste Weg ist 😉 (und auch nicht wirklich schwierig - von daher net wirklich viel mit Umbauarbeiten zum tun)
 
Gut, 29, aber ich sehe da noch das Problem, das ich später auch andere scrollbare Komponenten haben werde, z. B. Textareas. Da stehe ich dann wieder vor dem selben Problem. Verfolge gerade einen Ansatz über JViewPort.getExtentSize() und JViewPort.getViewSize() - mal sehen, ob ich darüber zum Ergebnis komme...

mpG
Tobias
 
Mein Ansatz scheint grundsätzlich richtig zu sein - habe jetzt noch etwas merkwürdige Effekte beim Aus- und Einblenden der Buttons, aber das kriegt man sicher in den Griff.

Grundsätzlich FUNKTIONIERT ES jedenfalls! *freu* *imKreisSpringt* 😉

mpG
Tobias
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben