JScrollPane Größe ändern mit JPanel, wenn Bildlaufleisten angezeigt werden
Ich habe ein kleines problem bei der Verwendung von JScrollPane
in meine Java-Anwendung.
Ich habe eine JScrollPane
mit einem JPanel
.
Diese JPanel
wird dynamisch aktualisiert, mit den Tasten (vertikal angeordnet), die in beliebiger Breite.
Die JPanel
passt automatisch seine Breite zu den größten JButton
Komponente im inneren.
Nun, wenn die vertikale Bildlaufleiste angezeigt wird, es nimmt etwas Platz auf der rechten Seite meines JPanel
, die bewirkt, dass der größte buttons nicht vollständig angezeigt werden. Ich don ' T wollen, verwenden Sie die horizontale Bildlaufleiste neben der Anzeige der gesamten Schaltfläche.
Gibt es eine Möglichkeit, um die Größe meiner JPanel
wenn eine scrollbar erscheint, so erscheint es schön neben meine buttons? Oder gibt es eine andere Möglichkeit die scrollbar erscheinen neben meinem JPanel
?
Vielen Dank im Voraus!
BEARBEITEN: Hier ist eine demo von meinem problem. Wenn Sie die Fenstergröße ändern, um eine kleinere Höhe, ein kleiner Teil des buttons auf der rechten Seite abgedeckt wird.
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import java.awt.GridLayout;
/**
* @author Dylan Kiss
*/
public class Demo {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
JFrame myFrame = new JFrame("Demo");
JPanel sideBar = new JPanel();
JPanel centerPanel = new JPanel();
centerPanel.add(new JLabel("This is the center panel."));
JPanel buttonContainer = new JPanel();
JButton myButton = null;
for (int i = 0; i < 20; i++) {
buttonContainer.setLayout(new GridLayout(20, 1, 0, 0));
myButton = new JButton("This is my button nr. " + i);
buttonContainer.add(myButton);
}
sideBar.setLayout(new BorderLayout(0, 0));
JScrollPane scrollPane = new JScrollPane(buttonContainer);
sideBar.add(scrollPane);
myFrame.getContentPane().add(sideBar, BorderLayout.WEST);
myFrame.getContentPane().add(centerPanel, BorderLayout.CENTER);
myFrame.setLocationByPlatform(true);
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myFrame.pack();
myFrame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine einfache, nicht hübsch, Lösung:
BEARBEITEN:
Ich dachte, das könnte den job nicht machen in deinem Fall. Hier ist eine bessere Lösung, obwohl es hat sehr viel boilerplate:
Implementiert Scrollable, um volle Kontrolle zu Blättern, macht einen tollen trick mit der tracking-viewport-Höhe zu gewährleisten, werden die Schaltflächen erweitern, wenn der Raum verfügbar ist, und fügt auf die Breite der vertikalen Bildlaufleiste, um die bevorzugte Breite zu allen Zeiten. Es könnte zu erweitern, wenn die vertikale Bildlaufleiste sichtbar ist, aber das sieht sowieso schlecht. Verwenden Sie es wie diese:
Sieht es für mich aus wie diese Problemumgehung ist erforderlich, da mögliche Fehler in javax.swing.ScrollPaneLayout:
Hier extentSize eingestellt ist, um die bevorzugte Größe des Viewports und viewSize eingestellt ist viewport.getViewSize(). Dies scheint nicht korrekt, AFAIK die Größe der Ansicht innerhalb des Ansichtsfensters sollte immer gleich die gewünschte Größe ein. Es scheint mir, dass die Sicht sollte die Größe im Vergleich zu der tatsächlichen Größe des Viewports, anstatt seine bevorzugte Größe.
Eine einfache Lösung, um Ihre Anforderungen in Bezug auf
ist die Verwendung von EmptyBorder, diese können Sie erreichen, was Sie fühlen, wie, geschehen sollte, wie im Bild unten gezeigt :
Habe ich nur noch diese Zeile geschrieben unten nach dieser Zeile
JPanel buttonContainer = new JPanel();
HINZUGEFÜGTE ZEILE
Hier ist dein code mit dieser Zeile Hinzugefügt :
Konnte man die Größe des JPanel durch Aufruf von setPreferredSize wenn das JPanel muss geändert werden.