Die JScrollPane mag mich nicht.
-
Hallo, ich habe da ein interessantes Problem.
Ich habe ein JScrollPane, dass mir einen Ausschnitt von einem JPanel zeigen soll. Das darunter liegende JPanel hat ein null-Layout. Das JScrollPane (TransferWatcherList) wird in ein BorderLayout reingelegt. Das sieht jetzt ungefähr so aus:public final class TransferWatcherList extends JScrollPane { public TransferWatcherList() { this(new JPanel(null, true)); } private TransferWatcherList(JPanel pane) { super(pane); this.pane = pane; pane.setOpaque(false); this.setBorder(null); this.setVisible(true); this.getVerticalScrollBar().setUnitIncrement(12); }
Jetzt kann es mit der Zeit passieren, dass immer mehr Informationen anzuzeigen sind. Das JPanel wächst dann dementsprechend nach unten und irgendwann erscheinen deshalb im JScrollPane Scrollbalken. Leider in der Mehrzahl. Das Ding kann eigentlich nicht in die Breite wachsen. Aber der irgendwann erscheinende vertikale Scrollbalken nimmt an der Seite Platz weg und deshalb erscheint daraufhin auch ein horizontaler. Stattdessen wäre es mir lieber, das JScrollPane würde immer so breit sein, dass das eingebettete JPanel nie horizontal gescrollt werden muss.
Ich habe schon manuell versucht, zu resizen, aber das funktioniert mit DynamicLayout dann nicht mehr. Seltsamerweise passt es ja erstmal. Obwohl ich nirgendwo die Breite vorgebe, wird sie richtig eingestellt. Aber es verbreitert sich irgendwie dann nicht, wenn der vertikale Scrollbalken erscheint.
-
Du kannst mit setHorizontalScrollBarPolicy und dem Parameter HORIZONTAL_SCROLLBAR_NEVER verhindern, dass die ScrollBar auftaucht.
-
Ja, das nützt mir nur nichts, weil der vertikale immer noch Platz wegnimmt, wodurch man dann horizontal scroll 'müsste'. Ich brauch das so, dass sich das JScrollPane verbreitert.
-
ein JComponent hat doch setPreferredSize(), setMinimumSize(), setMaximumSize()
vieleicht gehts mit einem der dreier
-
Hab's jetzt hing3h4x0r7, indem ich den Scroll-Client auf eine feste Breite gesetzt hab, die ich im Voraus berechne.
EDIT: War ein Irrtum. Geht immer noch nicht gescheit.
EDIT2: Es würde funktionieren, wenn ich die vertikale Scrollbar immer anzeigen. Wenn ich aber AS_NEEDED einstelle, verbreitert sich das JScrollPane nicht, sobald der vertikale Balken sichtbar wird.
-
ALWAYS?
-
Hab ich ja geschrieben, dass es dann funktioniert. Ich will das aber nicht, dass ne leere Liste nen Scrollbalken hat.
-
Moep, warum machste nicht sowas:
myScrollPane.getVerticalScrollbar().addAdjustmentListener(new MyAdjustmentListener()); private class MyAdjustmentListener extends AdjustmentListener{ //Namen so ähnlich: keine Lust nachzuschauen public void adjustmentValueChanged(AdjustmentEvent e){ if(myUnderlyingPane.getWidth() < myScrollPane.getWidth()) myScrollPane.setSize(myUnderlyingPane.getWidth(), myScrollpane.getHeight()); } }
Oder habe ich da was falsch verstanden?
MFG JohnAlternative könntest du ja auch nen ComponentListener -> componentResizedEvent benutzen
-
Da ist das Problem, dass es mit Toolkit.setDynamicLayout(true) nicht anständig funktioniert. Während der Layout-Manager alles schön während dem resizen ändern, werden solche events (zumindest unter win) nur nach dem Ende des resizens ausgelöst.
-
Hast du es mit dem AdjustmentListener probiert?
Ansonsten empfehle ich eh das GridBagLayout ...
Edit: Nochmal nen Event firen wäre wahrscheinlich zu unschön, oder?
-
Wie meinst du das mit dem Event? Das Problem ist, dass ich unter Windows ein resized nur kriege, wenn ich die Maus loslasse. Das ist mir zu wenig. Selbst wenn ich Code habe, der alles richtet, nützt er mir deshalb nichts.
Es muss irgendwie über das Layout gehen. Im Moment benutze ich BorderLayout und ich habe da viel rumrpobiert, ich werde jedenfalls hierfür nicht wieder zu GridBagLayout zurückgehen (falls das überhaupt was bringen sollte). Evtl. muss ich mir jetzt nen eigenen Layout-Manager schreiben, der das berücksichtigt, hoffentlich komme ich drum rum (bin leider Perfektionist).