2009-02-06 5 views
2

Y a-t-il une sorte de mise en page XY vers Java?Mise en page XY JAVA

Je peux donc placer un bouton sur les cordons X et Y et supposé être aussi grand etc ... Parce que cette disposition de bordure et ce truc de grille et panneau me rendent fou. :)

Ils coulent à chaque instant et se tendent. Et pour les faire petit, vous devez mettre le panneau dans le panneau dans le panneau dans le panneau ^^,

Répondre

6

Lorsque vous définissez la disposition du conteneur sur null (sans LayoutManager), vous pouvez définir les limites du composant individuellement avec component.setBounds (x, y, w, h).

mises en page fixes sont dans 99% de tous les cas mauvaise conception de l'interface (si vos étiquettes, par exemple, ne reçoivent pas leur taille préférée vous rencontrez des problèmes maire lorsque votre application prend en charge plusieurs langues), de sorte mon conseil pour vous est d'écrire plutôt un gestionnaire de disposition spécialisé pour vos besoins spécifiques.

Écrire votre gestionnaire de disposition personnalisé est assez facile, tout ce que vous avez à faire est de pouvoir calculer la taille préférée pour un conteneur avec des composants donnés et votre disposition, et de faire la mise en page en fixant les limites (calculées) vos composants. Je me suis débarrassé du GridBagLayout et j'ai commencé à coder mes propres mises en page il y a longtemps, et la mise en page n'a jamais été aussi facile.

Voici un exemple d'une mise en page personnalisée, que layouts paires de composants clés et la valeur:

public class KeyValueLayout implements LayoutManager { 

    public static enum KeyAlignment { 
     LEFT, RIGHT; 
    } 

    private KeyAlignment keyAlignment = KeyAlignment.LEFT; 

    private int hgap; 

    private int vgap; 

    public KeyValueLayout() { 
     this(KeyAlignment.LEFT); 
    } 

    public KeyValueLayout (KeyAlignment keyAlignment) { 
     this(keyAlignment, 5, 5); 
    } 

    public KeyValueLayout (int hgap, int vgap) { 
     this(KeyAlignment.LEFT, hgap, vgap); 
    } 

    public KeyValueLayout (KeyAlignment keyAlignment, int hgap, int vgap) { 

     this.keyAlignment = keyAlignment != null ? keyAlignment : KeyAlignment.LEFT; 
     this.hgap = hgap; 
     this.vgap = vgap; 
    } 

    public void addLayoutComponent (String name, Component comp) { 
    } 

    public void addLayoutComponent (Component comp, Object constraints) { 
    } 

    public void removeLayoutComponent (Component comp) { 
    } 

    public void layoutContainer (Container parent) { 
     Rectangle canvas = getLayoutCanvas(parent); 
     int ypos = canvas.y; 
     int preferredKeyWidth = getPreferredKeyWidth(parent); 

     for (Iterator<Component> iter = new ComponentIterator(parent); iter.hasNext();) { 
      Component key = (Component) iter.next(); 
      Component value = iter.hasNext() ? (Component) iter.next() : null; 
      int xpos = canvas.x; 
      int preferredHeight = Math.max(key.getPreferredSize().height, value != null ? value.getPreferredSize().height : 0); 

      if (keyAlignment == KeyAlignment.LEFT) 
       key.setBounds(xpos, ypos, key.getPreferredSize().width, key.getPreferredSize().height); 
      else 
       key.setBounds(xpos + preferredKeyWidth - key.getPreferredSize().width, ypos, key.getPreferredSize().width, 
        key.getPreferredSize().height); 

      xpos += preferredKeyWidth + hgap; 
      if (value != null) 
       value.setBounds(xpos, ypos, canvas.x + canvas.width - xpos, preferredHeight); 
      ypos += preferredHeight + vgap; 
     } 
    } 

    public Dimension minimumLayoutSize (Container parent) { 
     int preferredKeyWidth = getPreferredKeyWidth(parent); 
     int minimumValueWidth = 0; 
     int minimumHeight = 0; 
     int lines = 0; 
     for (Iterator<Component> iter = new ComponentIterator(parent); iter.hasNext();) { 
      lines++; 
      Component key = (Component) iter.next(); 
      Component value = iter.hasNext() ? (Component) iter.next() : null; 
      minimumHeight += Math.max(key.getPreferredSize().height, value != null ? value.getMinimumSize().height : 0); 
      minimumValueWidth = Math.max(minimumValueWidth, value != null ? value.getMinimumSize().width : 0); 
     } 

     Insets insets = parent.getInsets(); 
     int minimumWidth = insets.left + preferredKeyWidth + hgap + minimumValueWidth + insets.right; 
     minimumHeight += insets.top + insets.bottom; 
     if (lines > 0) 
      minimumHeight += (lines - 1) * vgap; 

     return new Dimension(minimumWidth, minimumHeight); 
    } 

    public Dimension preferredLayoutSize (Container parent) { 
     int preferredKeyWidth = getPreferredKeyWidth(parent); 
     int preferredValueWidth = 0; 
     int preferredHeight = 0; 
     int lines = 0; 
     for (Iterator<Component> iter = new ComponentIterator(parent); iter.hasNext();) { 
      lines++; 
      Component key = (Component) iter.next(); 
      Component value = iter.hasNext() ? (Component) iter.next() : null; 

      preferredHeight += Math.max(key.getPreferredSize().height, value != null ? value.getPreferredSize().height : 0); 
      preferredValueWidth = Math.max(preferredValueWidth, value != null ? value.getPreferredSize().width : 0); 
     } 

     Insets insets = parent.getInsets(); 
     int preferredWidth = insets.left + preferredKeyWidth + hgap + preferredValueWidth + insets.right; 
     preferredHeight += insets.top + insets.bottom; 
     if (lines > 0) 
      preferredHeight += (lines - 1) * vgap; 

     return new Dimension(preferredWidth, preferredHeight); 
    } 

    public Dimension maximumLayoutSize (Container target) { 
     return preferredLayoutSize(target); 
    } 

    private int getPreferredKeyWidth (Container parent) { 
     int preferredWidth = 0; 
     for (Iterator<Component> iter = new ComponentIterator(parent); iter.hasNext();) { 
      Component key = (Component) iter.next(); 
      if (iter.hasNext()) 
       iter.next(); 

      preferredWidth = Math.max(preferredWidth, key.getPreferredSize().width); 
     } 

     return preferredWidth; 
    } 

    private Rectangle getLayoutCanvas (Container parent) { 
     Insets insets = parent.getInsets(); 
     int x = insets.left; 
     int y = insets.top; 

     int width = parent.getSize().width - insets.left - insets.right; 
     int height = parent.getSize().height - insets.top - insets.bottom; 

     return new Rectangle(x, y, width, height); 
    } 

    private class ComponentIterator implements Iterator<Component> { 

     private Container container; 

     private int index = 0; 

     public ComponentIterator (Container container) { 
      this.container = container; 
     } 

     public boolean hasNext() { 
      return index < container.getComponentCount(); 
     } 

     public Component next() { 
      return container.getComponent(index++); 
     } 

     public void remove() { 
     } 
    } 
} 

Il suffit de définir la mise en page et ajouter des étiquettes et des composants en alternance valeur.Il est facile à utiliser, en particulier par rapport aux panneaux GridBagLayout ou imbriqués avec des dispositions personnalisées.

+0

Votre réponse est excellente, mais je pense que ce n'est pas pertinent concernant la question réelle (sur le XYLayout). – SaadBen

2

Si vous voulez vraiment faire cela, utilisez

setLayout(null); 

sur le composant que vous mettez les choses dans, puis utiliser

setBounds(x, y, width, height); 

pour définir les coordonnées absolues des éléments. Exemple:

setLayout(null); 
JButton myButton = new JButton("Do Stuff"); 
add(myButton); 
myButton.setBounds(30, 30, 100, 30); 

Cependant, l'interface graphique résultant regarderons non standard, ne sera pas redimensionnable, et si elle est plus ou moins complexe, sera une douleur à maintenir. Je sais que la mise en page est frustrante, mais à la fin, vous ferez mieux d'utiliser une combinaison de BorderLayouts et FlowLayouts, ouGridBagLayout - ou un constructeur d'interface IDE comme Eclipse ou Netbeans.

3

La raison pour laquelle les composants sont redimensionnés est que tout semble beau quelle que soit la taille de la fenêtre, donc Swing décourage la position droite X-Y. Vous pouvez jeter un oeil à GroupLayout http://java.sun.com/docs/books/tutorial/uiswing/layout/group.html qui est conçu pour les constructeurs GUI, et la page mentionnée ci-dessus décrit l'utilisation de composants invisibles pour absorber les étirements. par exemple: layout.setAutoCreateGaps(true);

SpringLayout pourrait également être utile - voir le visual guide

Si vous voulez vraiment X et Y puis définissez le gestionnaire de mise en page à null, et utiliser setLocation() ou setBounds(). Je ne recommanderais vraiment pas, mais ça fonctionne. Avoir une lecture de

1

Ceci ne répond pas à votre question, mais accepte les autres commentaires, jetez un oeil à MiG Layout. J'ai été également frustré par les mises en page en tant que débutant Swing, mais cela m'a beaucoup aidé.