Как я могу контролировать общие ограничения размера панели с MigLayout? - PullRequest
3 голосов
/ 07 августа 2009

Я тестирую MigLayout для проекта и, похоже, не могу понять, как MigLayout контролирует размер всей разрабатываемой панели. Я адаптирую пример в MigLayout . Кроме того, я пишу на Python и использую Jython, а не на Java. Тем не менее, вот мой текущий код.

layout = MigLayout("fillx",
                   # Column constraints
                   "[right]rel[grow,fill]",
                   # Row constraints
                   "[]10[]10[]")
panel = JPanel(layout)

panel.add(JLabel("Enter size:"),
          "")
panel.add(JTextField(""),
          "wrap, width 150:250")
panel.add(JLabel("Enter weight:"),
          "")
panel.add(JTextField(""),
          "wrap, width 150:250")
panel.add(JButton("Ok"),
          "span 2, align center, width 100:150")

Затем панель переходит в JFrame для отображения. Когда я изменяю размер кадра, элементы управления изменяют размер красиво и подчиняются своим минимальным размерам. Однако минимального размера рамки нет, и, похоже, нет никакого способа добраться до реального минимального размера панели, чтобы установить ее для рамки. При запросе минимального размера панели возвращается размер, который при установке на рамку (плюс вставки) обрезает кнопку и половину текстовых полей.

То, что я хочу, это иметь возможность установить минимальный размер для рамки (не жестко закодированный!) Так, чтобы панель подходила и ни один из ее элементов управления не был обрезан. Каков наилучший способ сделать это?

Ответы [ 3 ]

2 голосов
/ 27 августа 2009

Лично я бы не стал особо подчеркивать минимальный размер при условии, что предпочтительный размер (который вы получаете после pack () уместен. Если по какой-то причине пользователь хочет уменьшить окно до размера, при котором компоненты в нем обрезаются, а затем позволяют им. Может быть, они просто хотят, чтобы нижняя часть вашего окна была в стороне, чтобы они могли одновременно видеть, что осталось, и что-то еще на своем мониторе.

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

С помощью любого из нескольких сетевых менеджеров таблиц, таких как MIG Layout, вы сможете легко получить желаемое поведение при изменении размера.

Бесстыдная самостоятельная вилка: если вам трудно использовать MIG Layout, мой MatrixLayout , мне кажется, проще в использовании. Но макет MIG более мощный. Я сознательно выбрал код MatrixLayout, чтобы не препятствовать уменьшению панелей ниже расчетного минимального размера.

2 голосов
/ 26 августа 2009

Как насчет метода pack ???

Обновление:

Теперь я понимаю, что вы пытаетесь сделать. Извините, что разочаровал вас, но 90% автономных приложений написаны с

  1. Диалоговые окна, которые имеют фиксированный размер (неизменяемый размер) и идеально настроены на содержимое

  2. Основные окна, которые можно изменять, но имеют минимальный размер (например, 800x600)

То, что вы хотите (окно с изменяемым размером без жестко заданных значений) возможно, но очень трудно достичь (это другие 10% приложений)

Поскольку у Java Swing есть печально известные трудности с версткой (это главная причина существования такого количества менеджеров по разметке), я предлагаю вам следовать легким путем.

Вы можете играть с методами setPrefferedSize и setMinimum size различных компонентов, но будет трудно довести его до совершенства.

0 голосов
/ 07 октября 2016

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

  1. Создайте JPanel panel в качестве рабочей панели вместо прикосновения к contentPane. Просто добавьте его обратно в contentPane. Не прикасайтесь к contentPane, это ключ.

  2. Установите макет panel без жестко заданной высоты строки, ширины столбца и т. Д. Это может испортить компоновку, поскольку ваша жестко закодированная высота может быть меньше или больше ее требуется, в результате чего некоторые строки будут иметь неправильный размер, и оставьте свою последнюю строку / колонку наполовину обрезанной.

  3. Добавьте ваши элементы в panel. При их добавлении вы можете указать размеры.

  4. Добавить panel обратно к contentPane: getContentPane().add(panel); Нам не нужно устанавливать макет contentPane.

  5. Наконец, pack(), setVisible(true), как вы хотите. Нет необходимости setSize(), setBounds() и т. Д. Вставки и пробелы будут обрабатываться автоматически MigLayout. Альт!

SCCEE:

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import net.miginfocom.swing.MigLayout;

public class InsetsAndBorder extends JFrame {
    public InsetsAndBorder() {
        begin();
    }

    private void begin() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        panel.setLayout(new MigLayout("insets 2 2 2 2, fillx, debug", "3[]3[]3[]3", "5[]5[]5[]5"));

        JLabel label1 = new JLabel("1");
        JLabel label2 = new JLabel("2");

        JButton button = new JButton("No way!");

        panel.add(label1, "cell 1 2, grow");

        panel.add(label2, "cell 2 2, grow");

        panel.add(button, "cell 0 1, grow");

        getContentPane().add(panel);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                InsetsAndBorder frame = new InsetsAndBorder();

            }

        });
    }
}
...