Инструменты пользователя

Инструменты сайта


java_swing

Назад

Введение в библиотеку Swing

AWT и Swing

В первой версии языка Java для работы с графикой было только библиотека AWT. Эта библиотека – простой набор классов, таких, как Button(кнопка),TextField (текстовое поле), Label (текстовая метка или иконка) и другие.
Вскоре была создана более совершенная библиотека, которую назвали Swing. Она так же включает в себя кнопки,текстовые поля и другие элементы управления графическими приложениями. Названия компонентов этой библиотеке начинается с буквы J. Например JButton, JTextField и т.д.

Работать в Swing лучше, быстрей и удобней.

Основные элементы Swing

Вот некоторые основные объекты, из которых состоят Swing приложения:

  • Окно или фрейм(frame), который может быть создан с помощью класса JFrame.
  • Панель (panel) или, как ещё её называют, pane(оконное стекло) содержит все кнопки, текстовые поля, метки и другие компоненты.
  • Оконные элементы управления, такие как кнопки JButton,текстовые поля JTextfield,списки JList, и так далее.
  • Менеджер размещения (layout managers) компонент, которые помогают организовать все эти кнопки и поля на панели.

Например, можно создать экземпляр класса JPanel и назначить для него схему размещения. Затем создайте различные графические компоненты и добавьте их на панель. После этого добавьте панель на фрейм, задать его размер и сделать его видимым.

Окно

JFrame является главным окном для размещения компонентов и представляет их пользователю.

  • get/setTitle(String str): Получить/установить заголовок Окна.
  • get/setSize(int width,int height): Получить/установить размер Окна.
  • is/setVisible(Bool): Получить/установить видимость фрейма, другими словами, отображение на экране.
  • get/setLocation(int width,int height): Получить/установить месторасположение в окне, где фрейм должен появиться.
  • get/setState(int state): Получить/установить состояние фрейма (нормальный вывод JFrame.NORMAL).
    • нормальный вывод JFrame.NORMAL
  • get/setExtendedState(int state):Получить/установить состояние фрейма
    • Нормальный вывод JFrame.NORMAL
    • Максимальный размер окна JFrame.MAXIMIZED_BOTH
    • свернуть окно JFrame.ICONIFIED).
  • add(): Добавить компоненты к фрейму.
  • setResizable(Bool): Разрешает растягивать окно или запрещает по умолчанию TRUE;
  • setDefaultCloseOperation(int state):Задает операции, которая будет по умолчанию, когда пользователь инициирует «закрыть» в текущем окне.
    • JFrame.EXIT_ON_CLOSE - Выход из приложения.
    • JFrame.HIDE_ON_CLOSE - Скрывает окно.
    • JFrame.DO_NOTHING_ON_CLOSE - Не делает нечего.
    • JFrame.DISPOSE_ON_CLOSE
  • setDefaultLookAndFeelDecorated(Bool) - Декоративное окно
  • setLocationRelativeTo(null) - Окно расположит по центру экрана.
  • setPreferredSize(new Dimension(400, 80)) - Указывает на отступ внутри она от компонентов.
  • setUndecorated(true) - Убрать верхнюю часть окна.
  • setIconImage(ImageIcon icon) -Иконка для окна
  • pack() - Подберет оптимальный размер окна с компонентами и т.д.
  • AWTUtilities.setWindowOpacity(JFrame frame, 0.5f); - Если добавить эту строку окно будет на половину прозрачным

Пример окна:

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRootPane;
public class Main 
{
     public static void createGUI() 
     {
          JFrame.setDefaultLookAndFeelDecorated(true);
          final JFrame frame = new JFrame("Test frame");
 
          //Закрыть окно при нажатии по крестику
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
          JPanel panel = new JPanel();
          //Построчное расположение
          panel.setLayout(new FlowLayout());
 
          //Пишем стандартное событие для кнопки
          JButton minButton = new JButton("Minimize");          
          minButton.addActionListener(new ActionListener() 
          {
               public void actionPerformed(ActionEvent e) 
               {
                   //Свернуть Окно
                    frame.setState(JFrame.ICONIFIED);                                        
               }
          });
          panel.add(minButton);
 
          //Пишем стандартное событие для кнопки
          JButton maxButton = new JButton("Maximize");          
          maxButton.addActionListener(new ActionListener() 
          {
               public void actionPerformed(ActionEvent e) 
               {
                   //максимальный размер окна
                   frame.setExtendedState(JFrame.MAXIMIZED_BOTH);                    
               }
          });
          panel.add(maxButton);
 
 
          JButton normalButton = new JButton("Normal");          
          normalButton.addActionListener(new ActionListener() 
          {
               public void actionPerformed(ActionEvent e) 
               {
                   //Норм размер окна
                   frame.setExtendedState(JFrame.NORMAL);                                        
               }
          });
          panel.add(normalButton);
 
          //Пишем стандартное событие для кнопки
          JButton exitButton = new JButton("Exit");          
          exitButton.addActionListener(new ActionListener()
          {
               public void actionPerformed(ActionEvent e) 
               {
                    //Выход с программы
                    frame.setVisible(false);
                    System.exit(0);
               }
          });
          panel.add(exitButton);
 
          //Иконка для окна
          ImageIcon img = new ImageIcon("chat-icon.png");
          frame.setIconImage(img.getImage());
 
          //Загружаем в окно панель
          frame.getContentPane().add(panel);
 
          //Отступ внутри она от компонентов
          frame.setPreferredSize(new Dimension(400, 80));
 
          frame.pack();
          //Расположения окна по центру экрана
          frame.setLocationRelativeTo(null);
          frame.setVisible(true);
     }
     public static void main(String[] args) 
     {
        createGUI();
     }
}

Панель

Панель JPanel — это элемент управления, представляющий собой прямоугольное пространство, на котором можно размещать другие элементы. Элементы добавляются и удаляются методами, унаследованными от класса Container.

У каждой панели есть менеджер размещения, который определяет стратегию взаимного расположения элементов, добавляемых на панель. Его можно изменить методом setLayout(LayoutManager manager).

  • setLayout(LayoutManager mgr) - Определяет менеджера размещения
  • add(Component comp) - Добавить компонент к панели.
  • remove(Component comp или ind index) - удалить компонент.
  • removeAll() -Удалить все.

Оконные элементы управления

Класс JComponent

Все визуальные компоненты библиотеки Swing унаследованы от класса JComponent. Сам этот класс является абстрактными и непосредственно не используется, но все визуальные компоненты наследуют его методы.

  • is/setEnabled(boolean enabled) - используется для управления активностью компонент.
  • is/setVisible(boolean visible) - управляет видимостью компонента.
  • get/setBackground(Color color) - изменить цвет заднего фона компонента.

Метка JLabel

В большинстве визуальных библиотек метка — один из самых простейших компонентов. Она представляет собой обычный текст, который выводится в заданном месте окна и используется для вывода вспомогательной текстовой информации: подписи к другим элементам, инструкции и предупреждения для пользователя.

  • JLabel(String text) — создает метку с надписью text.
  • JLabel(Icon image) — создает метку со значком image.
  • JLabel(String text, Icon image, int align) — создает метку с надписью text и значком image. Третий параметр задает выравнивание текста вместе со значком. В качестве него может быть использована одна из констант, описанных в интерфейсе SwingConstants: LEFT, RIGHT, CENTER.
  • get/setText() — возвращает и задает новую надпись текущей метке.
  • get/setIcon() — возвращает и задает значок метки.
  • get/setIconTextGap(int gap) — позволяет получить или задать расстояние между текстом и значком метки в пикселах.
  • get/setVerticalAlignment(int align), get/setHorizontalAlignment(int align) — эти четыре метода позволяют получить текущее или установить новое выравнивание (по горизонтали и вертикали) метки относительно ее границ. Возможные положения описаны в интерфейсе SwingConstants.
  • get/setVerticalTextPosition(int align), get/setHorizontalTextPosition(int align) — эти четыре метода позволяют получить текущее или установить новое выравнивание текста относительно значка. Возможные положения описаны в интерфейсе SwingConstants.

public class Comp extends JFrame
{
    Comp()
    {
        super("Окно с надписью");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        JLabel label = new JLabel("Метка со значком и с надписью", new ImageIcon("1.gif"), JLabel.RIGHT);
        getContentPane().add(label);
        pack();
        setVisible(true);
    }
    public static void main(String[] args) 
    {
        Comp c = new Comp();
    }   
}

Кнопка JButton

  • get/setRolloverIcon(Icon icon) - позволяет задать значок, который будет появляться при наведении на кнопку мыши.
  • get/setPressedIcon(Icon icon) — значок для кнопки в нажатом состоянии.
  • get/setDisableIcon(Icon icon) — значок для неактивной кнопки.
  • get/setMargin(Insets margin) - позволяет задать величину отступов от текста надписи на кнопке до ее полей.
  • setBorderPainted(boolean borderPainted) - Включить/Выключить прорисовку рамки.
  • setFocusPainted(boolean focusPainted) - Включить/Выключить прорисовку фокуса (кнопка, на которой находится фокус, выделяется пунктирным прямоугольником).

public class Comp extends JFrame
{
    Comp()
    {
        super("Окно с кнопкой");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        JButton button = new JButton("Кнопка", new ImageIcon("1.gif"));
        button.setMargin(new Insets(0, 10, 20, 30));
        button.setVerticalTextPosition(SwingConstants.TOP);
        button.setHorizontalTextPosition(SwingConstants.LEFT);
        getContentPane().add(button);
        pack();
        setVisible(true);
    }
    public static void main(String[] args) 
    {
        Comp c = new Comp();
    }   
}

Компоненты JToggleButton, JCheckBox, JRadioButton

Компонент JToggleButton представляет собой кнопку, которая может находиться в двух состояниях: нажатом и отпущенном.
Когда пользователь щелкает мышкой по такой кнопке, она изменяет свое состояние. Именно таким образом ведут себя кнопки форматирования на инструментальной панели текстового редактора. Кнопка [I] не только устанавливает или убирает курсивное начертание в выделенном тексте, но и сигнализирует о его наличии или отсутствии.

  • JToggleButton(String text, Icon icon, boolean selected) - Основной конструктор создает кнопку с заданными надписью, значком и текущим состоянием.
  • setSelected(boolean selected) - перевести кнопку в требуемое состояние.
  • isSelected() возвращает true, если кнопка выбрана (т.е. находится в нажатом состоянии) и false в противном случает.
  • setSelectedIcon(new ImageIcon(«key.png»)); - При активном состоянии меняем Иконку.

От класса JToggleButton унаследован класс JCheckBox — флажок.
Этот класс имеет точно такой же набор конструкторов и методов, т.е. не расширяет функциональность предка. Единственное различие между ними — во внешнем виде: JCheckBox выглядит не как кнопка, а как небольшой квадратик, в котором можно поставить или убрать галочку.

Аналогичным образом ведет себя класс JRadioButton — переключатель или радиокнопка, внешне выглядящая как пустой кружок, когда она не выделена и кружок с точкой в выделенном состоянии.

<note important>Для того, чтобы элементы объединить в группу, используется специальный контейнер ButtonGroup</note> Если добавить в один такой контейнер несколько элементов JRadioButton, то выбранным всегда будет только один из них.

  • add(AbstractButton button) - добавляет элемент в группу.
  • getElements() - возвращает все ее элементы в виде коллекции Enumeration. По коллекции можно пройтись итератором и найти выделенный элемент.

public class Comp extends JFrame
{
    Comp()
    {
        super("Пример с кнопками выбора, флажками и переключателями");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        ImageIcon icon = new ImageIcon("user.png"); // будем использовать один значок на все случаи
 
        Box mainBox = Box.createVerticalBox();
        Box box1 = Box.createVerticalBox();
        JToggleButton tButton1 = new JToggleButton("Кнопка выбора 1");
        JToggleButton tButton2 = new JToggleButton("Кнопка выбора 2", icon);
        tButton2.setSelectedIcon(new ImageIcon("key.png"));
 
        ButtonGroup bg = new ButtonGroup(); // создаем группу взаимного исключения
        bg.add(tButton1);
        bg.add(tButton2); // сделали кнопки tButton1 и tButton2 взаимоисключающими
        tButton2.setSelectedIcon(new ImageIcon("key.png"));
        box1.add(tButton1);
        box1.add(tButton2); // добавили кнопки tButton1 и tButton2 на панель box1
        box1.setBorder(new TitledBorder("Кнопки выбора"));
 
 
        Box box2 = Box.createVerticalBox();
        JCheckBox check1 = new JCheckBox("Флажок 1");
        JCheckBox check2 = new JCheckBox("Флажок 2", icon);
        check2.setSelectedIcon(new ImageIcon("key.png"));
        box2.add(check1);
        box2.add(check2); // добавили флажки на панель box2
        box2.setBorder(new TitledBorder("Флажки"));
 
 
        Box box3 = Box.createVerticalBox();
        JRadioButton rButton1 = new JRadioButton("Переключатель 1");
        JRadioButton rButton2 = new JRadioButton("Переключатель 2", icon);
        rButton2.setSelectedIcon(new ImageIcon("key.png"));
 
        bg = new ButtonGroup(); // создаем группу взаимного исключения
        bg.add(rButton1);
        bg.add(rButton2); // сделали радиокнопки взаимоисключающими
        box3.add(rButton1);
        box3.add(rButton2); // добавили радиокнопки на панель box3
        box3.setBorder(new TitledBorder("Переключатели"));
 
        mainBox.add(box1);
        mainBox.add(box2);
        mainBox.add(box3);
        setContentPane(mainBox);
        pack();
 
        setVisible(true);
    }
    public static void main(String[] args) 
    {
        Comp c = new Comp();
    }   
}

Текстовое поле JTextField

Для создания текстового поля чаще всего используются конструкторы:

  • JTextField(int columns) — создает пустое текстовое поле, ширина которого достаточна для размещения columns символов. При этом пользователь может вводить в текстовое поле строку какой угодно длины: она просто будет прокручиваться.
  • JTextField(String text) — создает текстовое поле с начальным текстом text.
  • JTextField(String text, int columns) — устанавливает и ширину и начальный текст.
  • get/setText(String text) -Занести текст в поле и считать.
  • getSelectedText() - Позволяет получить выделенную часть текста.
  • replaceSelection(String content) - Заменить выделенный текст другим.
  • get/setCaretPosition() - Возвращает позицию курсора (каретки) в текстовом поле и позволяет задать ее программно.
  • setCaretColor(Color color) - Изменить цвет курсора.
  • setHorizontalAlignment(int align) -Выравнивание текстового поля в качестве параметра передается одна из констант выравнивания, определенных в этом же классе JTextField: LEFT, CENTER, RIGHT.

Поле для ввода пароля JPasswordField

<note tip>JPasswordField является прямым потомком JTextField, поэтому для него справедливо все сказанное выше.</note> JPasswordField является прямым потомком JTextField, поэтому для него справедливо все сказанное выше.

  • set/getEchoChar(char echo) - Получить или заменить символы которые скрываются
  • getPassword() - Считать поля возвращающий массив символов char[].

Область для ввода текста JTextArea

<note tip>JTextArea также является потомком JTextField и наследует все его методы.</note>

  • setWrapStyleWord(boolean wrapStyle) - если TRUE то слова переносятся целиком на новую строку.
  • append(String text) добавляет строку text в конец уже имеющегося текста.
  • insert(String text, int position) вставляет текст в указанную позицию position.
  • setEditable(Bool b) Задаем можно писать символы или нет

public class Comp extends JFrame
{
    Comp()
    {
        super("Пример текстовых компонентов");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
 
        JTextField textField = new JTextField("Текстовое поле", 20);
        textField.setCaretColor(Color.RED);
        textField.setHorizontalAlignment(JTextField.RIGHT);
 
        JPasswordField passwordField = new JPasswordField(20);
        passwordField.setEchoChar('$');
        passwordField.setText("пароль");
 
        JTextArea textArea = new JTextArea(5, 20);
        textArea.setLineWrap(true);
        textArea.setWrapStyleWord(true);
 
        for (int i = 0; i <= 20; i++)
        textArea.append("Область для ввода текстового содержимого ");
 
        getContentPane().add(textField, BorderLayout.NORTH);
        getContentPane().add(textArea);
        getContentPane().add(passwordField, BorderLayout.SOUTH);
 
        pack();
        setVisible(true);
    }
    public static void main(String[] args) 
    {
        Comp c = new Comp();
    }   
}

Панель прокрутки JScrollPane

JScrollPane — панель прокрутки. Чаще всего она просто «надевается» на требуемый объект посредством собственного конструктора, принимающего этот объект в качестве параметра. Например, чтобы текстовая область textArea из предыдущего примера обрела полосы прокрутки, необходимо заменить команду

getContentPane().add(textArea);
на команду
getContentPane().add(new JScrollPane(textArea));
  • setHorizontalScrollBarPolicy(int policy) — позволяет задать стратегию работы с горизонтальной полосой прокрутки. Возможные значения представлены константами HORIZONTAL_SCROLLBAR_ALWAYS (отображать всегда), HORIZONTAL_SCROLLBAR_AS_NEEDED (отображать при необходимости) и HORIZONTAL_SCROLLBAR_NEVER (не отображать никогда). Данные константы определены в интерфейсе ScrollPaneConstants.
  • setVerticalScrollBarPolicy(int policy) позволяет задать стратегию работы с вертикальной полосой прокрутки посредством констант VERTICAL_SCROLLBAR_ALWAYS, VERTICAL_SCROLLBAR_AS_NEEDED и VERTICAL_SCROLLBAR_NEVER

Инструментальная панель JToolBar

В Swing для инструментальных панелей разработан визуальный компонент JToolBar, в котором заложена просто потрясающая функциональность.

  • JToolBar(String title) создает горизонтальную панель с заданным заголовком.
  • JToolBar(String title, int orientation) Для создания вертикальной панели где параметр orientation задается константой VERTICAL из интерфейса SwingConstants.
  • is/setFloatable(boolean floatable) — разрешает либо запрещает (по умолчанию разрешает) пользователю откреплять панель от места ее начального расположения.
  • add(Component component) — добавляет на инструментальную панель новый элемент управления.
  • addSeparator() добавляет разделитель.

public class Comp extends JFrame
{
    Comp()
    {
        super("Пример использования JToolBar");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        JTextArea textArea = new JTextArea(5, 20);
        getContentPane().add(new JScrollPane(textArea));
        JToolBar toolBar = new JToolBar("Инструментальная панель");
        toolBar.add(new JButton("Кнопка 1"));
        toolBar.add(new JButton("Кнопка 2"));
        toolBar.addSeparator();
        toolBar.add(new JButton("Кнопка 3"));
        getContentPane().add(toolBar, BorderLayout.NORTH);
        pack();
        setVisible(true);
    }
    public static void main(String[] args) 
    {
        Comp c = new Comp();
    }   
}

Выпадающий список JComboBox

Выпадающий список — весьма распространенный элемент управления. Он содержит множество вариантов, из которых пользователь может выбрать один и только один, либо (если выпадающий список это позволяет) ввести свой собственный.

  • JComboBox(Object[] elements) и JComboBox(Vector elements) - Один из конструктор для.
  • addItem(Object item) - Добавляющим новый элемент в конец списка.
  • insertItemAt(Object item, int index) - Позволяющим уточнить позицию, в которую требуется вставить элемент.
  • getItemAt(int index) - Позволяет обратиться к произвольному элементу.
  • removeAllItems() - Удаляет из JComboBox все элементы.
  • removeItem(Object item) — Удалить конкретный элемент.
  • getSelectedIndex() - Позволяет получить индекс выбранного пользователем элемента
  • getSelectedItem() = Возвращает сам выбранный объект.
  • setSelectedIndex(int index) или setSelectedItem(Object item) - Сделать конкретный элемент выбранным.
  • setEditable(boolean editable) Чтобы пользователь мог ввести свой вариант, который не присутствует в списке, должен быть вызван метод с параметром true.

public class Comp extends JFrame
{
    Comp()
    {
        super("Пример использования JComboBox");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        String[] elements = new String[] {"Вася", "Петя",
        "<html><font size = +1 color = yellow>Иван</font>"};
        JComboBox combo = new JComboBox(elements);
        combo.setSelectedIndex(1);
        JPanel panel = new JPanel();
        panel.add(combo);
        setContentPane(panel);
        setSize(200,200);
        setVisible(true);
    }
    public static void main(String[] args) 
    {
        Comp c = new Comp();
    }   
}

Ползунок JSlider

Ползунок позволяет пользователю выбрать некоторое число из диапазона доступных значений, наглядно представив этот диапазон.

  • JSlider(int orientation, int min, int max, int value) Конструктор первый параметр ориентация ползунка (HORIZONTAL или VERTICAL).
  • setOrientation(int) - Изменить позицию.
  • setMinimum(int min) - Изменить минимальное значения.
  • setMaximum(int max) - Изменить максимальное значения.
  • get/setValue(int value) - Получить и установить текущее значения.
  • setMajorTickSpacing(int spacing) - Позволяет задать расстояние, через которое будут выводиться большие деления.
  • setMinorTickSpacing(int spacing) — Расстояние, через которые будут выводиться маленькие деления.
  • setPaintTicks(boolean paint) Включает или отключает прорисовку этих делений.
  • setSnapToTicks(boolean snap) Включает или отключает «прилипание» ползунка к делениям.
  • setPaintLabels(boolean paint) включает или отключает прорисовку меток под большими делениями.

public class Comp extends JFrame
{
    Comp()
    {
        super("Пример использования JSlider");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        JSlider slider = new JSlider(JSlider.HORIZONTAL, -50, 150, 70);
        slider.setMajorTickSpacing(20);
        slider.setMinorTickSpacing(5);
        slider.setPaintTicks(true);
        slider.setPaintLabels(true);
        slider.setSnapToTicks(true);
        JPanel panel = new JPanel();
        panel.add(slider);
        setContentPane(panel);
        pack();
        setVisible(true);
    }
    public static void main(String[] args) 
    {
        Comp c = new Comp();
    }   
}

Панель со вкладками JTabbedPane

Многим программам бывает необходимо разместить в одном окне большое количество элементов управления, некоторые из которых (такие как списки, деревья, текстовые области и т.д.) могут к тому же занимать приличное пространство.

public class Comp extends JFrame
{
    Comp()
    {
        super("Пример использования JTabbedPane");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP, JTabbedPane.WRAP_TAB_LAYOUT);
        for (int i = 1; i <= 5; i++) 
        {
            JPanel panel = new JPanel();
            panel.add(new JButton("Кнопка № " + i));
            tabbedPane.add("Панель " + i, panel);
        }
        getContentPane().add(tabbedPane);
        setSize(300,200);
        setVisible(true);
    }
    public static void main(String[] args) 
    {
        Comp c = new Comp();
    }   
}

Список JList

Список содержит группу элементов, аналогично выпадающему списку JComboBox, но обладает двумя отличительными особенностями. Во-первых, на экране видны одновременно несколько элементов списка. Во-вторых, пользователь может выбрать в списке не один элемент, а несколько (если установлен соответствующий режим выделения).

Создать список можно с помощью конструктора, работающего на основе массива Object[] или вектора Vector (аналогично JComboBox).

  • setVisibleRowCount(int count) устанавливает количество видимых элементов списка.
  • setSelectionMode(int mode) указывает на ListSelectionModel:SINGLE_SELECTION — может быть выделен только один элемент, SINGLE_INTERVAL_SELECTION — может быть выделено несколько элементов, но составляющих непрерывный интервал,MULTIPLE_INTERVAL_SELECTION — может быть выделено произвольное количество смежных и несмежных элементов.
  • set/getSelectedValue() - Выделенный элемент списка (если он один).
  • set/getSelectedValues() - Возвращает все выделенные элементы списка в виде массива Object[].
  • set/getSelectedIndex() и set/getSelectedIndices() - возвращают они не сами выделенные элементы, а их индексы.
public class Comp extends JFrame
{
    Comp()
    {
        super("Пример с JList");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Object[] elements = new Object[] {"Колбаса", "<html><font color = red>Масло", "Сгущенное молоко"};
        JList list = new JList(elements);
        list.setVisibleRowCount(5);
        list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
        list.setSelectedIndices(new int[] {1,2});
        getContentPane().setLayout(new FlowLayout());
        getContentPane().add(new JScrollPane(list));
        setSize(200,150);
        setVisible(true);
    }
    public static void main(String[] args) 
    {
        Comp c = new Comp();
    }   
}

JTable Таблицы

Для отображения табличных данных используется комопнент JTable. JTable внутри себя не содержит данные, а служит только для их отображения.

Дополнения
Дополнения 2

public class Tab 
{
    public static void createGUI() 
    {
        JFrame frame = new JFrame("Test frame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        String[] columnNames = {
                "Name",
                "Last modified",
                "Type",
                "Size"
        };
 
        String[][] data = {
                {"addins", "02.11.2006 19:15", "Folder", ""},
                {"AppPatch", "03.10.2006 14:10", "Folder", ""},
                {"assembly", "02.11.2006 14:20", "Folder", ""},
                {"Boot", "13.10.2007 10:46", "Folder", ""},
                {"Branding", "13.10.2007 12:10", "Folder", ""},
                {"Cursors", "23.09.2006 16:34", "Folder", ""},
                {"Debug", "07.12.2006 17:45", "Folder", ""},
                {"Fonts", "03.10.2006 14:08", "Folder", ""},
                {"Help", "08.11.2006 18:23", "Folder", ""},
                {"explorer.exe", "18.10.2006 14:13", "File", "2,93MB"},
                {"helppane.exe", "22.08.2006 11:39", "File", "4,58MB"},
                {"twunk.exe", "19.08.2007 10:37", "File", "1,08MB"},
                {"nsreg.exe", "07.08.2007 11:14", "File", "2,10MB"},
                {"avisp.exe", "17.12.2007 16:58", "File", "12,67MB"},
        };
 
        JTable table = new JTable(data, columnNames);
 
        JScrollPane scrollPane = new JScrollPane(table);
 
        frame.getContentPane().add(scrollPane);
        frame.setPreferredSize(new Dimension(450, 200));
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
 
     public static void main(String[] args) 
     {
        JFrame.setDefaultLookAndFeelDecorated(true);
        createGUI();
     } 
}

JFileChooser для выбора файла

Дополнения

При работе с файлами из приложения возникает необходимость рано или поздно использовать диалог для выбора файлов.

public class TestFrame extends JFrame {
 
	public TestFrame() {
		super("Тестовое окно");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
		JPanel panel = new JPanel();
		panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
 
		panel.add(Box.createVerticalGlue());
 
		final JLabel label = new JLabel("Выбранный файл");
		label.setAlignmentX(CENTER_ALIGNMENT);
		panel.add(label);
 
		panel.add(Box.createRigidArea(new Dimension(10, 10)));
 
		JButton button = new JButton("Показать JFileChooser");
		button.setAlignmentX(CENTER_ALIGNMENT);
 
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JFileChooser fileopen = new JFileChooser();				
				int ret = fileopen.showDialog(null, "Открыть файл");				
				if (ret == JFileChooser.APPROVE_OPTION) {
					File file = fileopen.getSelectedFile();
					label.setText(file.getName());
				}
			}
		});
 
		panel.add(button);
		panel.add(Box.createVerticalGlue());
		getContentPane().add(panel);
 
		setPreferredSize(new Dimension(260, 220));
		pack();
		setLocationRelativeTo(null);
		setVisible(true);
	}
 
	public static void main(String[] args) {
		javax.swing.SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JFrame.setDefaultLookAndFeelDecorated(true);
				JDialog.setDefaultLookAndFeelDecorated(true);
				new TestFrame();
			}
		});
	}
}

JProgressBar полоса загрузки

JMenuBar

Стандартные диалоговые окна

Дополнения

String input = JOptionPane.showInputDialog(frame,"Введите логин","Добавить контакт",JOptionPane.WARNING_MESSAGE);
JOptionPane.showMessageDialog(null, input );

Менеджер размещения

В некоторых старомодных языках программирования необходимо было указывать координаты и размеры каждого компонента окна. Это работало хорошо, если было известно разрешающая способность экрана каждого пользователя. В Java есть схемы размещения (Layout Managers) , которые позволяют разместить компоненты на экране, не зная точных позиций компонентов. Схемы гарантируют, что та часть интерфейса, за которую они отвечают, будет выглядеть правильно в не зависимости от размеров окна и разрешения экрана.

Менеджер последовательного размещения FlowLayout

import java.awt.FlowLayout;
import javax.swing.*;
 
public class Window extends JFrame
{
    Window()
    {
        super("Вход в систему");
 
        JPanel panel = new JPanel();
        panel.setLayout(new FlowLayout());
        panel.add(new JButton("Кнопка"));
        panel.add(new JButton("+"));
        panel.add(new JButton("-"));
        panel.add(new JButton("Кнопка с длинной надписью"));
 
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
        setContentPane(panel);
        setSize(250, 100);        
    }
    public static void main(String[] args) 
    {
       Window w = new Window();
    }
}

Менеджер граничного размещения BorderLayout

Менеджер размещения BorderLayout разделяет панель на пять областей: центральную, верхнюю, нижнюю, правую и левую. В каждую из этих областей можно добавить ровно по одному компоненту, причем компонент будет занимать всю отведенную для него область. Компоненты, добавленные в верхнюю и нижнюю области, будут растянуты по ширине. обавленные в правую и левую — по высоте, а компонент, добавленный в центр, будет растянут так, чтобы полностью заполнить оставшееся пространство панели.

При добавлении элемента на панель с менеджером размещения BorderLayout, необходимо дополнительно указывать в методе add(), какая из областей имеется в виду. Для этого служат строки с названиями сторон света: «North», «South», «East», «West» и «Center». Но вместо них рекомендуется использовать константы, определенные в классе BorderLayout: NORTH, SOUTH, EAST, WEST и CENTER (поскольку в строке можно допустить ошибку и не заметить этого, а при попытке написать неправильно имя константы компилятор выдаст предупреждение).

import javax.swing.*;
 
public class Window extends JFrame
{
    Window()
    {
        super("Вход в систему");
 
        getContentPane().add(new JButton("Кнопка"),BorderLayout.NORTH);
        getContentPane().add(new JButton("+"), BorderLayout.EAST);
        getContentPane().add(new JButton("-"), BorderLayout.WEST);
        getContentPane().add(new JButton("Кнопка с длинной надписью"), BorderLayout.SOUTH);
        getContentPane().add(new JButton("В ЦЕНТР!"));
 
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
        setSize(250, 100);        
    }
    public static void main(String[] args) 
    {
       Window w = new Window();
    }
}

Менеджер табличного размещения GridLayout

GridLayout разбивает панель на ячейки одинаковой ширины и высоты (таким образом окно становится похожим на таблицу). Каждый элемент, добавляемый на панель с таким расположением, целиком занимает одну ячейку. Ячейки заполняются элементами по очереди, начиная с левой верхней.

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

import java.awt.*;
import javax.swing.*;
 
public class Window extends JFrame
{
    Window()
    {
        super("Вход в систему");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(2,3,5,10));
        panel.add(new JButton("Кнопка"));
        panel.add(new JButton("+"));
        panel.add(new JButton("-"));
        panel.add(new JButton("Кнопка с длинной надписью"));
        panel.add(new JButton("еще кнопка"));
        setContentPane(panel);
        setSize(250, 100);
        setVisible(true);
 
    }
    public static void main(String[] args) 
    {
       Window w = new Window();
    }
}

Менеджер блочного размещения BoxLayout и класс Box

Менеджер BoxLayout размещает элементы на панели в строку или в столбец. Обычно для работы с этим менеджером используют вспомогательный класс Box, представляющий собой панель, для которой уже настроено блочное размещение. Создается такая панель не конструктором, а одним из двух статических методов, определенных в классе Box: createHorizontalBox() и createVerticalBox().

Элементы, добавленные на панель с блочным размещением, выстраиваются один за другим. Расстояние между элементами по умолчанию нулевое. Однако вместо компонента можно добавить невидимую «распорку», единственная задача которой — раздвигать соседние элементы, обеспечивая между ними заданное расстояние.

Горизонтальная распорка создается статическим методом createHorizontalStrut(int width), а вертикальная — методом createVerticalStrut(int height). Оба метода определены в классе Box, а целочисленный параметр в каждом из них определяет размер распорки.

import java.awt.*;
import javax.swing.*;
 
public class Window extends JFrame
{
    Window()
    {
        super("Вход в систему");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Box box = Box.createVerticalBox();
        box.add(new JButton("Кнопка"));
        box.add(Box.createVerticalStrut(10));
        box.add(new JButton("+"));
        box.add(Box.createVerticalGlue());
        box.add(new JButton("-"));
        box.add(Box.createVerticalStrut(10));
        box.add(new JButton("Кнопка с длинной надписью"));
        setContentPane(box);
        setSize(250, 100);
        setVisible(true);
    }
    public static void main(String[] args) 
    {
       Window w = new Window();
    }
}

Ручное размещение элементов

Если в качестве менеджера размещения панели установить null, элементы не будут расставляться автоматически. Координаты каждого элемента необходимо в этом случае указать явно, при этом они никак не зависят от размеров панели и от координат других элементов. По умолчанию координаты равны нулю (т.е. элемент расположен в левом верхнем углу панели). Размер элемента также необходимо задавать явно (в противном случае его ширина и высота будут равны нулю и элемент отображаться не будет). Координаты элемента можно задать одним из следующих методов:

setLocation(int x, int y),
setLocation(Point point)

import javax.swing.*;
 
public class Window extends JFrame
{
    Window()
    {
        super("Пробное окно");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        panel.setLayout(null);
        JButton button = new JButton("Кнопка");
        button.setSize(80, 30);
        button.setLocation(20,20);
        panel.add(button);
        button = new JButton("Кнопка с длинной надписью");
        button.setSize(120, 40);
        button.setLocation(70,50);
        panel.add(button);
        setContentPane(panel);
        setSize(250, 150);
        setVisible(true);
    }
    public static void main(String[] args) 
    {
       Window w = new Window();
    }
}