Wie man Richtig Setzen Sie die Minimale Größe in Java?
Für eine GUI-Anwendung erstelle ich in Java ich habe folgende:
- Ein JFrame, auf eine minimale Größe (300,200)
- Eine JSplitPane, in dem liegt:
- Auf der linken Seite, eine JScrollPane (die ein JTree) mit einer Mindestgröße von (100,0) (ich will nur beschränken Sie die Breite auf 200)
- Auf der rechten Seite ein JPanel mit einer Mindestgröße von (200,0)
Die Dimensionierung braucht mir keine Frage, unter den folgenden Bedingungen:
- Die Größe des JSplitPane den ganzen Weg nach Links (die JScrollPane die minimale Größe), und anschließend die Größe des Fensters danach
- Nur die Größe des Fensters, bis zu einem gewissen Grad
Tritt das problem auf wenn ich mich bewege, die JSplitPane zu nah an der rechten, worauf die Größe des Fensters das JPanel in der rechten Seite der JSplitPane einhält, um die minimale Breite ich.
Habe ich versucht die Einstellung einer maximalen Breite auf die JScrollPane, die nicht scheinen, um zu helfen.
Gibt es etwas, das mit maximalen Größen muss ich tun? Oder gibt es vielleicht eine Möglichkeit zur Befestigung einer Listener, um eine der Platten zu zwingen, meine gewünschte Verhalten? Letztlich will ich nur den rechten Bereich in der JSplitPane nie weniger als 200px Breite.
Hier ist ein Beispiel mit Verhalten, das ich erlebe:
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTree;
public class ResizeTest
{
private JFrame frame;
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
ResizeTest window = new ResizeTest();
window.frame.setVisible(true);
}
catch(Exception e)
{
e.printStackTrace();
}
}
});
}
public ResizeTest()
{
initialize();
}
private void initialize()
{
frame = new JFrame();
frame.setMinimumSize(new Dimension(300, 200));
frame.setBounds(100,100,450,300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new GridLayout(0, 1, 0, 0));
JSplitPane splitPane = new JSplitPane();
frame.getContentPane().add(splitPane);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setMinimumSize(new Dimension(100, 0));
splitPane.setLeftComponent(scrollPane);
JTree tree = new JTree();
tree.setMinimumSize(new Dimension(100, 0));
scrollPane.setViewportView(tree);
JPanel panel = new JPanel();
panel.setMinimumSize(new Dimension(200, 0));
splitPane.setRightComponent(panel);
}
}
Update:
Ich fürchte, dass ich nicht vollständig verstehen, die Punkt-Versuch gemacht werden, die in den vorgeschlagenen Lösungen, mit Ausnahme, dass setPreferred() und setMinimum/Maximum() sind besser zu vermeiden.
Meine Frage in Antwort, zu lernen das ist, was sind meine Optionen für die Einschränkung der JSplitPane Teiler außerhalb der Verwendung dieser Methoden? MadProgrammer genannten Zuhören für die componentResized Ereignis, aber ich brauche nur ein wenig mehr Klärung, warum. Bezeichne ich setDividerLocation() in Reaktion auf dieses Ereignis?
Ich entschuldige mich im vorraus wenn die Frage angehängt ist gedacht als eine separate StackOverflow-Frage gänzlich, kann ich ein anderes posten und link hier, wenn nötig.
Update 2:
Ist einfach nicht der Regulierung, wie der Anwender wählt die Größe der Fenster und mit der rechten panel in eine JScrollPane ein gangbarer Weg? Sieht für mich so etwas wie der standard der Praxis.
- Bitte Editiere deine Frage, um einen sscce, die zeigt das problem, das Sie beschreiben.
- Ich weiß, das
panel.setMinimumSize
ist nur für demonstration, abertree.setMinimumSize
ist ein problem. Sollte ich vermeiden Sie die Verwendung von set(Preferred|Maximum|Minimum)Größe Methoden in Java Swing? - +1 für sscce, BTW.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erstens, die Methode
setMinimumSize
ist ein Vorschlag an dieLayoutManager
API. Ein Vorschlag, der ignoriert werden kann.Um der Lage sein, um auch nur annähernd zu unterstützen, müssen Sie etwas, das wie ein ComponentListener und überwachung der componentResized Veranstaltung.
Die beste Lösung, die ich denken kann, ist die Verwendung eines
LayoutManager
, die tatsächlich verwendet die minimale und die maximale Größe Einschränkungen, so etwas wieGridBagLayout
.Verwenden Sie diese auf einem "content" - Bereich und platzieren Sie
JSplitPane
auf diese (Einstellung der minimalen und maximalen Größe entsprechend) dann fügen Sie die "content" - Bereich der Rahmen.UPDATE
Sorry, ich bin wahrscheinlich etwas fehlt wirklich offensichtlich, aber ich habe diesen kleinen test zusammen, ich hoffe, es hat einige Ideen, die helfen 😛
Window
erbtset/getMinimumSize
ausContainer
. Während ich bin ziemlich sicher, dass die OP will, beschränken Sie die Größe des Rahmens als auch mitsetMiniumumSize
haben keine Wirkung...bin ich falsch 😛setMinimumSize
auf eineJFrame
tatsächlich funktioniert 😛JLabel#setPreferredSize()
. IIUC,GridBagLayout
mit default-Einschränkungen wirkt wieGridLayout
. Der text wahrscheinlich nicht abgeschnitten werden, auf den meisten Plattformen, aber es ist ein problem auf uns zukommen.setMinimumSize()
auf das Fenster der nur begrenzt die minimale Größe für den Benutzer verfügbar. Wenn Sie möchten, dass die minimale Größe berechnet werden, die durch einen layout-manager, dann finden Sie die Lösung, die ich gepostet hereIn diesem Beispiel, die bevorzugte Größe des Inhalts einer
JSplitPane
zunächst als ein kleines Vielfaches der Komponente bevorzugte Größe ingetPreferredSize()
. Beachten Sie, dass dieJSplitPane
wird nicht kleiner als das panel-minimale Größe, verwaltet von der beiliegendenJlabel
.com.apple.laf.AquaLookAndFeel
, wo die split-pane UI-delegate erzwingt das minimum auf beide Scheiben.