Макет Mig: плохое выравнивание

У меня проблема с макетом Мига. Я начал воссоздавать основную JPanel JFrame, где в прошлом использовал абсолютный макет. Сначала все шло хорошо (см. второе изображение). Панель консоли (часть коробки с панелью вкладок) имела хорошее выравнивание, но все же абсолютный макет. Когда я начал преобразовывать макет отдельных панелей JPanel в макет Mig, он выглядел как первое изображение (без выравнивания по левому краю). Тот же результат справедлив и для других панелей JPanel, где я изменил абсолютный макет на макет Mig.

https://i.stack.imgur.com/97Yop.png [ПЛОХО] https://i.stack.imgur.com/KTLGK.png [ХОРОШО]

https://i.stack.imgur.com/p3qWZ.png [отладка 1000 выравнивания]

Вот уменьшенная версия моего класса фреймов. Структура выглядит странно, потому что я старался максимально уменьшить ее. Я также удалил ControlConsolePanel, потому что моя проблема возникает даже с JPanel по умолчанию с MigLayout.

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.border.Border;
import javax.swing.border.TitledBorder;
import net.miginfocom.swing.MigLayout;

public class MainControll extends JFrame{

    private static final long serialVersionUID = 14L;
private JPanel configurationPane;
private JPanel feedbackPane;
private JTextArea feedback;
private JTabbedPane plotTabPane;
private JPanel consolePane;

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run(){
            try {
                MainControll frame = new MainControll();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

public MainControll(){
    setTitle("test");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 860, 660);
    initiateComponents();
}

private Box rightPanel;

private void initiateComponents() {
        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new MigLayout("insets 0, debug 1000", "", ""));

            this.configurationPane = new JPanel();
            this.configurationPane.setBorder(getTitleBorder("Configuration"));
            this.configurationPane.setLayout(new MigLayout());

        this.plotTabPane = new JTabbedPane();
            this.plotTabPane.add("Tab1", new JPanel());
            this.consolePane = new JPanel(new MigLayout("","",""));
            // --> The MigLayout ruins the frame.
            // --> change it to this and look at the difference:
            //                  this.consolePane = new JPanel();
            this.consolePane.setBorder(getTitleBorder("Console"));

            this.feedback = new JTextArea();
        this.feedbackPane = new JPanel();
        this.feedbackPane.setBorder(getTitleBorder("Status"));
        this.feedbackPane.setLayout(new MigLayout());
        JScrollPane sbrText = new JScrollPane(this.feedback);
        this.feedbackPane.add(sbrText, "push, grow");

        this.rightPanel = new Box(BoxLayout.Y_AXIS);
        this.rightPanel.add(this.plotTabPane);
            this.rightPanel.add(this.consolePane);

        mainPanel.add(this.configurationPane, "shrinky, top, w 450!");
        mainPanel.add(this.rightPanel, "spany 5, wrap, grow, pushx, wmin 400");
        mainPanel.add(this.feedbackPane, "pushy, growy, w 450!");

        JScrollPane contentScrollPane = new JScrollPane(mainPanel);
        contentScrollPane.setBorder(BorderFactory.createEmptyBorder());
        setContentPane(contentScrollPane);
}

private Border getTitleBorder(String title){
    return BorderFactory.createTitledBorder(null, title, TitledBorder.LEFT,       TitledBorder.TOP, new Font("null", Font.BOLD, 12), Color.BLUE);
}
 }

Цель: Дело в том, что я хочу, чтобы панель консоли и панель графика соответствовали правой панели без зазоров (идеальное выравнивание границ), расширялись и сжимались в зависимости от поведения увеличения и уменьшения правой панели.

Редактировать: я сделал недавнее открытие. Это работает, если я помещаю панель макета Mig в JTabbedPane. Это не сработает, если я размещу панель макета Mig в отдельной JPanel. Но как и почему, я понятия не имею. введите здесь описание изображения


person Matthias    schedule 09.10.2012    source источник
comment
понятия не имею (недостаточно информации) всего пара общих замечаний: а) не используйте вложенные панели б) не используйте рамки с заголовками в) не жестко кодируйте пиксели   -  person kleopatra    schedule 10.10.2012
comment
Я не думаю, что информации достаточно, чтобы сделать вывод. Одна простая вещь, которая может вам помочь, — это добавить отладку 1000 к ограничениям макета, которая покажет вам границы сетки и компонентов.   -  person Jacob Raihle    schedule 10.10.2012
comment
* Я добавил отладку 1000 на главную панель и панель консоли. Правая панель (=Box) имеет правильное выравнивание, как и предполагалось, а ее левая граница совпадает с границей панели вкладок. Однако левая граница панели консоли не совпадает с левой границей правой панели.   -  person Matthias    schedule 10.10.2012


Ответы (1)


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


import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.border.Border;
import javax.swing.border.TitledBorder;
import net.miginfocom.swing.MigLayout;

public class MainControl extends JFrame {

    private static final long serialVersionUID = 14L;
    private JPanel configurationPane;
    private JPanel feedbackPane;
    private JTextArea feedback;
    private JTabbedPane plotTabPane;
    private JPanel consolePane;
    private JPanel rightPanel;

    public MainControl() {
        setTitle("test");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 860, 660);
        initiateComponents();
    }

    private void initiateComponents() {
        JPanel mainPanel = new JPanel();

        configurationPane = new JPanel();
        configurationPane.setBorder(getTitleBorder("Configuration"));
        configurationPane.setLayout(new MigLayout());

        plotTabPane = new JTabbedPane();
        plotTabPane.add("Tab1", new JPanel());

        consolePane = new JPanel(new MigLayout("", "", ""));
        consolePane.setBorder(getTitleBorder("Console"));

        feedback = new JTextArea();
        feedbackPane = new JPanel();
        feedbackPane.setBorder(getTitleBorder("Status"));
        feedbackPane.setLayout(new MigLayout());
        JScrollPane sbrText = new JScrollPane(feedback);
        feedbackPane.add(sbrText, "push, grow");

        rightPanel = new JPanel(new MigLayout("fill"));
        rightPanel.add(plotTabPane, "grow, wrap");
        rightPanel.add(consolePane, "grow");

        mainPanel.setLayout(new MigLayout("insets 0, debug 1000", "", ""));
        mainPanel.add(configurationPane, "shrinky, top, w 450!");
        mainPanel.add(rightPanel, "spany 5, wrap, grow, pushx, wmin 380");
        mainPanel.add(feedbackPane, "pushy, growy, w 450!");

        JScrollPane contentScrollPane = new JScrollPane(mainPanel);
        contentScrollPane.setBorder(BorderFactory.createEmptyBorder());
        setContentPane(contentScrollPane);
    }

   private static Border getTitleBorder(String title) {
        return BorderFactory.createTitledBorder(null, title, TitledBorder.LEFT, TitledBorder.TOP, new Font("null", Font.BOLD, 12), Color.BLUE);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    MainControl frame = new MainControl();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}
person Trilarion    schedule 03.05.2013