Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> BoxLayout как предотвратить растяжение вложенных, панелей 
V
    Опции темы
Mirkes
Дата 23.9.2013, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 2
Всего: 17



День добрый.

Мне нужно создать узкое окно для легенды к рисункам. Легенда как правило состоит из нескольких подпанелей и создается и меняется динамически.
Я создаю ранель легенд и размещаю его в восточную часть панели (BorderLayout).

Подпанели легенды состоят из одного - двух столбцов и я делаю их в GridBagLayout.

Все бы ничего, но вот при изменении размеров вид становится малоприличный smile 
Код

import javax.swing.*;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import java.awt.*;

public class BoxLayoutTestGBL extends JFrame{

    public BoxLayoutTestGBL(){
        super("BoxLayout");
        final JPanel content = new JPanel();
        content.setBorder(BorderFactory.createLineBorder(Color.red));
        content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));

    JPanel pan1 = new JPanel();
    pan1.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLACK), "Legend"));

    pan1.setLayout(new GridBagLayout());


        JLabel lbl = new JLabel("Label 1");
        lbl.setBorder(BorderFactory.createLineBorder(Color.blue));
        lbl.setFont(lbl.getFont().deriveFont(30f));
        pan1.add(lbl, new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
            new Insets(5, 5, 5, 5), 0, 0));


        lbl = new JLabel("Label 2");
        lbl.setBorder(BorderFactory.createLineBorder(Color.blue));
        lbl.setFont(lbl.getFont().deriveFont(30f));
        pan1.add(lbl, new GridBagConstraints(0, 1, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
            new Insets(5, 5, 5, 5), 0, 0));

    content.add(pan1);

    pan1 = new JPanel();
    pan1.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLACK), "Legend"));

    pan1.setLayout(new GridBagLayout());


        lbl = new JLabel("Label 3");
        lbl.setBorder(BorderFactory.createLineBorder(Color.blue));
        lbl.setFont(lbl.getFont().deriveFont(30f));
        pan1.add(lbl, new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
            new Insets(5, 5, 5, 5), 0, 0));

        lbl = new JLabel("Label 4");
        lbl.setBorder(BorderFactory.createLineBorder(Color.blue));
        lbl.setFont(lbl.getFont().deriveFont(30f));
        pan1.add(lbl, new GridBagConstraints(0, 1, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
            new Insets(5, 5, 5, 5), 0, 0));

    content.add(pan1);

        getContentPane().add(content, BorderLayout.EAST);
        setSize(410,220);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public static void main(String[] args){
        JFrame.setDefaultLookAndFeelDecorated(true);
        new BoxLayoutTestGBL().setVisible(true);
    }
}


А хотелось бы вот такого поведения:
Код

import javax.swing.*;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import java.awt.*;

public class BoxLayoutTest extends JFrame{

    public BoxLayoutTest(){
        super("BoxLayout");
        final JPanel content = new JPanel();
        content.setBorder(BorderFactory.createLineBorder(Color.red));
        content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));

    JPanel pan1 = new JPanel();
    pan1.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLACK), "Legend"));

    pan1.setLayout(new BoxLayout(pan1, BoxLayout.Y_AXIS));


        JLabel lbl = new JLabel("Label 1");
        lbl.setBorder(BorderFactory.createLineBorder(Color.blue));
        lbl.setFont(lbl.getFont().deriveFont(30f));
    pan1.add(lbl);

        lbl = new JLabel("Label 2");
        lbl.setBorder(BorderFactory.createLineBorder(Color.blue));
        lbl.setFont(lbl.getFont().deriveFont(30f));
    pan1.add(lbl);
    content.add(pan1);

    pan1 = new JPanel();
    pan1.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLACK), "Legend"));

    pan1.setLayout(new BoxLayout(pan1, BoxLayout.Y_AXIS));


        lbl = new JLabel("Label 3");
        lbl.setBorder(BorderFactory.createLineBorder(Color.blue));
        lbl.setFont(lbl.getFont().deriveFont(30f));
    pan1.add(lbl);

        lbl = new JLabel("Label 4");
        lbl.setBorder(BorderFactory.createLineBorder(Color.blue));
        lbl.setFont(lbl.getFont().deriveFont(30f));
    pan1.add(lbl);

    content.add(pan1);

        getContentPane().add(content, BorderLayout.CENTER);
        setSize(410,220);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public static void main(String[] args){
        JFrame.setDefaultLookAndFeelDecorated(true);
        new BoxLayoutTest().setVisible(true);
    }
}


Заранее благодарен за совет smile


--------------------
Mirkes
PM MAIL   Вверх
Mirkes
Дата 24.9.2013, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 2
Всего: 17



Нашел некоторое решение, хотя возможно и не оптимальное. Но вроде работает. Вместо JPanel использую свой класс-обертку
Код

    private class MyPanel extends JPanel{
      public Dimension getMaximumSize() {
        return new Dimension(Integer.MAX_VALUE,getPreferredSize().height);
      }
    }    


Вот полностью работающий образец.

Код

import javax.swing.*;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import java.awt.*;

public class BoxLayoutTestGBL extends JFrame{

    public BoxLayoutTestGBL(){
        super("BoxLayout");
        final JPanel content = new JPanel();
        content.setBorder(BorderFactory.createLineBorder(Color.red));
        content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));

    MyPanel pan1 = new MyPanel();
    pan1.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLACK), "Legend"));

    pan1.setLayout(new GridBagLayout());


        JLabel lbl = new JLabel("Label 1");
        lbl.setBorder(BorderFactory.createLineBorder(Color.blue));
        lbl.setFont(lbl.getFont().deriveFont(30f));
//    pan1.add(lbl);
        pan1.add(lbl, new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
            new Insets(5, 5, 5, 5), 0, 0));


        lbl = new JLabel("Label 2");
        lbl.setBorder(BorderFactory.createLineBorder(Color.blue));
        lbl.setFont(lbl.getFont().deriveFont(30f));
//    pan1.add(lbl);
        pan1.add(lbl, new GridBagConstraints(0, 1, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
            new Insets(5, 5, 5, 5), 0, 0));

    content.add(pan1);

    pan1 = new MyPanel();
    pan1.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLACK), "Legend"));

    pan1.setLayout(new GridBagLayout());


        lbl = new JLabel("Label 3");
        lbl.setBorder(BorderFactory.createLineBorder(Color.blue));
        lbl.setFont(lbl.getFont().deriveFont(25f));
//    pan1.add(lbl);
        pan1.add(lbl, new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
            new Insets(5, 5, 5, 5), 0, 0));

        lbl = new JLabel("Label 4");
        lbl.setBorder(BorderFactory.createLineBorder(Color.blue));
        lbl.setFont(lbl.getFont().deriveFont(25f));
//    pan1.add(lbl);
        pan1.add(lbl, new GridBagConstraints(0, 1, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
            new Insets(5, 5, 5, 5), 0, 0));

    content.add(pan1);


//        content.add(Box.createHorizontalStrut(5));
//        content.add(Box.createHorizontalStrut(5));
//        content.add(Box.createHorizontalGlue());

        getContentPane().add(content, BorderLayout.EAST);
        setSize(410,220);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public static void main(String[] args){
        JFrame.setDefaultLookAndFeelDecorated(true);
        new BoxLayoutTestGBL().setVisible(true);
    }

    private class MyPanel extends JPanel{
      public Dimension getMaximumSize() {
        return new Dimension(Integer.MAX_VALUE,getPreferredSize().height);
      }
    }    
}




--------------------
Mirkes
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0424 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.