Как использовать GridBagConstraints для создания макета? - PullRequest
2 голосов
/ 26 января 2012

Я хочу расположить свой JPane так:

-------
|     |
|     |
|     |
-------
|     |
-------

Таким образом, верхняя секция больше / выше нижней секции (верхняя секция состоит из другого JPanel и использует объект Graphics для отображенияизображение, в то время как нижняя часть также состоит из другого JPanel, но использует объект Graphics для рисования линий и текста.

Я слышал, что лучший способ сделать это - использовать GridBagLayout и GridBagConstraints.1006 *

Я пытаюсь выяснить подходящие свойства для GridBagConstraints, и у меня возникли некоторые трудности.Это то, что у меня есть ...

Для верхней части у меня есть:

gridx = 0
gridy = 0
weighty = 1.0; // expand downwards, because the bottom should never expand in the Y direction
fill = GridBagConstraints.BOTH

Для нижней части у меня есть:

gridx = 0
gridy = 1
fill = GridBagConstraints.HORIZONTAL
anchor = GridBagConstraints.PAGE_END

К сожалению, все заканчивается тем, что появляется большой серый прямоугольник (у меня белый фон для приложения) - изображения не загружаются, строки / текст не отображаются.

Что мне делать?Что я должен настроить?

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

Ответы [ 3 ]

5 голосов
/ 26 января 2012

В общем, для макета мешка сетки

  • если вы хотите масштабировать компонент, вы должны указать для его направления шкалы вес, и любые размеры (ширина / высота), установленные вами для этого направления, будут игнорироваться менеджером макета.

  • Если вы не хотите масштабировать компонент, для компонента должен быть определен его размер (если вы хотите, вы можете изучить эту тему в документах Java). В вашем случае с нижней панелью вам нужно указать, по крайней мере, ее предпочтительную высоту.

Это может работать как ваше ожидание

pnlTop.setBackground(Color.WHITE);
pnlBottom.setBackground(Color.BLUE);

// Because you don't want the bottom panel scale, you need to give it a height.
// Because you want the bottom panel scale x, you can give it any width as the
// layout manager will ignore it.
pnlBottom.setPreferredSize(new Dimension(1, 20));


getContentPane().setLayout(new GridBagLayout());
GridBagConstraints cst = new GridBagConstraints();
cst.fill = GridBagConstraints.BOTH;
cst.gridx = 0;
cst.gridy = 0;
cst.weightx = 1.0; // --> You miss this for the top panel
cst.weighty = 1.0;
getContentPane().add(pnlTop, cst);

cst = new GridBagConstraints();
cst.fill = GridBagConstraints.HORIZONTAL;
cst.gridx = 0;
cst.gridy = 1;
cst.weightx = 1.0; // You miss this for the bottom panel
cst.weighty = 0.0;
getContentPane().add(pnlBottom, cst);

Более того, если вы хотите использовать макет gridbag, я рекомендую вам попробовать библиотеку painless-gridbag http://code.google.com/p/painless-gridbag/ (я являюсь автором этой библиотеки). Это не решит эту проблему для вас (так как ваша проблема касается управления размером компонента в компоновке gridbag), но это сэкономит вам много печатания и облегчит поддержку вашего кода

pnlBottom.setPreferredSize(new Dimension(1, 20));

PainlessGridBag gbl = new PainlessGridBag(getContentPane(), false);
gbl.row().cell(pnlTop).fillXY();
gbl.row().cell(pnlBottom).fillX();
gbl.done();
2 голосов
/ 26 января 2012

не уверен из вашего вопроса, возможно, поможет вам Верх на 70%, Низ на 30%

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;

public class BorderPanels extends JFrame {

    private static final long serialVersionUID = 1L;

    public BorderPanels() {
        getContentPane().setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        JPanel panel1 = new JPanel();
        Border eBorder = BorderFactory.createEtchedBorder();
        panel1.setBorder(BorderFactory.createTitledBorder(eBorder, "70pct"));
        gbc.gridx = gbc.gridy = 0;
        gbc.gridwidth = gbc.gridheight = 1;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.anchor = GridBagConstraints.NORTHWEST;
        gbc.weightx = gbc.weighty = 70;
        getContentPane().add(panel1, gbc);
        JPanel panel2 = new JPanel();
        panel2.setBorder(BorderFactory.createTitledBorder(eBorder, "30pct"));
        gbc.gridy = 1;
        gbc.weightx = 30;
        gbc.weighty = 30;
        gbc.insets = new Insets(2, 2, 2, 2);
        getContentPane().add(panel2, gbc);
        pack();
    }

    public static void main(String[] args) {
        new BorderPanels().setVisible(true);
    }
}
0 голосов
/ 26 января 2012

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

Я не проверял это, но

FormLayout layout = new FormLayout( 
 "pref", //columns
 "50dlu:grow(0.2)","25dlu:grow(0.1)" //rows
);

может сделать трюк. Более подробную информацию о синтаксисе можно найти в формах JGoodies pdf

...