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

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

  Все выпуски  

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


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

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

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

Java для чайников. Урок 37. JFrame.

На прошлом уроке мы познакомились с JFrame. Сегодня изучим его более подробно. Итак, берем пример прошлого урока и находим там строку

frame.setPreferredSize(new Dimension(200, 100));

Заменим ее на строку

frame.setPreferredSize(new Dimension(500, 500));

Теперь размер окна будет больше:

Также туда можно добавлять не только текстовые метки, но и сякие кнопки и прочее, а также кое-что поинтереснее, например, графические фигуры. Сейчас мы эти займемся. Но только сначала немного теории. Дело в том, что мы не просто будем добавлять фигуры в окно, но и разместим их по разным слоям. Для использования слоев нам понадобятся специальные панели, например JRootPane или JLayeredPane. Мы вспольуземся JLayeredPane, она предлагает следующие слои:

  • Default. Этот слой используется для размещения всех обычных компонентов, которые добавляются в контейнер. В этом слое располагаются внутренние окна многодокументных приложений.

  • Palette. Предназначен для размещения окон с набором инструментов, которые обычно перекрывают остальные элементы интерфейса. Создавать такие окна позволяет панель JDesktopPane, которая размещает их в этом слое.

  • Modal. Планировался для размещения легковесных модальных диалоговых окон. Однако такие диалоговые окна пока не реализованы, так что этот слой в Swing в настоящее время не используется.

  • Popup. Наиболее часто используемый слой, служащий для размещения всплывающих меню и подсказок.

  • Drag. Самый верхний слой. Предназначен для операций перетаскивания (drag and drop), которые должны быть хорошо видны в интерфейсе программы.

Ну, а теперь пример:

import javax.swing.*;

import java.awt.*;

 

// класс рисования двух типов фигур с текстом

class Figure extends JComponent

{

    private static final long serialVersionUID = 1L;

    private Color color;

    private int type;

    private String text;

   

    // параметры: цвет и тип фигуры

    Figure(Color color, int type, String text) {

        this.color = color;

        this.type = type;

        this.text = text;

        setOpaque(false);

    }

   

    public void paintComponent(Graphics g) {

   

        // прорисовка фигуры

        g.setColor(color);

        switch (type) {

        case 0: g.fillOval(0, 0, 90, 90); break;

        case 1: g.fillRect(0, 0, 130, 80); break;

        }

        g.setColor(Color.yellow);

        g.drawString(text, 10, 35);

    }

}

 

public class LayeredPane extends JFrame

{

    private static final long serialVersionUID = 1L;

 

    public LayeredPane()

    {

        // создание окна

        super("Пример окна со слоями");

       

        // выход при закрытии окна

        setDefaultCloseOperation(EXIT_ON_CLOSE);

       

        // определение многослойной панели

        JLayeredPane lp = getLayeredPane();

       

        // создание трех фигур

        Figure figure1 = new Figure(Color.red , 0, "Фигура popup");

        Figure figure2 = new Figure(Color.blue, 0, "Фигура 1");

        Figure figure3 = new Figure(Color.cyan, 1, "Фигура 2");

       

        // определение местоположения фигур в окне

        figure1.setBounds(10, 40, 120, 120);

        figure2.setBounds(60, 120, 160, 180);

        figure3.setBounds(90, 55, 250, 180);

       

        // добавление фигур в различные слои

        lp.add(figure1, JLayeredPane.POPUP_LAYER  );

        lp.add(figure2, JLayeredPane.PALETTE_LAYER);

        lp.add(figure3, JLayeredPane.PALETTE_LAYER);

       

        // смена позиции одной из фигур

        lp.setPosition(figure3, 0);

       

        // определение размера и открытие окна

        setSize(280, 250);

        setVisible(true);

    }

   

    public static void main(String[] args)

    {

        JFrame.setDefaultLookAndFeelDecorated(true);

        new LayeredPane();

    }

}

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

Теперь разберемся, как работает программа. Для отображения фигуры мы объявляем отдельный класс Figure, который является потомком класса JComponent:

// класс рисования двух типов фигур с текстом

class Figure extends JComponent

{

    private static final long serialVersionUID = 1L;

    private Color color;

    private int type;

    private String text;

   

    // параметры: цвет и тип фигуры

    Figure(Color color, int type, String text) {

        this.color = color;

        this.type = type;

        this.text = text;

        setOpaque(false);

    }

   

    public void paintComponent(Graphics g) {

   

        // прорисовка фигуры

        g.setColor(color);

        switch (type) {

        case 0: g.fillOval(0, 0, 90, 90); break;

        case 1: g.fillRect(0, 0, 130, 80); break;

        }

        g.setColor(Color.yellow);

        g.drawString(text, 10, 35);

    }

}

Главный класс окна, для удобства, мы создаем из JFrame, разместив в конструкторе те объекты (Figure), которые мы будем выводить на экран. Мы их сначала создаем:

        // создание трех фигур

        Figure figure1 = new Figure(Color.red , 0, "Фигура popup");

        Figure figure2 = new Figure(Color.blue, 0, "Фигура 1");

        Figure figure3 = new Figure(Color.cyan, 1, "Фигура 2");

       

        // определение местоположения фигур в окне

        figure1.setBounds(10, 40, 120, 120);

        figure2.setBounds(60, 120, 160, 180);

        figure3.setBounds(90, 55, 250, 180);

а потом добавляем в контейнер JLayeredPane:

        // добавление фигур в различные слои

        lp.add(figure1, JLayeredPane.POPUP_LAYER  );

        lp.add(figure2, JLayeredPane.PALETTE_LAYER);

        lp.add(figure3, JLayeredPane.PALETTE_LAYER);

который создали ранее:

        // определение многослойной панели

        JLayeredPane lp = getLayeredPane();

Обратите внимание вот на эту строку кода:

        // смена позиции одной из фигур

        lp.setPosition(figure3, 0);

Мы можем внести в нее изменения, сделав первым круг, а не прямоугольник:

        // смена позиции одной из фигур

        lp.setPosition(figure2, 0);

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

 

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

 

 


В избранное