2009-03-26 11 views
4

Je veux faire un composant pour occuper le maximum disponible en hauteur du conteneur. Dans le code que j'ai collé ci-dessous par exemple, j'ai fait le cadre racine à 800 600. Je veux définir la hauteur/largeur de seulement ce cadre (et je ne veux pas essayer de pixelliser ses enfants). Si je cours cela, je vois une interface utilisateur mal alignée. Tout d'abord, je veux un panneau (qui est à l'intérieur du cadre racine) pour prendre la hauteur de 100% du cadre (dans ce cas 800px moins le peu d'espace qu'il faut pour peindre le titre du cadre). Deuxièmement, à l'intérieur du panneau, j'ai une arborescence et une zone de texte. Je veux que les deux prennent 100% de hauteur et que l'arbre prenne 30% et que textArea prenne 70% de largeur (si l'arbre est étendu à 10 niveaux alors je suis d'accord avec ScrollPane).Swing: Comment régler la hauteur d'un composant à la hauteur du conteneur?

Comprenez que c'est le plus facile à réaliser en HTML. Dites simplement hauteur = 100% et largeur pour être 30% etc et nous avons terminé. Est-ce que quelqu'un sait si cela peut être fait dans Swing? (Je peux y parvenir en définissant des hauteurs de pixels et gestionnaire de mise en page mais je suis à la recherche de la solution la plus propre à fixer des hauteurs et largeurs pourcentage.)

package com.ekanathk.logger.gui; 

import javax.swing.*; 
import javax.swing.tree.DefaultMutableTreeNode; 

public class TestFrame extends JFrame { 
    public TestFrame() { 
     super("Top Frame"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     JPanel panel = new JPanel(); 
     JTree env = getEnvironmentTree(); 
     env.expandRow(0); 
     panel.add(new JScrollPane(env)); 
     panel.add(new JTextArea("Some contents")); 
     getContentPane().add(panel); 
     setSize(800, 600); 
     SwingUtil.centerComponentOnScreen(this); 
     setVisible(true); 
    } 

    private JTree getEnvironmentTree() { 
     DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root"); 
     JTree tree = new JTree(root); 
     DefaultMutableTreeNode one = new DefaultMutableTreeNode("One"); 
     root.add(one); 
     one.add(new DefaultMutableTreeNode("under one.1")); 
     one.add(new DefaultMutableTreeNode("under one.2")); 
     root.add(new DefaultMutableTreeNode("two")); 
     root.add(new DefaultMutableTreeNode("three")); 
     return tree; 
    } 

    public static void main(String[] args) { 
     new TestFrame(); 
    } 
} 

Répondre

3

Il utilise GridBagLayout pour faire un peu ce que vous voulez. Vous pouvez jouer avec setMinimumSize et setPreferedSize de vos composants.

import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 

import javax.swing.*; 
import javax.swing.tree.DefaultMutableTreeNode; 

public class TestFrame extends JFrame { 
    private static final long serialVersionUID = 1L; 

    public TestFrame() { 
     super("Top Frame"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     JPanel panel = new JPanel(new GridBagLayout()); 

     JTree env = getEnvironmentTree(); 
     env.expandRow(0); 

     GridBagConstraints c = new GridBagConstraints(); 
     c.fill = GridBagConstraints.BOTH; 
     c.weightx=.7; 
     c.weighty=1; 

     c.gridx=0; 
     c.gridy=0; 
     c.gridheight=1; 
     c.gridwidth=7; 
     panel.add(new JScrollPane(env),c); 

     c.weightx=.3; 
     c.gridx=7; 
     c.gridy=0; 
     c.gridheight=1; 
     c.gridwidth=GridBagConstraints.REMAINDER; 
     panel.add(new JTextArea("Some contents"),c); 

     add(panel); 
     setSize(800, 600); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    private JTree getEnvironmentTree() { 
     DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root"); 
     JTree tree = new JTree(root); 
     DefaultMutableTreeNode one = new DefaultMutableTreeNode("One"); 
     root.add(one); 
     one.add(new DefaultMutableTreeNode("under one.1")); 
     one.add(new DefaultMutableTreeNode("under one.2")); 
     root.add(new DefaultMutableTreeNode("two")); 
     root.add(new DefaultMutableTreeNode("three")); 
     return tree; 
    } 

    public static void main(String[] args) { 
     new TestFrame(); 
    } 
} 
+0

J'ai utilisé cette solution et elle a bien démarré. Mais dans mon application actuelle, le volet droit n'est pas seulement une zone de texte (il s'agit en fait d'un JTabbedPane avec potentiellement plus de 10 onglets). Quand les textes dans l'arbre étaient longs l'alignement s'est foutu (je dois définir MaxximumSize je pense, ce que je ne veux pas). J'ai utilisé –

+0

TableLayout comme prescrit dans http://java.sun.com/products/jfc/tsc/articles/tablelayout/ et le code a fonctionné comme un charme :) panel.setLayout (new TableLayout (new double [] [ ] {{0,3, 0,7}, {TableLayout.FILL}})); panel.add (p1, "0,0"); panel.add (p2, "1,0"); –

+0

Avez-vous essayé la solution de mise en page de printemps que j'ai publiée (actuellement) ci-dessous? Il a l'avantage qu'il semble redimensionner mieux que celui-ci. – KitsuneYMG

1

Il y a un certain nombre de layout managers qui y arriver - GridLayout (grille de 1x1), GridBagLayout, BorderLayout peut-être.

1

Voici une autre approche utilisant SpringLayout. Je n'ai pas réussi à faire fonctionner Spring.width et Spring.height, donc j'ai utilisé une manière plus verbeuse

import java.awt.BorderLayout; 
import java.awt.Color; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.JTree; 
import javax.swing.Spring; 
import javax.swing.SpringLayout; 
import javax.swing.tree.DefaultMutableTreeNode; 

public class TestFrame extends JFrame { 
    private static final long serialVersionUID = 1L; 

    public TestFrame() { 
     super("Top Frame"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE);   
     SpringLayout layout = new SpringLayout(); 
     JTree env = getEnvironmentTree(); 
     env.expandRow(0); 
     JPanel contentPane = new JPanel(layout); 
     contentPane.setLayout(layout); 
     JScrollPane treePane = new JScrollPane(env); 
     JTextArea area = new JTextArea("Some contents"); 
     contentPane.add(treePane); 
     contentPane.add(area);   
     setLayout(new BorderLayout()); 
     add(contentPane); 
     setSize(800, 600); 

     SpringLayout.Constraints cons; 
     cons = layout.getConstraints(treePane); 
     cons.setX(Spring.constant(0)); 
     cons.setY(Spring.constant(0)); 
     cons.setWidth(Spring.scale(layout.getConstraint(SpringLayout.EAST, contentPane), .7f)); 
     cons.setHeight(layout.getConstraint(SpringLayout.SOUTH, contentPane)); 

     cons = layout.getConstraints(area); 
     cons.setX(layout.getConstraint(SpringLayout.EAST, treePane)); 
     cons.setY(Spring.constant(0)); 
     cons.setWidth(Spring.scale(layout.getConstraint(SpringLayout.EAST, contentPane), .3f)); 
     cons.setHeight(layout.getConstraint(SpringLayout.SOUTH, contentPane)); 
     setPreferredSize(getSize()); 
     setLocationRelativeTo(null); 
     pack(); 
     setVisible(true); 
    } 

    private JTree getEnvironmentTree() { 
     DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root"); 
     JTree tree = new JTree(root); 
     DefaultMutableTreeNode one = new DefaultMutableTreeNode("One"); 
     root.add(one); 
     one.add(new DefaultMutableTreeNode("under one.1")); 
     one.add(new DefaultMutableTreeNode("under one.2")); 
     root.add(new DefaultMutableTreeNode("two")); 
     root.add(new DefaultMutableTreeNode("three")); 
     return tree; 
    } 

    public static void main(String[] args) { 
     new TestFrame(); 
    } 
} 
Questions connexes