# Listener für Button auf JScrollbar



## MathiasBauer (22. Apr 2008)

Hallo,

ich möchte bei Mausklick auf den Button des Scrollbalkens reagieren. D.h. wenn der Scrollbalken unten angekommen ist und auf den Button geklickt wird, sich die Tabelle dynamisch wie in Excel erweitert (neue Zeilen hinzugefügt werden).
Jedoch dürfen keine neue Zeilen hinzugefügt werden, wenn der Balken mit der Maus verschoben wird.
Nur weiß ich nicht wie ich an den Buttonlistener rankomme. Hat einer eine Ahnung, wie das geht? Vielen Dank im Voraus.


----------



## Tobias (23. Apr 2008)

Ich kann mir nicht vorstellen, dass das überhaupt geht. Wie wäre es mit einer JScrollPane, der du in der unteren, rechten Ecke einen eigenen Button hinzufügst, mit dem man Zeilen adden kann?

mpG
Tobias


----------



## MathiasBauer (23. Apr 2008)

Schade...

Das ist leider nicht in meinem Sinne. Ich hätte gerne wie in Excel, dass sich neue Zeilen automatisch hinzufügen.

Dann muss ich mir wohl etwas anderes überlegen...


----------



## Tobias (23. Apr 2008)

Du könntest mit AdjustmentListener experimentieren - IMHO ist es möglich, das der dir einen UNIT_INCREMENT / UNIT_DECREMENT auslöst wenn der Button gedrückt wurde und einen BLOCK_INCREMENT / BLOCK_DECREMENT wenn der Slider bewegt wird.
Vielleicht passiert aber auch gar nichts, weil sich die ScrollBar (wenn sie am Ende ist) ja nicht mehr bewegt. Oder der Slider löst manchmal BLOCK_* und manchmal UNIT_* aus - who knows.

Probier's aus.

mpG
Tobias


----------



## Marco13 (23. Apr 2008)

Mit einem Hack kommt man an die Buttons zwar dran...

```
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

class JScrollBarButtonTest extends JFrame
{
    public static void main(String args[])
    {
        new JScrollBarButtonTest();
    }

    public JScrollBarButtonTest()
    {
        setSize(400,400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JScrollBar bar = new JScrollBar();

        JButton b0 = (JButton)bar.getAccessibleContext().getAccessibleChild(0);
        b0.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                System.out.println("Down");
            }
        });

        JButton b1 = (JButton)bar.getAccessibleContext().getAccessibleChild(1);
        b1.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                System.out.println("Up");
            }
        });

        getContentPane().add(bar, BorderLayout.EAST);
        setVisible(true);
    }
}
```
... aber man sollte sich dafür eher eine andere Lösung überlegen ....


----------



## MathiasBauer (23. Apr 2008)

Danke!

Ich denke, ich werde ein wenig herumexperimentieren...


----------



## MathiasBauer (23. Apr 2008)

@Marco13:

Wo liegt das Problem? Wenn es funktioniert, ist doch alles in Ordnung, oder nicht?


----------



## Tobias (23. Apr 2008)

Naja, die meisten selbstgemachten Elektroinstallationen funktionieren auch und es wäre trotzdem besser sich was anderes zu überlegen ... Soll heißen: Marcos Lösung ist für einen Aussenstehenden nicht auf Anhieb verständlich und dementsprechend schwer zu warten. Darüberhinaus mißbraucht es den AccessableContext zu Dingen für die er nicht gemacht ist - was nicht unbedingt zukunftssicher sein muß.

mpG
Tobias


----------



## MathiasBauer (23. Apr 2008)

Alles klar. Danke!

Ich werde es trotzdem in mein Programm einbauen!


----------



## Marco13 (23. Apr 2008)

Ich sollte mit solchen Hacks (Anfängern gegeüber) vielleicht vorsichtiger sein  :roll: Das ist WIRKLICH ein Hack. Niemand garantiert einem, dass die Buttons dort liegen, wo sie in diesem Beispiel rausgeholt werden. Niemand garantiert einem, dass das wirklich JButtons sind. Niemand garantiert einem, dass das Programm mit der nächsten Java-Version (oder auch schon bei einem geänderten Look&Feel!) noch funktioniert. Du solltest wirklich nach einer Lösung suchen, die sich an den Vorschlägen von Tobias orientiert.


----------



## MathiasBauer (23. Apr 2008)

Ich habe es jetzt mal mit dem AdjustmentListener probiert, so wie es unter folgendem Link beschrieben ist:

http://www.galileocomputing.de/openbook/javainsel7/javainsel_15_011.htm#mjbfe9509749c9e3c4be3799e95000f83b

Leider liefert er mir bei getAdjustmentType()  nur AdjustmentEvent.TRACK und den jeweiligen Wert.

D.h. ich kann nicht zwischen Buttonklick und Verschieben des Scrollbalkens unterscheiden.

Ich bekomme kein UNIT_INCREMENT oder BLOCK_INCREMENT Event ausgegeben.

Hat jemand eine Idee wie es doch noch klappen könnte? Danke.


----------

