2017-02-18 2 views
0

ich eine Java-Anwendung erstellen und zur Zeit verwende ich diesen Layout-Manager:Swing - Änderung Layoutmanager: zwei Komponenten pro Zeile

import java.awt.Component; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.Insets; 
import java.awt.LayoutManager; 

/** 
* @author Pasban 
*/ 

public class VerticalLayout implements LayoutManager { 

    public final static int CENTER = 0; 
    public final static int RIGHT = 1; 
    public final static int LEFT = 2; 
    public final static int BOTH = 3; 
    public final static int TOP = 1; 
    public final static int BOTTOM = 2; 
    private int vgap; 
    private int alignment; 
    private int anchor; 

    public VerticalLayout() { 
     this(5, CENTER, TOP); 
    } 

    public VerticalLayout(int vgap) { 
     this(vgap, CENTER, TOP); 
    } 

    public VerticalLayout(int vgap, int alignment) { 
     this(vgap, alignment, TOP); 
    } 

    public VerticalLayout(int vgap, int alignment, int anchor) { 
     this.vgap = vgap; 
     this.alignment = alignment; 
     this.anchor = anchor; 
    } 

    private Dimension layoutSize(Container parent, boolean minimum) { 
     Dimension dim = new Dimension(0, 0); 
     Dimension d; 
     synchronized (parent.getTreeLock()) { 
      int n = parent.getComponentCount(); 
      for (int i = 0; i < n; i++) { 
       Component c = parent.getComponent(i); 
       if (c.isVisible()) { 
        d = minimum ? c.getMinimumSize() : c.getPreferredSize(); 
        dim.width = Math.max(dim.width, d.width); 
        dim.height += d.height; 
        if (i > 0) { 
         dim.height += vgap; 
        } 
       } 
      } 
     } 
     Insets insets = parent.getInsets(); 
     dim.width += insets.left + insets.right; 
     dim.height += insets.top + insets.bottom + vgap + vgap; 
     return dim; 
    } 

    public void layoutContainer(Container parent) { 
     Insets insets = parent.getInsets(); 
     synchronized (parent.getTreeLock()) { 
      int n = parent.getComponentCount(); 
      Dimension pd = parent.getSize(); 
      int y = 0; 
      for (int i = 0; i < n; i++) { 
       Component c = parent.getComponent(i); 
       Dimension d = c.getPreferredSize(); 
       if (c.isVisible()) { 
        y += d.height + vgap; 
       } 
      } 
      y -= vgap; 
      if (anchor == TOP) { 
       y = insets.top; 
      } else if (anchor == CENTER) { 
       y = (pd.height - y)/2; 
      } else { 
       y = pd.height - y - insets.bottom; 
      } 
      for (int i = 0; i < n; i++) { 
       Component c = parent.getComponent(i); 
       Dimension d = c.getPreferredSize(); 
       if (!c.isVisible()) { 
        continue; 
       } 
       int x = 1; 
       int wid = pd.width - 3; 
       c.setBounds(x, y, wid, d.height); 
       y += d.height + vgap; 
      } 
     } 
    } 

    public Dimension minimumLayoutSize(Container parent) { 
     return layoutSize(parent, false); 
    } 

    public Dimension preferredLayoutSize(Container parent) { 
     return layoutSize(parent, false); 
    } 

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

    public void removeLayoutComponent(Component comp) { 
    } 

    public String toString() { 
     return getClass().getName() + "[vgap=" + vgap + " align=" + alignment + " anchor=" + anchor + "]"; 
    } 
} 

Anwendungsbeispiel (die Komponenten vertikal ausgerichtet ist):

https://i.stack.imgur.com/uGtbz.png

Wie Sie sehen können, ist jede Komponente in einer Zeile. Aber ich möchte, dass einige Komponenten zwei auf einer Linie sind.

Zum Beispiel werden JButtons auf einer Zeile sein, so wie es jetzt ist. Das Gleiche gilt für JTextAreas.

Aber ich möchte die JLabels und die JTextFields auf der gleichen Linie haben. Und das selbe für die JLabels und die JComboBoxen, in derselben Zeile.

Und ich weiß nicht wirklich, wie es geht. Könnte mir jemand erklären? : D

Antwort

1

Zunächst ist es wirklich schwer zu verstehen, warum genau Sie ein eigenes Layout erstellen? Werfen Sie einen Blick auf GridBagLayout

https://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html

Die Anwendungsfälle Sie mithilfe GridBagLayout leicht erfüllt werden, erklären können.

+0

gut, ist GridBagLayout Art von Komplex zu verwenden, und stattdessen eine Menge Dinge zu konfigurieren, würde Ich mag an mach 'automatisch' (1 oder 2 Zeilen Code) – PYRRH4

+0

Nochmal, ich sage dir, dass ein bisschen mehr Zeit auf GrigBagLayout eine gute Welt bringen wird. Falls Sie dennoch Ihren eigenen Layout Manager implementieren möchten, tun Sie dies, indem Sie das GridBagLayout stattdessen erweitern. Verwenden Sie ein zweispaltiges GridBagLayout. Halten Sie für Komponenten, die eine ganze Zeile einnehmen sollen, die Gitterbreite auf 2. Für andere fügen Sie sie mit einer Gitterbreite von 1 hinzu. Was Sie versuchen, ist viel zu komplex, als das, was GridBagLayout für Sie tun kann - Alle Konfigurationen, die Sie vermeiden möchten, sind immer noch einfacher als das Schreiben von LKW-Code. –

0

Wenn Sie zwei Komponenten in jeder Zeile verwenden möchten, verwenden Sie den Standard GridLayout.

Sie die Komponenten durch die Angabe wickeln erzwingen können, dass Sie nur zwei Spalten von Komponenten wollen:

GridLayout layout = new GridLayout(0, 2); 
JPanel panel = new JPanel(layout); 
+0

Ich habe GridLayout versucht, aber die Komponenten füllen den ganzen Fall und es ist hässlich. Ist es eine Möglichkeit, das zu beheben? – PYRRH4

+0

@ PYRRH4, 'aber die Komponenten füllen den ganzen Fall '- weiß nicht, was das bedeutet. – camickr

+0

Ein einfaches Beispiel (Sie können sehen, dass die Schaltflächen sehr, sehr groß sind): http://imgur.com/a/zRZ5Y – PYRRH4