Создание диалоговых окон в Java

Создание диалоговых окон в JavaКак вы наверное уже знаете, для использования предопределенных диалоговых окон применяется класс JOptionPane. Теперь мы опишем, как "вручную" создать собственное диалоговое окно.

На рис.1 показано типичное модальное диалоговое окно, содержащее сообщение. Подобное окно отображается на экране после того, как пользователь выбрал пункт меню About.

Для того чтобы реализовать такое окно, необходимо создать подкласс класса JDialog. По сути, это тот же процесс, которым мы воспользовались для создания главного окна приложения, расширяя класс JFrame.

Точнее говоря, нужно сделать следующее:

  1. В конструкторе вашего диалогового окна вызовите конструктор суперкласса JDialog. Добавьте в диалоговое окно компоненты пользовательского интерфейса.
  2. Добавьте обработчики событий.
  3. Задайте размер диалогового окна.

При вызове конструктора суперкласса нужно указать фрейм-владелец, заголовок окна и признак модальности.

Фрейм-владелец управляет местом отображения диалога. Вы можете указать null вместо владельца - тогда диалог будет принадлежать скрытому фрейму.

Признак модальности указывает на то, должны ли блокироваться другие окна вашего приложения, пока отображается диалог. Немодальные окна не блокируют другие окна.

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

С другой стороны, модальные диалоги вы будете использовать, чтобы вынудить пользователя ввести необходимую информацию, прежде чем продолжить работу приложения.

Начиная с Java SE 6, добавлены два дополнительных типа модальности. Документо-модальный диалог блокирует все окна, относящиеся к одному "документу", или, точнее говоря, все окна с тем же родительским корневым окном, что и у данного диалога.

Это решает проблему систем помощи. В более старых версиях пользователи не могли взаимодействовать с окнами справки, когда всплыли модальный диалог. Toolkit-модальный диалог блокирует все окна их одного и того же "toolkit"(набора инструментов).

Toolkit - это программа Java, запускающая несколько приложений, такая как механизм аплетов в браузере. Дополнительную информацию на эту тему можно найти по адресу http://www.oracle.com/technetwork/java/index.html

Создание диалоговых окон в JavaРис.1. Диалоговое окно About

Ниже приведен фрагмент программы, создающая диалоговое окно:

class AboutDialog extends JDialog
{
    public AboutDialog(JFrame owner)
    {
        super(owner, "About DialogTest", true);

        //   HTML-   .

        add(new JLabel(
                "<html><h1><i>  Java</i></h1><hr>"
                + "Pro-java.ru  Java</html>"),
                BorderLayout.CENTER);

        //       .

                JButton ok = new JButton("ok");
                ok.addActionListener(new ActionListener() {

                    public void actionPerformed(ActionEvent event) {
                        setVisible(false);
                    }
                });

        //       .

                JPanel panel = new JPanel();
                panel.add(ok);
                add(panel, BorderLayout.SOUTH);
                setSize(260, 160);
    }
}

Как видите, конструктор добавляет элементы пользовательского интерфейса, в данном случае - метки и кнопку. Кроме того, он добавляет обработчик кнопки и задает размер окна.

Для того чтобы отобразить диалоговое окно на экране, необходимо создать новый объект JDialog и вызвать метод setVisible():

JDialog dialog = new AboutDialog(this);
dialog.setVisible(true);

Фактически в программе, рассматриваемой здесь в качестве примера, диалоговое окно создается только единожды, а затем мы используем его повторно каждый раз, когда пользователь щелкает на кнопке About:

if(dialog == null) //  .
    dialog == new AboutDialog(this);
dialog.setVisible(true);

Когда пользователь щелкает на кнопке ОК, диалоговое окно должно закрываться. Эта реакция определяется в обработчике событий, связанных с кнопкой ОК:

ok.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
setVisible(false);
}
});

Когда пользователь закрывает окно диалога, щелкая на кнопке Close, оно исчезает с экрана. Как и в классе JFrame, программист может изменять эту реакцию с помощью метода setDefaultCloseOperation().

Программа, демонстрирующая использование диалогового окна About, приведена ниже:

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

public class DialogTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
            EventQueue.invokeLater(new Runnable(){
                public void run() {
                    DialogFrame frame = new DialogFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setVisible(true);
                }
            });
    }

}
/**
*   .    File->About
*   .
*/
class DialogFrame extends JFrame
{
    public DialogFrame()
    {
        setTitle("DialogTest");
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

        //   File.

        JMenuBar menuBar = new JMenuBar();
        setJMenuBar(menuBar);
        JMenu fileMenu = new JMenu("File");
        menuBar.add(fileMenu);

        //    About  Exit.

        //    About    About

        JMenuItem aboutItem = new JMenuItem("About");
        aboutItem.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent event) {
                if(dialog == null) //   
                    dialog = new AboutDialog(DialogFrame.this);
                dialog.setVisible(true); //  
            }
        });
        fileMenu.add(aboutItem);

        //    Exit  .

        JMenuItem exitItem = new JMenuItem("Exit");
        exitItem.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent event) {
                System.exit(0);
            }
        });
        fileMenu.add(exitItem);
    }

    public static final int DEFAULT_WIDTH = 300;
    public static final int DEFAULT_HEIGHT = 200;

    private AboutDialog dialog;
}

/*
 *     
 *      .
 */

class AboutDialog extends JDialog
{
    public AboutDialog(JFrame owner)
    {
        super(owner, "About DialogTest", true);

        //   HTML-   .

        add(new JLabel(
                "<html><h1><i>  Java</i></h1><hr>"
                + "Pro-java.ru  Java</html>"),
                BorderLayout.CENTER);

        //       .

                JButton ok = new JButton("ok");
                ok.addActionListener(new ActionListener() {

                    public void actionPerformed(ActionEvent event) {
                        setVisible(false);
                    }
                });

        //       .

                JPanel panel = new JPanel();
                panel.add(ok);
                add(panel, BorderLayout.SOUTH);
                setSize(260, 160);
    }
}

Один комментарий на “Создание диалоговых окон в Java

  1. На основе класса Thread, как создать пустое окно, которое произвольно двигаться в пределах монитора?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *