2017-02-18 7 views
0

Я создаю приложения Java и в настоящее время я использую этот менеджер компоновки:качания - изменение LayoutManager: два компонента в каждой строке

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 + "]"; 
    } 
} 

Пример использования (компоненты выровнены по вертикали):

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

Как вы можете видеть, каждый компонент находится на одной линии. Но я хотел бы, чтобы некоторые компоненты были двумя на одной линии.

Например, JButtons будет на одной линии, точно так же, как сейчас. То же самое для JTextAreas.

Но, я хотел бы иметь JLabels и JTextFields в одной строке. И то же самое для JLabels и JComboBoxs, в той же строке.

И я действительно не знаю, как это сделать. Может ли кто-нибудь объяснить мне? : D

ответ

1

Прежде всего, действительно сложно понять, почему вы создаете собственный макет? Посмотрите GridBagLayout

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

Потребительной случаи вы объясняющая может быть легко выполнимо с помощью GridBagLayout.

+0

хорошо, GridBagLayout отчасти сложны в использовании, и вместо настройки много вещей, которые я хотел бы сделайте его «автоматическим» (1 или 2 строки кода) – PYRRH4

+0

Опять же позвольте мне сказать вам, что потратить немного больше времени на GrigBagLayout сделает мир добра. Если вы все еще хотите реализовать свой собственный менеджер макетов, сделайте это, расширив GridBagLayout. Используйте два столбца GridBagLayout. Для компонентов, которые должны иметь полную строку, сохраняйте ширину сетки равной 2. Для других добавьте их с шириной сетки 1. То, что вы пытаетесь сделать, слишком сложное, чем то, что GridBagLayout может сделать для вас - все конфигурации, которые вы пытаетесь избежать, все же проще, чем писать грузовик с кодом. –

0

Если вы хотите, чтобы на каждой линии были два компонента, используйте стандарт GridLayout.

Вы можете заставить компоненты завернуть, указав, что вы хотите только две колонки компонентов:

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

Я пробовал GridLayout, но компоненты заполняют весь корпус, и это уродливо. Это способ исправить это? – PYRRH4

+0

@ PYRRH4, «но компоненты заполняют весь случай» - не знаю, что это значит. – camickr

+0

Простой пример (вы можете видеть, что кнопки очень большие): http://imgur.com/a/zRZ5Y – PYRRH4

Смежные вопросы