JScrollPane: Komponente adden + autoscroll

Hallo,

ich hab 2 Fragen zum JScrollPane:

  1. worin liegt der Unterschied beim adden einer Komponente mit
  • myScrollPane.add(myPanel)
  • myScrollPane.getViewport().add(myPanel)
  • myScrollPane.setViewportView(myPanel) ?
  1. Wenn ich mit TAB durch die einzelnen Textfelder springe, und ich komme in ein Textfeld, dass ausserhalb des sichtbaren Bereiches liegt, scrollt die Scrollbar nicht nach unten…wie kann ich dieses „Mitscrollen“ erreichen?

Danke

  1. worin liegt der Unterschied beim adden einer Komponente mit
  • myScrollPane.add(myPanel)
  • myScrollPane.getViewport().add(myPanel)

Diese beiden dürften nichts sichtbares bewirken. Alle JComponents haben add()-Methoden (geerbt von java.awt.Container), doch nicht überall sind diese sinnvoll einzusetzen.

  • myScrollPane.setViewportView(myPanel) ?

Nur so wird myPanel innerhalb von myScrollPane angezeigt.
Alternative: myScrollPane.getViewport().setView(myPanel);

  1. Wenn ich mit TAB durch die einzelnen Textfelder springe,
    und ich komme in ein Textfeld, dass ausserhalb des sichtbaren
    Bereiches liegt, scrollt die Scrollbar nicht nach unten…wie
    kann ich dieses „Mitscrollen“ erreichen?

myPanel.scrollRectToVisible() sollte das bewerkstelligen.

Servus
Tom

Danke, das mit myPanel.scrollRectToVisible() werd ich gleich mal ausprobieren…was die Sache mit dem adden angeht, also ich hab alle Varianten ausprobiert, und alle haben das selbe bewirkt - es kann aber sein, dass irgendwo im Code nochmal der richtige Aufruf steht, und es nur deshalb funktioniert hat (ist ziemlich viel Code, und im Moment etwas unübersichtlich).

myPanel.scrollRectToVisible()
sollte das bewerkstelligen.

Servus
Tom

Diese Methode erwartet ein Rectangle , ich habe in meiner Anwendung aber ein JScrollPane in dem ein JPanel liegt (genauer gesagt, mehrere Panels, von denen immer nur eins im ScrollPane angezeigt wird - je nachdem, was im Menue ausgewählt wurde (sieht in etwa aus, wie ein Fenster mit mehreren Reitern)). In diesen ‚Haupt-Panels‘ liegen nun weitere ‚Sub-Panels‘ mit Textfeldern usw. wobei beim letzten ‚Sub-Panel‘ einige Textfelder nicht mehr im sichtbaren Bereich liegen (deshalb das ScrollPane).
…muss ich da jetzt meine ‚Haupt-Panels‘ in ein Rectangle legen (wie z.B ein überdimensionales Label), oder gibt es da eine andere Möglichkeit (Panel zu Rectangle casten, andere Methode,…)?

Grundsätzlich kriegst du ein passendes Rectangle durch die getBounds()-Methode des jeweiligen Textfeldes oder was auch immer im sichtbaren Bereich des Scrollpane liegen soll. Wenn du mit Sub-Panels arbeitest wird es allerdings komplizierter, da getBounds() die Position immer relativ zum direkt übergeordneten Container liefert, in so einem Fall also relativ zu einem Sub-Panel. Man müsste diese Koordinaten also relativ zum „Haupt-Panel“ umrechnen, damit das ScrollPane an die richtige Stelle scrollt.

Servus
Tom

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

P.S.
Falls das Sub-Panel klein genug ist, tut’s vielleicht auch dessen getBounds()-Methode. :smile: