Получить предпочтительный размер многострочного разметки - PullRequest
7 голосов
/ 12 января 2012

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

При использовании этого, когда 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 становится больше, чем в диалоговом окне, должна появиться вертикальная полоса прокрутки (горизонтальная полоса прокрутки никогда не видна).Диалог может отображать несколько JPanels, которые будут отображаться один за другим (по вертикали).

Вот попытка с использованием 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);
}
}

Ответы [ 3 ]

11 голосов
/ 13 января 2012

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

Wrap Layout обрабатывает это.

3 голосов
/ 01 февраля 2012

С помощью Роба и с помощью WrapPanel и ScrollablePanel теперь он работает точно так же, как и должен

public class GridBagLayoutTagPanel extends JPanel {
  private final int NB_TAGS = 5;
  private final int NB_TAGVALUES = 50;

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

    ScrollablePanel pTags = new ScrollablePanel(new GridBagLayout());
    pTags.setScrollableWidth(ScrollablePanel.ScrollableSizeHint.FIT);
    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++;
      c.weightx = 0; // keep minimum size of the cell containing the label when resizing
      c.weighty = 0;
      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;
      c.weightx = 1; // fill horizontally
      c.weighty = 1;
      pTags.add(pTag, c);
   }

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

   add(sp);
  }

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

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

    p.setSize(400, 1);
    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);
  }
}
2 голосов
/ 31 января 2012

Вы пробовали MigLayout ?Это единственный менеджер макетов, который я использую, и я никогда не находил макет, который я не смог бы сделать.

...