Получить предпочтительный размер многострочной схемы

Я не могу придумать способ изменить размер некоторых компонентов в графическом интерфейсе Swing. Некоторые настраиваемые метки добавляются в FlowLayout, который не ведет себя должным образом при изменении размера диалогового окна. Панель строится с использованием фреймворка jgoodies forms.

При использовании этого, где FlowLayout добавляется к xy (3, y)

FormLayout layout = new FormLayout("r:d, 5px, f:d:g", // columns
            "p, p, 5px, p, 5px, p") // rows

FlowLayout расширяется, и появляется полоса прокрутки
tags_scroll

При использовании

FormLayout layout = new FormLayout("r:d, 5px, f:10:g", // columns
            "p, p, 5px, p, 5px, p") // rows

FlowLayout использует доступное пространство и элементы на вторая строка исчезает
tags_vanish

Я бы хотел увеличить высоту каждой строки, содержащей FlowLayout, до текущей высоты компонента. К сожалению, предпочтительный размер всегда соответствует высоте одной строки.
Будет ли более подходящим другой макет? Полужирный текст слева должен быть выровнен по правому краю, за ним следует FlowLayout.

Источники

[править] После недельных попыток выяснить, как это сделать, можно задать следующий вопрос:
Набор меток добавляется в JPanel. Эта панель JPanel должна использовать все доступное пространство по горизонтали (размер диалогового окна минус ширина метки имени тега) и при необходимости расширяться по вертикали. Если высота панели JPanel становится больше, чем у диалогового окна, должна появиться вертикальная полоса прокрутки (горизонтальная полоса прокрутки никогда не отображается).В диалоговом окне может отображаться несколько панелей JPanel, которые будут отображаться одна за другой (по вертикали).

Вот попытка использования GridBagLayout и WrapLayout :

public class GridBagLayoutTagPanel extends JPanel {
private static final long serialVersionUID = -441746014057882848L;
private final int NB_TAGS = 5;

public GridBagLayoutTagPanel() {
    setLayout(new GridLayout());

    JPanel pTags = new JPanel(new GridBagLayout());
    pTags.setBackground(Color.ORANGE);
    GridBagConstraints c = new GridBagConstraints();
    c.ipadx = 5;
    c.ipady = 5;

    int rowIndex = 0;
    for (int i = 0; i < NB_TAGS; i++) {
        //add tag name
        JLabel lTagName = new JLabel(String.format("Tag %s:", i));
        lTagName.setFont(lTagName.getFont().deriveFont(Font.BOLD));
        c.fill = GridBagConstraints.NONE;
        c.gridx = 0;
        c.gridy = rowIndex++;
        pTags.add(lTagName, c);

        //add tag values
        JPanel pTag = new JPanel(new BorderLayout());
        pTag.add(new JLabel("+"), BorderLayout.LINE_START); //label used to add new tags
        pTag.add(getWrapPanel(), BorderLayout.CENTER); //the list of tag values
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 1;
        pTags.add(pTag, c);
    }

    //JScrollPane sp = new JScrollPane(pTags);
    //sp.setBorder(BorderFactory.createEmptyBorder());

    add(pTags);
    }

private static JPanel getWrapPanel() {
   JPanel p = new JPanel(new WrapLayout(FlowLayout.LEFT, 5, 0));

   for (int i = 0; i < 50; i++) {
           p.add(new JLabel("t" + i));
   }
   return p;
}

public static void main(String[] args) {
    JFrame f = new JFrame();
    f.getContentPane().add(new GridBagLayoutTagPanel());
    f.setSize(new Dimension(500, 300));
    f.setVisible(true);
}
}

7
задан Philippe 27 January 2012 в 10:04
поделиться