Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Layouts...


Автор: PashaOvechkin 4.2.2008, 16:04
Привет! 
есть свинг фрейм (его можно посмотреть в атачменте)

Фрейм уже готов, нужно его немного переделать...
Layouts знаю плохо, поетому необходим совет

Вот сдесь  можно посмотреть код Фреима 

Код


        JPanel container = new JPanel();
        container.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.insets = new Insets(0, 10, 5, 10);
        c.weightx = 1.0; c.weighty = 0.5;
        c.anchor = GridBagConstraints.WEST;
        c.fill = GridBagConstraints.HORIZONTAL;
        int gridY = 0;

        c.gridx = 0; c.gridy = gridY++;
        container.add(Box.createRigidArea(new Dimension(0, 8)));

        // Ticker
        labelTicker = new JLabel();
        tickerPanel = new JPanel();
        //        tickerPanel.setBackground(Color.white);
        tickerPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
        tickerPanel.add(labelTicker);
        JPanel instrPanel = new JPanel();
        instrPanel.setBorder(BorderFactory.createTitledBorder("Instrument:"));
        instrPanel.add(tickerPanel);
        c.gridx = 0; c.gridy = gridY++;
        container.add(instrPanel, c);

    
        JPanel orderPanel = new JPanel();
        orderPanel.setLayout(new BoxLayout(orderPanel, BoxLayout.Y_AXIS));
        orderPanel.setBorder(BorderFactory.createTitledBorder("Orders:"));
        orderPanel.add(labelOrderInfo1);
        orderPanel.add(labelOrderInfo2);
        orderPanel.add(labelOrderInfo3);
        c.gridx = 0; c.gridy = gridY++;
        container.add(orderPanel, c);

        

            alertsPanel = new JPanel();
            alertsPanel.setLayout(new BoxLayout(alertsPanel, BoxLayout.PAGE_AXIS));
            alertsPanel.setBorder(BorderFactory.createTitledBorder("Orders:"));
                        
            c.gridx = 0; c.gridy = gridY++;
            c.ipady = 50;
            c.fill = GridBagConstraints.BOTH;
            container.add(alertsPanel, c);
            
        
        
        bOK.setName("Submit orders");
        bCancel.setName("Cancel");
        

            JPanel messagesPanel = new JPanel();
            messagesPanel.setLayout(new BoxLayout(messagesPanel, BoxLayout.Y_AXIS));
            messagesPanel.setBorder(BorderFactory.createTitledBorder("Messages:"));
            
            
            for (String i : messages){
                messagesPanel.add(new JLabel ("<html><b>" + i + "</b></html>")); 
            }
            
            c.gridx = 0; c.gridy = gridY++;
            c.ipady = 50;
            c.fill = GridBagConstraints.BOTH;
            container.add(messagesPanel, c);   
            
             JPanel questionPanel = new JPanel();
            questionPanel.setLayout(new BoxLayout(questionPanel, BoxLayout.PAGE_AXIS));
             
             
       
     
             
            c.gridx = 0; c.gridy = gridY++;
            c.ipady = 50;
            c.fill = GridBagConstraints.BOTH;
            container.add(questionPanel, c); 
        
        
        JPanel remoteControl = new JPanel();
        GridLayout gl = new GridLayout(1, 2);
        gl.setHgap(5);
        remoteControl.setLayout(gl);
        remoteControl.setBorder(BorderFactory.createEmptyBorder(5, 0, 3, 0));
       
        bOK.setMnemonic(KeyEvent.VK_S);
        bCancel.setMnemonic(KeyEvent.VK_C);
        remoteControl.add(bOK);
        remoteControl.add(bCancel);
        c.fill = GridBagConstraints.HORIZONTAL;
        c.ipady = 0;
        c.gridx = 0; c.gridy = gridY++;
        container.add(remoteControl, c);

    

        setContentPane(container);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        pack();
        setTitle("Orders preview");
       
        
        setModal(true);
        setResizable(false);


На самом деле всё очень просто... Основной шаблон во фреиме ето -> GridBagLayout
В контеинере фреима есть несколько панелек с рамкой, в каждой из них исполь зуется шабло BoxLayout.
Проблема заключается в том, что ети самые панели могу содержать в себе много леиблов в столбик...
А если леиблов много, метод pack(); основного темплейта фреима(GridBagLayout) сжимает всё так, что кнопки становятся узкими, не видно 
содержимого панелей.... Выглядит ужасно!

Подскажите пожалуйста какой шаблон выбрать или какой нить другой workaround...  smile 
Спасибо!








Автор: romanarey 4.2.2008, 18:35
Пользуй вот это!!! 
Правда это работает только в 1,5 1,6, 
Но зато довольно просто после этого изменять все размеры и отступы!!!!

http://java.sun.com/docs/books/tutorial/uiswing/layout/groupExample.html

Автор: fixxer 5.2.2008, 10:54
JGoodies FormLayout адназначна! Такая форма делается как 2 пальца обасфальт

Автор: PashaOvechkin 5.2.2008, 12:21
Спасибо за советы! решил проблему smile 

JGoodies ето классно, но в луче обходится средствами стандартной йдк... 

Автор: Platon 11.3.2008, 16:07
Цитата(romanarey @  4.2.2008,  19:35 Найти цитируемый пост)
http://java.sun.com/docs/books/tutorial/ui...oupExample.html

Разработчики Sun что издеваются над нами? Они хотят сказать, что это GroupLayout будет кто-то пользовать?! Сначала я подумал, неплохое стандартное решение, держа в голове QGroupLayout от Qt Jambi. Но приглядевшись к примеру понял, что дело-то тут совершенно пропащее. Сначала меня испугали какие-то createSequentialGroup() createParallelGroup()... увидев результат я проглатил это, т.к. очень красиво получается у них без лишних настроек, как это делается в GridBagLayout. Но потом постигло настоящее разочарование: Зачем нам формировать компоненты и вертикально и горизонтально? Кто использует стандартные выравниватели GridBagLayout, или GroupLayout? они же убивают в человеке человека!!!

Добавлено через 43 секунды
В общем, присоединяюсь к fixxer, JGoodies - это наше всё.

Автор: AntonSaburov 11.3.2008, 16:23
Посмотри тут - http://antonsaburov.narod.ru/articles/LayoutManager.html

Автор: Platon 11.3.2008, 16:32
хм, и где у вас аналог FormLayout?

Автор: AntonSaburov 11.3.2008, 16:36
Цитата(Platon @  11.3.2008,  16:32 Найти цитируемый пост)
хм, и где у вас аналог FormLayout?

Не понял я вопроса.
Тебе надо сделать красивую форму или что ? Если надо разобраться что надо - почитай о лейаутах и выбери то, что тебе надо. В принципе стандартных обычно хватает вполне.

Автор: Platon 11.3.2008, 16:38
В принципе да, я в основном использую BoxLayout и BorderLayout, но когда надо создать анкету, мне просто плохо становится от того, что это можно сделать только с помощью GridBagLayout.

Добавлено через 55 секунд
FormLayout - это божественный менеджер выравнивания от JGoodies

Добавлено через 14 минут и 1 секунду
Многие согласятся, что приведенный код просто сказка для такой формочки:

http://ipicture.ru/Gallery/Viewfull/862266.html

Код

FormLayout layout = new FormLayout(
    “pref, 4dlu, 50dlu, 4dlu, min”, // columns
    “pref, 2dlu, pref, 2dlu, pref”); // rows
layout.setRowGroups(new int[][]{{1, 3, 5}});
JPanel panel = new JPanel(layout);
CellConstraints cc = new CellConstraints();
panel.add(new JLabel(“Label1”), cc.xy (1, 1));
panel.add(textField1, cc.xyw(3, 1, 3));
panel.add(new JLabel(“Label2”), cc.xy (1, 3));
panel.add(textField2, cc.xy (3, 3));
panel.add(new JLabel(“Label3”), cc.xy (1, 5));
panel.add(textField3, cc.xy (3, 5));
panel.add(detailsButton, cc.xy (5, 5));

Автор: AlexeyVorotnikov 11.3.2008, 17:16
Цитата(Platon @  11.3.2008,  16:07 Найти цитируемый пост)
Разработчики Sun что издеваются над нами? Они хотят сказать, что это GroupLayout будет кто-то пользовать?! 

GroupLayout предназначен для использования в GUI builder'ах, типа встроенного в NetBeans.

Автор: Platon 11.3.2008, 17:18
Да, я понимаю, в IDEA это тоже есть, но как-то приноровился ручками писать.

Автор: w1nd 11.3.2008, 17:30
Цитата(Platon @  11.3.2008,  16:38 Найти цитируемый пост)
FormLayout - это божественный менеджер выравнивания от JGoodies

Он очень незначительно отличается от GridBagLayout ;) Вам никто не мешает создать такие же методы в своём потомке GridBagConstraints, как и в CellConstraints. Кстати, из-за дурацкой идеи авторов FormLayout отсчитывать insets внутрь, можно очень здорово попортить себе нервы, встраивая друг в друга композитные компоненты на базе того же FormLayout. Ещё, кстати, эти их xy() и xywh() обнуляют другие поля - мне это кажется неудобным.

Цитата(Platon @  11.3.2008,  16:38 Найти цитируемый пост)
Многие согласятся, что приведенный код просто сказка для такой формочки:

Меня бы устроило и так:
Код
JPanel panel = new JPanel(new GridBagLayout());
panel.add(new JLabel("Label1"), new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(2, 2, 2, 2), 0, 0));
panel.add(new JTextField(), new GridBagConstraints(1, 0, 2, 1, 1.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(2, 2, 2, 2), 0, 0));
panel.add(new JLabel("Label2"), new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(2, 2, 2, 2), 0, 0));
panel.add(new JTextField(), new GridBagConstraints(1, 1, 1, 1, 1.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(2, 2, 2, 2), 0, 0));
panel.add(new JLabel("Label3"), new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(2, 2, 2, 2), 0, 0));
panel.add(new JTextField(), new GridBagConstraints(1, 2, 1, 1, 1.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(2, 2, 2, 2), 0, 0));
panel.add(new JButton("..."), new GridBagConstraints(2, 2, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(2, 2, 2, 2), 0, 0));

Автор: Platon 12.3.2008, 10:51
Цитата(w1nd @  11.3.2008,  18:30 Найти цитируемый пост)
Вам никто не мешает создать такие же методы в своём потомке GridBagConstraints

w1nd, ваши слова заставили меня задуматься smile ,  но немного в другом направлении.


Главный мой аргумент - если мы будем оформлять таблицу 7x14 то нам придется 98 раз полностью рисовать
Код

new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(2, 2, 2, 2), 0, 0)

Утомительно, не так ли?
Вместо этого FormLayout предлагает нам оформить в 1 текстовую строку повдение 7 рядов, и в 1 строку поведение 14 рядов. И потом в раслабленном виде рисовать те же 98 раз:
Код

cc.xy (3, 3)


Добавлено через 2 минуты и 41 секунду
Тем не менее, я согласен работать с GBC, но надеюсь, что FormLayout когда-нибудь войдет в SDK.

Автор: w1nd 12.3.2008, 11:16
Цитата(Platon @  12.3.2008,  10:51 Найти цитируемый пост)
Тем не менее, я согласен работать с GBC, но надеюсь, что FormLayout когда-нибудь войдет в SDK.

Наилучшим вариантом был бы сплав FormLayout и GridBagLayout. Учитывая доступность исходников и того, и другого, грех не сделать smile Не в этом ли направлении вы задумались, Platonsmile 

Автор: Platon 12.3.2008, 11:50
w1nd, Вы меня переоцениваете *CONFUSED*

Код

package platon.gui.swing;

import javax.swing.*;
import java.awt.*;

public class GBCUtil {

    public int defaultGridX;

    public int defaultGridY;

    public int defaultGridWidth = 1;

    public int defaultGridHeight = 1;

    public double defaultWeightX;

    public double defaultWeightY;

    public int defaultAnchor = GBC.CENTER;

    public int defaultFill = GBC.NONE;

    public Insets defaultInsets = new Insets(2, 2, 2, 2);

    public int defaultPadX;

    public int defaultPadY;

    public GBCUtil() {}

    public GBCUtil(int defaultGridX, int defaultGridY, int defaultGridWidth, int defaultGridHeight, double defaultWeightX, double defaultWeightY, int defaultAnchor, int defaultFill, Insets defaultInsets, int defaultPadX, int defaultPadY) {
        this.defaultGridX = defaultGridX;
        this.defaultGridY = defaultGridY;
        this.defaultGridWidth = defaultGridWidth;
        this.defaultGridHeight = defaultGridHeight;
        this.defaultWeightX = defaultWeightX;
        this.defaultWeightY = defaultWeightY;
        this.defaultAnchor = defaultAnchor;
        this.defaultFill = defaultFill;
        this.defaultInsets = defaultInsets;
        this.defaultPadX = defaultPadX;
        this.defaultPadY = defaultPadY;
    }

    public GBC buildGBC() {
        return new GBC(defaultGridX, defaultGridY, defaultGridWidth, defaultGridHeight, defaultWeightX, defaultWeightY,
                defaultAnchor, defaultFill, defaultInsets, defaultPadX, defaultPadY);
    }

    public GBC buildGBC(int gridx, int gridy, int gridwidth, int gridheight, double weightx, double weighty, int anchor,
                        int fill, Insets insets, int ipadx, int ipady) {
        return new GBC(gridx, gridy, gridwidth, gridheight, weightx, weighty, anchor, fill, insets, ipadx, ipady);
    }

    public GBC buildGBC(int gridx, int gridy) {
        return new GBC(gridx, gridy, defaultGridWidth, defaultGridHeight, defaultWeightX, defaultWeightY,
                    defaultAnchor, defaultFill, defaultInsets, defaultPadX, defaultPadY);
    }

    public GBC buildGBC(int gridx, int gridy, int gridwidth, int gridheight) {
        return new GBC(gridx, gridy, gridwidth, gridheight, defaultWeightX, defaultWeightY,
                    defaultAnchor, defaultFill, defaultInsets, defaultPadX, defaultPadY);
    }

    public GBCUtil defaultGridX(int gridX) {
        defaultGridX = gridX;
        return this;
    }

    public GBCUtil defaultGridY(int gridY) {
        defaultGridY = gridY;
        return this;
    }

    public GBCUtil defaultGridWidth(int defaultGridWidth) {
        this.defaultGridWidth = defaultGridWidth;
        return this;
    }

    public GBCUtil defaultGridHeight(int defaultGridHeight) {
        this.defaultGridHeight = defaultGridHeight;
        return this;
    }

    public GBCUtil defaultWeightX(double defaultWeightX) {
        this.defaultWeightX = defaultWeightX;
        return this;
    }

    public GBCUtil defaultWeightY(double defaultWeightY) {
        this.defaultWeightY = defaultWeightY;
        return this;
    }


    public GBCUtil defaultAnchor(int defaultAnchor) {
        this.defaultAnchor = defaultAnchor;
        return this;
    }

    public GBCUtil defaultFill(int defaultFill) {
        this.defaultFill = defaultFill;
        return this;
    }

    public GBCUtil defaultInsets(Insets defaultInsets) {
        this.defaultInsets = defaultInsets;
        return this;
    }

    public GBCUtil defaultPadX(int defaultPadX) {
        this.defaultPadX = defaultPadX;
        return this;
    }

    public GBCUtil defaultPadY(int defaultPadY) {
        this.defaultPadY = defaultPadY;
        return this;
    }

    public static void main(String[] args) {
        JPanel panel = new JPanel(new GridBagLayout());
        GBCUtil util = new GBCUtil().defaultAnchor(GBC.WEST).defaultInsets(new Insets(2, 2, 2, 2));
        panel.add(new JLabel("Label1"), util.buildGBC(0, 0));
        panel.add(new JLabel("Label2"), util.buildGBC(0, 1));
        panel.add(new JLabel("Label3"), util.buildGBC(0, 2));
        panel.add(new JButton("..."), util.buildGBC(2, 2));
        util.defaultWeightX(1).defaultAnchor(GBC.CENTER).defaultFill(GBC.HORIZONTAL);
        panel.add(new JTextField(), util.buildGBC(1, 0, 2, 1));
        panel.add(new JTextField(), util.buildGBC(1, 1, 1, 1));
        panel.add(new JTextField(), util.buildGBC(1, 2, 1, 1));

        JFrame f = new JFrame();
        f.getContentPane().add(panel);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        f.setLocationByPlatform(true);
        f.setVisible(true);
    }
}



Код

package platon.gui.swing;

import java.awt.*;

public class GBC extends GridBagConstraints {

    public GBC() {
    }

    public GBC(int gridx, int gridy, int gridwidth, int gridheight, double weightx, double weighty, int anchor, int fill, Insets insets, int ipadx, int ipady) {
        super(gridx, gridy, gridwidth, gridheight, weightx, weighty, anchor, fill, insets, ipadx, ipady);
    }


    public GBC(int gridx, int gridy) {
        this.gridx = gridx;
        this.gridy = gridy;
    }

    public GBC(int gridx, int gridy, int gridwidth, int gridheight) {
        this.gridx = gridx;
        this.gridy = gridy;
        this.gridwidth = gridwidth;
        this.gridheight = gridheight;
    }

    public GBC gridX(int gridx) {
        this.gridx = gridx;
        return this;
    }

    public GBC gridY(int gridy) {
        this.gridy = gridy;
        return this;
    }

    public GBC gridWidth(int gridwidth) {
        this.gridwidth = gridwidth;
        return this;
    }

    public GBC gridHeight(int gridheight) {
        this.gridheight = gridheight;
        return this;
    }

    public GBC weightX(double weightx) {
        this.weightx = weightx;
        return this;
    }

    public GBC weightY(double weighty) {
        this.weighty = weighty;
        return this;
    }

    public GBC anchor(int anchor) {
        this.anchor = anchor;
        return this;
    }

    public GBC fill(int fill) {
        this.fill = fill;
        return this;
    }

    public GBC ipadX(int ipadx) {
        this.ipadx = ipadx;
        return this;
    }

    public GBC ipadY(int ipady) {
        this.ipady = ipady;
        return this;
    }

    public GBC insets(Insets insets) {
        this.insets = insets;
        return this;
    }
}


В итоге получается такой код:

Код

JPanel panel = new JPanel(new GridBagLayout());
GBCUtil util = new GBCUtil().defaultAnchor(GBC.WEST).defaultInsets(new Insets(2, 2, 2, 2));
panel.add(new JLabel("Label1"), util.buildGBC(0, 0));
panel.add(new JLabel("Label2"), util.buildGBC(0, 1));
panel.add(new JLabel("Label3"), util.buildGBC(0, 2));
panel.add(new JButton("..."), util.buildGBC(2, 2));
util.defaultWeightX(1).defaultAnchor(GBC.CENTER).defaultFill(GBC.HORIZONTAL);
panel.add(new JTextField(), util.buildGBC(1, 0, 2, 1));
panel.add(new JTextField(), util.buildGBC(1, 1));
panel.add(new JTextField(), util.buildGBC(1, 2));



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)