Программирование - это просто
Advertisement
Главная arrow Уроки программирования arrow Java для чайников. arrow Java для чайников. Урок 39. Менеджеры расположения компонентов. Продолжение.
01.03.2024 г.
Главное меню
Главная
Интернет магазин
Программные продукты
Биржевые роботы
Искусственный интеллект
Математика и информатика
1С:Предприятие
Уроки C#
Уроки Delphi
Уроки программирования
Web-программирование
Дизайн и графика
Компьютер для блондинок
Исходники
Статьи
Платный раздел
Рассказы про компьютеры
Хитрости и секреты
Системный подход
Размышления
Наука для чайников
Друзья сайта
Excel-это не сложно
Все о финансах
.
Java для чайников. Урок 39. Менеджеры расположения компонентов. Продолжение. Печать E-mail
Автор megabax   
08.01.2020 г.
В этой статье я постараюсь максимально просто и понятно изложить основы программирования на языке Delphi

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. Менеджеры расположения компонентов. Продолжение.

  

 

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

 

 

Последнее обновление ( 08.01.2020 г. )
 
« След.   Пред. »
 
© 2024 Программирование - это просто
Joomla! - свободное программное обеспечение, распространяемое по лицензии GNU/GPL.
Русская локализация © 2005-2008 Joom.Ru - Русский Дом Joomla!
Design by Mamboteam.com | Powered by Mambobanner.de
Я принимаю Яндекс.Деньги