Отправляет email-рассылки с помощью сервиса Sendsay

Изучаем язык Java

  Все выпуски  

Изучаем язык Java


Новое на сайте Программирование - это просто! (www.easyprog.ru):

В платном разделе

В бесплатном разделе

Канал на яндексДзен:  Фантастика, фэнтази, научпоп, наука, философия, размышления

 

Java для чайников. Урок 39. Менеджеры расположения компонентов. Продолжение.

Продолжаем изучать менеджеры расположения компонентов, которые начали на прошлом уроке. Итак, BoxLayout. Она позволяет управлять размещением компонентов, отдельно в вертикальном либо горизонтальном направлении помещая их, друг за другом, и управлять пространством между компонентами, используя вставки. Рассмотрим пример:

import java.awt.Component;

import java.awt.Container;

import javax.swing.BoxLayout;

import javax.swing.JButton;

import javax.swing.JFrame;

 

public class BoxLayoutDemo {

    public static void addComponentsToPane(Container pane) {

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

        addAButton("Кнопка 1", pane);

        addAButton("Кнопка 2", pane);

        addAButton("Кнопка 3", pane);

        addAButton("Длинная кнопка 4", pane);

        addAButton("Пять", pane);

    }

    

    private static void addAButton(String text, Container container) {

        JButton button = new JButton(text);

        button.setAlignmentX(Component.CENTER_ALIGNMENT);

        container.add(button);

    }

    

    private static void createAndShowGUI() {

   

        // Создание фрейма

        JFrame frame = new JFrame("BoxLayoutDemo");

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        addComponentsToPane(frame.getContentPane());

 

        frame.pack();

        frame.setVisible(true);

    }

 

    public static void main(String[ ] args) {

   

        // запустить приложение

        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            public void run() {

                createAndShowGUI();

            }

        });

    }

}

Запустив программу, мы увидим вот такое окно:

Java для чайников. Урок 39. Менеджеры расположения компонентов. Продолжение.

По вертикали или по горизонтали будут располагается кнопки - зависит от установок в конструкторе, если вместо:

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

написать

pane.setLayout(new BoxLayout(pane, BoxLayout.X_AXIS));

то мы получим уже вот такую картину:

Java для чайников. Урок 39. Менеджеры расположения компонентов. Продолжение.

 

Можно объединять несколько менеджеров при помощи CardLayoutDemo, например, вот так:

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

 

public class CardLayoutDemo implements ItemListener {

    JPanel cards;

    final static String BUTTONPANEL = "Кнопочки";

    final static String TEXTPANEL = "Поле ввода";

    

    public void addComponentToPane(Container pane) {

        // поместить JComboBox в JPanel для наглядности.

        JPanel comboBoxPane = new JPanel();

        String comboBoxItems[] = { BUTTONPANEL, TEXTPANEL };

        JComboBox cb = new JComboBox(comboBoxItems);

        cb.setEditable(false);

        cb.addItemListener(this);

        comboBoxPane.add(cb);

 

        // Создание "cards".

        JPanel card1 = new JPanel();

        card1.add(new JButton("Кнопка 1"));

        card1.add(new JButton("Кнопка 2"));

        card1.add(new JButton("Кнопка 3"));

 

        JPanel card2 = new JPanel();

        card2.add(new JTextField("Тут какой-то текст", 20));

        

        // Создаем панель

        cards = new JPanel(new CardLayout());

        cards.add(card1, BUTTONPANEL);

        cards.add(card2, TEXTPANEL);

 

        pane.add(comboBoxPane, BorderLayout.PAGE_START);

        pane.add(cards, BorderLayout.CENTER);

    }

    

    public void itemStateChanged(ItemEvent evt) {

        CardLayout cl = (CardLayout)(cards.getLayout());

        cl.show(cards, (String)evt.getItem());

    }

    

    private static void createAndShowGUI() {

        // Создание и настройка окна

        JFrame frame = new JFrame("CardLayoutDemo");

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        CardLayoutDemo demo = new CardLayoutDemo();

        demo.addComponentToPane(frame.getContentPane());

        

        // Показ окна

        frame.pack();

        frame.setVisible(true);

    }

    

    public static void main(String[] args) {

        try {

            UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");

        } catch (UnsupportedLookAndFeelException ex) {

            ex.printStackTrace();

        } catch (IllegalAccessException ex) {

            ex.printStackTrace();

        } catch (InstantiationException ex) {

            ex.printStackTrace();

        } catch (ClassNotFoundException ex) {

            ex.printStackTrace();

        }

 

        UIManager.put("swing.boldMetal", Boolean.FALSE);

 

        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            public void run() {

                createAndShowGUI();

            }

        });

    }

}

Результатом работы будет вот такая вот программа, в которой можно переключать, что будет показывать, кнопки:

Java для чайников. Урок 39. Менеджеры расположения компонентов. Продолжение.

или текстовое поле:

Java для чайников. Урок 39. Менеджеры расположения компонентов. Продолжение.

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

Давайте посмотрим пример:

import javax.swing.*;

import static javax.swing.GroupLayout.Alignment.*;

 

public class Find extends JFrame {

    public Find() {

        JLabel label = new JLabel("Find What:");

        JTextField textField = new JTextField();

        JCheckBox caseCheckBox = new JCheckBox("Match Case");

        JCheckBox wrapCheckBox = new JCheckBox("Wrap Around");

        JCheckBox wholeCheckBox = new JCheckBox("Whole Words");

        JCheckBox backCheckBox = new JCheckBox("Search Backwards");

        JButton findButton = new JButton("Find");

        JButton cancelButton = new JButton("Cancel");

        

        caseCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));

        wrapCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));

        wholeCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));

        backCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));

        

        GroupLayout layout = new GroupLayout(getContentPane());

        getContentPane().setLayout(layout);

        layout.setAutoCreateGaps(true);

        layout.setAutoCreateContainerGaps(true);

 

        layout.setHorizontalGroup(layout.createSequentialGroup()

                .addComponent(label)

                .addGroup(layout.createParallelGroup(LEADING)

                        .addComponent(textField)

                        .addGroup(layout.createSequentialGroup()

                        .addGroup(layout.createParallelGroup(LEADING)

                                .addComponent(caseCheckBox)

                                .addComponent(wholeCheckBox))

                        .addGroup(layout.createParallelGroup(LEADING)

                        .addComponent(wrapCheckBox)

                        .addComponent(backCheckBox))))

                .addGroup(layout.createParallelGroup(LEADING)

                .addComponent(findButton)

                .addComponent(cancelButton))

        );

        

        layout.linkSize(SwingConstants.HORIZONTAL, findButton, cancelButton);

        

        layout.setVerticalGroup(layout.createSequentialGroup()

                .addGroup(layout.createParallelGroup(BASELINE)

                        .addComponent(label)

                        .addComponent(textField)

                        .addComponent(findButton))

                .addGroup(layout.createParallelGroup(LEADING)

                .addGroup(layout.createSequentialGroup()

                        .addGroup(layout.createParallelGroup(BASELINE)

                                .addComponent(caseCheckBox)

                                .addComponent(wrapCheckBox))

                        .addGroup(layout.createParallelGroup(BASELINE)

                        .addComponent(wholeCheckBox)

                        .addComponent(backCheckBox)))

                .addComponent(cancelButton))

        );

        

        setTitle("Find");

        pack();

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

    }

   

    public static void main(String args[]) {

        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {

                try {

                    UIManager.setLookAndFeel(

                            "javax.swing.plaf.metal.MetalLookAndFeel");

                } catch (Exception ex) {

                    ex.printStackTrace();

                }

                new Find().setVisible(true);

            }

        });

    }

}

И вот так будет выглядеть окно программы:

Java для чайников. Урок 39. Менеджеры расположения компонентов. Продолжение.

Немного поясню текст программы. Сначала мы делаем горизонтальное размещение:

        layout.setHorizontalGroup(layout.createSequentialGroup()

                .addComponent(label)

                .addGroup(layout.createParallelGroup(LEADING)

                        .addComponent(textField)

                        .addGroup(layout.createSequentialGroup()

                        .addGroup(layout.createParallelGroup(LEADING)

                                .addComponent(caseCheckBox)

                                .addComponent(wholeCheckBox))

                        .addGroup(layout.createParallelGroup(LEADING)

                        .addComponent(wrapCheckBox)

                        .addComponent(backCheckBox))))

                .addGroup(layout.createParallelGroup(LEADING)

                .addComponent(findButton)

                .addComponent(cancelButton))

        );

Мы размещаем последовательно метку "Find What", затем группу с полем ввода и флажками, и только потом кнопки:

Java для чайников. Урок 39. Менеджеры расположения компонентов. Продолжение.

А вот внутри группы мы текстовое поле и группу флажков размещаем параллельно. Сама группа флажков состоит из двух групп флажков, и эти две группы размещены последовательно:

Java для чайников. Урок 39. Менеджеры расположения компонентов. Продолжение.

но внутри группы флажки размещены параллельно:

Java для чайников. Урок 39. Менеджеры расположения компонентов. Продолжение.

стоит заметить, что обязательно нужно делать как горизонтальное, так и вертикальное размещение:

        layout.setVerticalGroup(layout.createSequentialGroup()

                .addGroup(layout.createParallelGroup(BASELINE)

                        .addComponent(label)

                        .addComponent(textField)

                        .addComponent(findButton))

                .addGroup(layout.createParallelGroup(LEADING)

                .addGroup(layout.createSequentialGroup()

                        .addGroup(layout.createParallelGroup(BASELINE)

                                .addComponent(caseCheckBox)

                                .addComponent(wrapCheckBox))

                        .addGroup(layout.createParallelGroup(BASELINE)

                        .addComponent(wholeCheckBox)

                        .addComponent(backCheckBox)))

                .addComponent(cancelButton))

        );

а вот тут у нас идет как бы все наоборот. Мы последовательно размещаем группу из надписи, текстового поля и кнопочки "Find":

Java для чайников. Урок 39. Менеджеры расположения компонентов. Продолжение.

Попробуем что-нибудь поменять в этом хитром диалоге. Добавим еще одну метку:

public class Find extends JFrame {

    public Find() {

        JLabel label = new JLabel("Find What:");

        JLabel label1 = new JLabel("Это еще одна метка");

        JTextField textField = new JTextField();

...

Вставим ее в горизонтальную часть:

layout.setHorizontalGroup(layout.createSequentialGroup()

                .addComponent(label)

                .addComponent(label1)

                .addGroup(layout.createParallelGroup(LEADING)

                        .addComponent(textField)

                        .addGroup(layout.createSequentialGroup()

                        .addGroup(layout.createParallelGroup(LEADING)

                                .addComponent(caseCheckBox)

                                .addComponent(wholeCheckBox))

                        .addGroup(layout.createParallelGroup(LEADING)

                        .addComponent(wrapCheckBox)

                        .addComponent(backCheckBox))))

                .addGroup(layout.createParallelGroup(LEADING)

                .addComponent(findButton)

                .addComponent(cancelButton))

         );

Что важно, в вертикальную часть тоже надо добавить метку:

        layout.setVerticalGroup(layout.createSequentialGroup()

                .addGroup(layout.createParallelGroup(BASELINE)

                        .addComponent(label)

                        .addComponent(label1)

                        .addComponent(textField)

                        .addComponent(findButton))

                .addGroup(layout.createParallelGroup(LEADING)

                .addGroup(layout.createSequentialGroup()

                        .addGroup(layout.createParallelGroup(BASELINE)

                                .addComponent(caseCheckBox)

                                .addComponent(wrapCheckBox))

                        .addGroup(layout.createParallelGroup(BASELINE)

                        .addComponent(wholeCheckBox)

                        .addComponent(backCheckBox)))

                .addComponent(cancelButton))

        );

И теперь у нас будет выглядеть диалог вот так:

Java для чайников. Урок 39. Менеджеры расположения компонентов. Продолжение.

Поменяв местами добавление элементов в горизонтальной блоке, мы поменяем местами и на форме (например, метки):

        layout.setHorizontalGroup(layout.createSequentialGroup()

                .addComponent(label1)

                .addComponent(label)

И форма будет выглядеть так:

Java для чайников. Урок 39. Менеджеры расположения компонентов. Продолжение.

Мы можем менять последовательность и в вертикальном блоке, например сначала добавить флажки, затем кнопочку "Cancel":

        layout.setVerticalGroup(layout.createSequentialGroup()

                .addGroup(layout.createParallelGroup(BASELINE)

                        .addComponent(label1)              

                        .addComponent(label)                       

                        .addComponent(textField)

                        .addComponent(findButton))

                .addGroup(layout.createSequentialGroup()

                        .addGroup(layout.createParallelGroup(BASELINE)

                                .addComponent(caseCheckBox)

                                .addComponent(wrapCheckBox))

                        .addGroup(layout.createParallelGroup(BASELINE)

                        .addComponent(wholeCheckBox)

                        .addComponent(backCheckBox)))

                .addGroup(layout.createParallelGroup(LEADING)

                .addComponent(cancelButton))

        );

И тогда форма будет выглядеть вот так:

Java для чайников. Урок 39. Менеджеры расположения компонентов. Продолжение.

  

 

(С) Шуравин Александр

 

 


В избранное