Как разместить метки различной высоты в двух строках с помощью GridBagLayout? - PullRequest
2 голосов
/ 02 октября 2010

Я пытаюсь использовать GridBagLayout для размещения меток в двух строках, но я хочу, чтобы некоторые метки занимали обе строки, а другие располагались друг над другом.Мне нужно использовать GridBagLayout из-за функциональности пропорционального размера в свойствах weightx и weighty GridBagConstraints.Это макет, который я ищу:

+----------+----------+----------+----------+
|          |          |  labelC  |          |
|  labelA  |  labelB  |----------|  labelD  |
|          |          |  labelE  |          |
+----------+----------+----------+----------+

Проблема в том, что labelE находится под LabelA.Вот часть макета моего кода:

GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
this.setLayout(gridBag);
c.fill = GridBagConstraints.BOTH;

c.gridwidth = 1;
c.gridheight = 2;
c.weighty = PANEL_HEIGHT;
gridbag.setConstraints(labelA, c);
this.add(labelA);

gridbag.setConstraints(labelB, c);
this.add(labelB);

c.gridheight = 1;
c.weighty = TOPROW_HEIGHT;
gridbag.setConstraints(labelC, c);
this.add(labelC);

c.gridheight = 2;
c.gridwidth = GridBagConstraints.REMAINDER;
c.weighty = PANEL_HEIGHT;
gridbag.setConstraints(labelD, c);
this.add(labelD);

c.gridheight = 1;
c.gridwidth = 1;
c.weighty = BOTROW_HEIGHT;
gridbag.setConstraints(labelE, c);
this.add(labelE);

this.validate();

Есть идеи о том, что мне не хватает?

Ответы [ 4 ]

1 голос
/ 02 октября 2010

Вам нужно установить gridX и gridY:

GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
this.setLayout(gridBag);
c.fill = GridBagConstraints.BOTH;

c.gridwidth = 1;
c.gridheight = 2;
c.gridx = 0;
c.gridy = 0;
c.weighty = PANEL_HEIGHT;
gridbag.setConstraints(labelA, c);
this.add(labelA);

c.gridx = 1;
c.gridy = 0;
gridbag.setConstraints(labelB, c);
this.add(labelB);

c.gridx = 2;
c.gridy = 0;
c.gridheight = 1;
c.weighty = TOPROW_HEIGHT;
gridbag.setConstraints(labelC, c);
this.add(labelC);

c.gridx = 3;
c.gridy = 0;
c.gridheight = 2;
c.gridwidth = GridBagConstraints.REMAINDER;
c.weighty = PANEL_HEIGHT;
gridbag.setConstraints(labelD, c);
this.add(labelD);

c.gridx = 2;
c.gridy = 1;
c.gridheight = 1;
c.gridwidth = 1;
c.weighty = BOTROW_HEIGHT;
gridbag.setConstraints(labelE, c);
this.add(labelE);

this.validate();

Надеюсь, это поможет.

1 голос
/ 02 октября 2010

Вы можете использовать gridx и gridy, чтобы выбрать свою позицию в сетке:

    GridBagLayout gridbag = new GridBagLayout();
    GridBagConstraints c = new GridBagConstraints();

    this.setLayout(gridbag);

    c.fill = GridBagConstraints.BOTH;

    c.gridwidth = 1;
    c.gridheight = 2;
    c.gridx = 0;
    c.gridy = 0;
    c.weighty = PANEL_HEIGHT;
    gridbag.setConstraints(labelA, c);
    this.add(labelA);

    c.gridx = 1;
    c.gridy = 0;
    gridbag.setConstraints(labelB, c);
    this.add(labelB);

    c.gridx = 2;
    c.gridy = 0;
    c.gridheight = 1;
    c.weighty = TOPROW_HEIGHT;
    gridbag.setConstraints(labelC, c);
    this.add(labelC);


    c.gridx = 3;
    c.gridy = 0;
    c.gridheight = 2;
    c.gridwidth = GridBagConstraints.REMAINDER;
    c.weighty = PANEL_HEIGHT;
    gridbag.setConstraints(labelD, c);
    this.add(labelD);

    c.gridx = 2;
    c.gridy = 1;
    c.fill = GridBagConstraints.VERTICAL;
    c.gridheight = 1;
    c.gridwidth = 1;
    c.weighty = BOTROW_HEIGHT;
    gridbag.setConstraints(labelE, c);
    this.add(labelE);

    this.validate();
0 голосов
/ 02 октября 2010

Самый простой способ решить эту проблему (используя GridBag) - это иметь labelC и labelE внутри JPanel.

Более сложный способ ее решения - использовать ограничения gridx, gridy и gridheight. Итак, у вас будет

+---------------+--------------+----------+----------+
|  gridy=0      | gridy=0      |  gridy=0 |  gridy=0 |
|               |              |  gridx=2 |  gridx=3 |
|  gridx=0      | gridx=1      |----------|          |
|  gridheight=2 | gridheight=2 |  gridy=1 |          |        
|               |              |  gridx=2 |          |
+---------------+--------------+----------+----------+
0 голосов
/ 02 октября 2010

Мое предложение заключается в том, что вы можете сделать выше, не используя GridBaglayout.Это сэкономит вам много времени и уменьшит количество строк.Для вашей конкретной задачи вы можете добиться того, что вы пытаетесь использовать, используя простой макет сетки.

Создайте один GridLayout размера 1x4Для третьего столбца вы можете использовать другой GridLayout размером 2x1.Поместите их все на место, и вы должны достичь того, что вы хотите.

http://img823.imageshack.us/img823/5643/screenshot20101002at225.png

import java.awt.Component;
import java.awt.GridLayout;

import javax.swing.*;

public class LayoutTest extends JFrame {

    public LayoutTest(){
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.setSize(300,75);
        this.add(getCustomPanel());
        this.setVisible(true);
    }

    private Component getCustomPanel() {
        JPanel pnl = new JPanel();
        GridLayout gridLayout = new GridLayout(1,4);
        pnl.setLayout(gridLayout);

        JPanel subPanel = new JPanel();
        GridLayout subLayout = new GridLayout(2,1);
        subPanel.setLayout(subLayout);

        subPanel.add(new JLabel("labelC"));
        subPanel.add(new JLabel("labelE"));

        pnl.add(new JLabel("labelA"));
        pnl.add(new JLabel("labelB"));
        pnl.add(subPanel);
        pnl.add(new JLabel("labelD"));

        return pnl;
    }

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