Comment Définir Correctement les Tailles Minimales en Java?

Pour une application GUI je suis entrain de créer en Java, j'ai le texte suivant:

  • Une JFrame, ensemble pour avoir une taille minimum de (300,200)
  • Un JSplitPane, dans laquelle se trouve:
    • Sur la gauche, un JScrollPane (contenant un JTree) avec une taille minimum de (100,0) (je ne veux restreindre la largeur à 200)
    • Sur la droite, un Composite avec une taille minimum de (200,0)

Le dimensionnement de ne pas me donner tout problème dans les conditions suivantes:

  • Le redimensionnement de la JSplitPane tout le chemin vers la gauche (vers le JScrollPane de taille minimale), et par la suite redimensionner la fenêtre par la suite
  • Juste le redimensionnement de la fenêtre, à un certain degré

Le problème survient lorsque je déplace le JSplitPane trop près de la droite, après quoi le redimensionnement de la fenêtre du Composite dans le droit de la JSplitPane ne parvient pas à respecter la largeur minimale que j'ai défini.

J'ai tenté de fixer un maximum de largeur sur le JScrollPane, ce qui ne semble pas l'aider du tout.

Est-il quelque chose impliquant des tailles maximales que je doit faire? Ou peut-être il ya un moyen d'attacher un Écouteur à l'un des panneaux de la force de mon comportement souhaité? En fin de compte, je veux juste le panneau de droite dans le JSplitPane de ne jamais être à moins de 200px de large.

Voici un exemple de comportement, je suis en train de vivre:

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);
}
}

Mise à jour:

J'ai peur de ne pas bien comprendre le point en essayant d'être faite dans la proposition de solutions, sauf que setPreferred() et setMinimum/Maximum de() sont à éviter.

Ma question, à la suite de l'apprentissage de ce qui est, quelles sont mes options pour restreindre la JSplitPane diviseur en dehors de l'utilisation de ces méthodes? MadProgrammer mentionné à l'écoute de la componentResized événement, mais j'ai juste besoin d'un peu plus de précisions quant à pourquoi. Suis-je appeler setDividerLocation() en réponse à cet événement?

Je m'excuse à l'avance si vous le démontrera la question est destinée séparés comme StackOverflow question complètement, je peux poster un autre et le lien ici si nécessaire.

Mise à jour 2:

Est tout simplement pas à la régulation de la façon dont l'utilisateur choisit la taille de la fenêtre et avoir le panneau de droite dans un JScrollPane une option viable? Cela me semble quelque peu d'une norme de pratique.

Merci d'éditer votre question à inclure un sscce qui expose le problème que vous décrivez.
Je me rends compte de la panel.setMinimumSize est juste pour la démonstration, mais tree.setMinimumSize est un problème. dois-je éviter l'utilisation de set(de préférence|Maximum|Minimum)Taille de méthodes en Java Swing?
+1 pour sscce, BTW.

OriginalL'auteur mellowmaroon | 2012-09-18