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.
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
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, la méthode
setMinimumSize
est une suggestion pour leLayoutManager
API. Une suggestion qui peut être ignoré.Afin d'être en mesure à même de soutenir cela, vous aurez besoin d'utiliser quelque chose comme un ComponentListener et de surveiller la componentResized événement.
La meilleure solution je pense est d'utiliser un
LayoutManager
qui utilise le minimum et le maximum de contraintes de taille, quelque chose commeGridBagLayout
.Utiliser cette fonction sur un "contenu" volet et le lieu où tu es
JSplitPane
sur ce (réglage de la taille minimale et maximale en conséquence) puis ajouter le "contenu" du volet d'image.Mise à JOUR
Désolé, je suis probablement manquant quelque chose de vraiment évident, mais j'ai mis ce petit test, j'espère qu'il a quelques idées qui aident à 😛
Window
hériteset/getMinimumSize
deContainer
. Alors que je suis sûr que l'OP veut limiter la taille de l'image, en utilisantsetMiniumumSize
aura pas d'effet...je me trompe 😛Ha, vous savez quoi,
setMinimumSize
sur unJFrame
marche vraiment 😛Yep, vu que sur Windows, ne permet que la largeur minimale pour être d'une certaine taille...
Je suis méfiant de
JLabel#setPreferredSize()
. IIUC,GridBagLayout
avec des contraintes default agit commeGridLayout
. Le texte ne sera probablement pas tronqué sur la plupart des plateformes, mais c'est un problème en attente de se produire.Yep, c'est un bon point (c'est seulement une démonstration). Personnellement, je déteste préféré/min/max taille et à éviter si je peux
OriginalL'auteur MadProgrammer
Dans ce exemple, la taille du contenu d'un
JSplitPane
est fixé initialement à un petit multiple de la taille préférée dansgetPreferredSize()
. Notez que leJSplitPane
ne deviendra pas plus petit que le panneau de la taille minimale, géré par le joint deJlabel
.com.apple.laf.AquaLookAndFeel
, où la séparation du volet de l'INTERFACE utilisateur délégué applique le minimum sur les deux volets.OriginalL'auteur trashgod