Інтерфейс MouseMotionListener 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Інтерфейс MouseMotionListener



методи:
void mouseDragged(MouseEvent me);

void mouseMoved(MouseEvent me) – методи викликаються багато разів, коли мишка перетягується (dragged) або коли мишка переміщується.

 

Приклад 2.

import javax.swing.*;

import java.awt.*;

import java.awt.event.MouseMotionListener;

import java.awt.event.MouseEvent;

import java.awt.event.ActionListener;

import java.awt.event.ActionEvent;

public class Lab3 extends JFrame

{

private JLabel label;

private JButton button;

 

public Lab3()

{

setTitle("Work #3");

setSize(300,300);

getContentPane().setLayout(new FlowLayout());

addMouseMotionListener(new Lab3MouseMoution());

 

label = new JLabel("simple label");

getContentPane().add(label);

 

button = new JButton("Press me");

button.addActionListener(new ButtonPressed());

getContentPane().add(button);

 

setVisible(true);

}

public static void main(String[] args)

{

new Lab3();

}

class Lab3MouseMoution implements MouseMotionListener

{

public void mouseDragged(MouseEvent e)

{

}

public void mouseMoved(MouseEvent e)

{

System.out.println("mouse moved, x - "+e.getX()+", y - "+e.getY());

}

}

class ButtonPressed implements ActionListener

{

public void actionPerformed(ActionEvent e)

{

System.out.println("button pressed");

}

}

}

 

Пояснення:

class Lab3MouseMoution implements MouseMotionListener – класс-слухач подій переміщення мишки;

addMouseMotionListener(new Lab3MouseMoution()) – додаємо слухач, котрий буде обробляти події типу переміщення мишки до вікна Lab3.

class ButtonPressed implements ActionListener – клас-слухач події натискання на кнопку.
button.addActionListener(new ButtonPressed()) – додаємо слухач натискання на кнопку до кнопки button.

Порядок виконання роботи

1. Помістіть програмно вікно Lab3 по центру екрану.

Для цього отримайте розміри екрану:
int width = Toolkit.getDefaultToolkit().getScreenSize().width;
int height = Toolkit.getDefaultToolkit().getScreenSize().height.

Помістіть вікно з допомогою методу:
setBounds(int x, int y, int width, int hight).

Додайте ці методи в конструкторі класу Lab3() перед методом setVisible().

2. Змініть клас Lab3MouseMoution таким чином, щоб при переміщенні мишки над вікном координати мишки виводились на написі label.

3. При натисканні на кнопку "Press me" нічо не відбувається зробіть так, щоб виводилося повідомленн "Press me" в консольне меню.

4. Зробіть так, щоб при натисканні на кнопку "Press me" виводилося повідомлення "Press me" в label.

5. Додати ще один об’єкт типу Jlabel, додайте клас-слухач таким чином, щоб на написі відображались координати вікна та його розмір.

6. Назвіть вікно своєю фамілією.

7. Оформити звіт. У звіті повинно бути текст програми і скріншоти результатів.

8. Прикріпити до VNS файл [Ваша Фамілія].zip в архіві повинно бути файли програм [Ваша Фамілія]_labN_k.class,a також файли звіту [Ваша Фамілія]_Zvit_LabN.mdb, де N – номер лабораторної роботи, k – номер програми.

Контрольні питання

1. Для чого призначений компонент JtextField?

2. Поясніть термін контейнери найвищого рівня?

3. Метод якого слухача викликається коли настає action-подія, наприклад, користувач натискає мишкою на кнопці або написі.

4. Методи якого слухача викликаються коли компонент змінюється в розмірах, переміщуються, відображається на екрані або стає невидимим.

5. Методи якого слухача викликаються коли кнопка мишки натискається і відразу ж відпускається чи вказівник мишки входить в межі компонента чи вказівник мишки виходить за межі компонента, кнопка мишки натискається чи відпускається.

6. Який з класів відноситься до контейнерів найвищого рівня?


Лабораторна робота №8 (Пакет Swing – компонувальники (LayoutManager))

 

Тема роботи: Пакет Swing – компонувальники (LayoutManager).

Мета роботи: Дослідити роботу, одного з компонентів пакету Swing, компонувальники (LayoutManager).

План роботи

1. Ознамитися з LayoutManager.

2. Дослідити роботу компонувальників: FlowLayout, BorderLayout, CardLayout, BoxLayout, GridLayout.

3. Навчитися добавляти компонувальники до контейнерів.

4. Навчитися задавати параметри компонувальників.

5. Вивчити властивості кожного компонувальника.

Теоретичні відомості

LayoutManager – це об’єкт, котрий визначає розміри та розташування компонентів в межах контейнера. Хоча компоненти самі визначають свої розміри та вирівнювання, останнє слово стосовно їх розташування належить компонувальнику контейнера. Задати компонувальник можна використовуючи конструктор JPanel.

 

Наприклад:

JPanel panel = new JPanel(new BorderLayout());

 

Можна задати компонувальник після того як контейнер створено.

 

Наприклад:

Container contentPane = frame.getContentPane();contentPane.setLayout(new FlowLayout());

Хоча рекомендується використовувати layout managers, можна створити контейнер і встановити layout managers null. В цьому випадку ми використовуємо абсолютне позиціонування, тобто ми повинні безпосередньо задати розміри та розташування компонентів в межах контейнера. Недолік даного підходу в тому, що компоненти не будуть коректно вирівняні коли розміри контейнеру змінюються.

 

Компоновульник FlowLayout.

Компонувальник FlowLayout надає найпростіший спосіб розташування компонентів. Цей компонувальник є компонувальником по-замовчуванню для JPanel. На малюнку показано приклад застосування даного компонувальника:

 

Приклад 1.

import javax.swing.*;

import java.awt.*;

 

public class Lab4 extends JFrame

{

public Lab4()

{

setTitle("FlowLayoutDemo");

 

Container contentPane = getContentPane();

 

contentPane.setLayout(new FlowLayout());

 

contentPane.add(new JButton("Button 1"));

contentPane.add(new JButton("Button 2"));

contentPane.add(new JButton("Button 3"));

contentPane.add(new JButton("Long-Named Button 4"));

contentPane.add(new JButton("5"));

}

 

 

public static void main(String[] args)

{

Lab4 lab4 = new Lab4();

lab4.pack();

lab4.setVisible(true);

}

}

 

Клас FlowLayout має три конструктори:

public FlowLayout()public FlowLayout(int alignment)public FlowLayout(int alignment, int horizontalGap, int verticalGap)

 

Аргумент alignment може бути FlowLayout.LEADING, FlowLayout.CENTER, or FlowLayout.TRAILING. Якщо аргумент alignment дорівнює FlowLayout.LEADING – компоненти будуть вирівнюватись по лівому краю, якщо FlowLayout.TRAILING - по правому, якщо FlowLayout.CENTER – по центру (це значення по-замовчуванню). Аргументи horizontalGap and verticalGap задають відстань між компонентами в пікселах.

 

Компонувальник BorderLayout

На малюнку показано розташування кнопок у випадку використання даного компонувальника:

 

Приклад 2.

import javax.swing.*;

import java.awt.*;

 

public class Lab4 extends JFrame

{

public Lab4()

{

setTitle("BorderLayoutDemo");

 

Container contentPane = getContentPane();

 

contentPane.setLayout(new BorderLayout());

 

contentPane.add(new JButton("Button 1 - NORTH"), BorderLayout.NORTH);

contentPane.add(new JButton("Button 2 - SOUTH"), BorderLayout.SOUTH);

contentPane.add(new JButton("Button 3 - WEST"), BorderLayout.WEST);

contentPane.add(new JButton("Button 4 - EAST"), BorderLayout.EAST);

contentPane.add(new JButton("Button 5 - CENTER"), BorderLayout.CENTER);

}

 

public static void main(String[] args)

{

Lab4 lab4 = new Lab4();

lab4.pack();

lab4.setVisible(true);

}

}

 

Компонувальник CardLayout.

Даний компонувальник отримав свою назву по аналогії із колодою карт, коли тільки верхня карта із цілої колоди є видимою. За власним бажанням ми можемо показати будь-яку. Як правило до контейнера із CardLayout додаються інші об’єкти типу JPanel.

 

Приклад 3.

 

import javax.swing.*;

import java.awt.*;

import java.awt.event.ActionListener;

import java.awt.event.ActionEvent;

 

public class Lab4 extends JFrame

{

private CardLayout layoutCard;

private JCheckBox chboxSelect;

private JPanel pnlMain;

 

public Lab4()

{

setTitle("CardLayoutDemo");

 

Container contentPane = getContentPane();

 

contentPane.setLayout(new BorderLayout());

 

chboxSelect = new JCheckBox("Select panel");

chboxSelect.addActionListener(new SelectPanel());

chboxSelect.setSelected(true);

contentPane.add(chboxSelect, BorderLayout.NORTH);

 

JPanel pnlFlow = new JPanel(new FlowLayout());

JPanel pnlBorder = new JPanel(new BorderLayout());

 

layoutCard = new CardLayout();

pnlMain = new JPanel(layoutCard);

contentPane.add(pnlMain, BorderLayout.CENTER);

 

pnlMain.add(pnlFlow, "FlowLayout");

pnlMain.add(pnlBorder, "BorderLayout");

 

pnlFlow.add(new JButton("Button 1"));

pnlFlow.add(new JButton("Button 2"));

pnlFlow.add(new JButton("Button 3"));

pnlFlow.add(new JButton("Long-Named Button 4"));

pnlFlow.add(new JButton("5"));

 

pnlBorder.add(new JButton("Button 1 - NORTH"), BorderLayout.NORTH);

pnlBorder.add(new JButton("Button 2 - SOUTH"), BorderLayout.SOUTH);

pnlBorder.add(new JButton("Button 3 - WEST"), BorderLayout.WEST);

pnlBorder.add(new JButton("Button 4 - EAST"), BorderLayout.EAST);

pnlBorder.add(new JButton("Button 5 - CENTER"), BorderLayout.CENTER);

}

 

class SelectPanel implements ActionListener

{

public void actionPerformed(ActionEvent e)

{

if (chboxSelect.isSelected())

layoutCard.show(pnlMain, "FlowLayout");

else

layoutCard.show(pnlMain, "BorderLayout");

}

}

public static void main(String[] args)

{

Lab4 lab4 = new Lab4();

lab4.pack();

lab4.setVisible(true);

}

}

Результат виконання програми

 

 

На даному прикладі показані дві панелі, додані до панелі із компонувальником CardLayout. Для того, щоб показати одну із панель – натисніть селектор (JCheckBox) із написом “Select panel”.

Коли ми додаємо панелі до контейнера ми повинні задати стрічку, котра ідентифікує дану панель. В даному прикладі ми додаємо першу панель із стрічкою "FlowLayout", а другу – із "BorderLayout". Для того, щоб показати одну із панелей, необхідно передати функції show() як аргумент стрічку, котра ідентифікує панель.

 

Компонувальник BoxLayout.

Цей компонувальник подібний до FlowLayout, але використовуючи його можна задавати вісь, вздовж якої будуть додаватись компоненти.

 

Приклад 4.

 

import javax.swing.*;

import java.awt.*;

 

public class Lab4 extends JFrame

{

 

public Lab4()

{

setTitle("CardLayoutDemo");

 

Container contentPane = getContentPane();

 

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

 

JButton button1 = new JButton("Button 1");

contentPane.add(button1);

 

JButton button2 = new JButton("Button 2");

contentPane.add(button2);

 

JButton button3 = new JButton("Button 3");

contentPane.add(button3);

 

JButton button4 = new JButton("Long-Named Button 4");

contentPane.add(button4);

 

JButton button5 = new JButton("5");

contentPane.add(button5);

}

 

 

public static void main(String[] args)

{

Lab4 lab4 = new Lab4();

lab4.pack();

lab4.setVisible(true);

}

}

 

Результат виконання даної програми показано на даному малюнку:

 

В конструкторі BoxLayout(contentPane, BoxLayout.Y_AXIS) в якості аргументу передається значення BoxLayout.Y_AXIS, тому кнопки розташовані по вертикалі.

Крім того, BoxLayout має ряд особливостей. У випадку використання даного компонувальника береться до уваги також вирівнювання для кожного компонента, доданого до контейнера. Ця властивість компонента задається таким чином: button1.setAlignmentX(float x),

Де аргумент x може приймати значення від 0.0 до 1.0. Існує три наперед визначених можливості:

JButton.CENTER_ALIGNMENT = 0.5

JButton.LEFT_ALIGNMENT = 0.0

JButton.RIGHT_ALIGNMENT = 1.0

 

На наступному малюнку показано три варіанти вирівнювань:

 

Наступна особливість – розмір кнопки визначається її максимальною величиною. Якщо ми задамо максимальний розмір кнопки таким, що її ширина буде більшою, ніж екран – кнопка займе весь контейнер по ширині.

 

Компонувальник GridLayout

Компонувальник GridLayout розташовує компоненти у вигляді сітки комірок. Кожен компонент займає весь простір в межах комірки, причому всі комірки мають одинаковий розмір. Якщо ми змінимо розмір контейнера – всі комірки теж змінять свої розміри, займаючи весь вільний простір.

 

Приклад 5.

 

import javax.swing.*;

import java.awt.*;

 

public class Lab5 extends JFrame

{

public Lab5()

{

setTitle("GridLayoutDemo");

 

Container contentPane = getContentPane();

 

contentPane.setLayout(new GridLayout(0,2));

 

JButton button1 = new JButton("Button 1");

contentPane.add(button1);

 

JButton button2 = new JButton("Button 2");

contentPane.add(button2);

 

JButton button3 = new JButton("Button 3");

contentPane.add(button3);

 

JButton button4 = new JButton("Long-Named Button 4");

contentPane.add(button4);

 

JButton button5 = new JButton("5");

contentPane.add(button5);

}

 

public static void main(String[] args)

{

Lab5 lab5 = new Lab5();

lab5.pack();

lab5.setVisible(true);

}

}

 

В результаті виконання даної програми ви побачите наступне вікно:

 

Клас GridLayout має два конструктори:

public GridLayout(int rows, int columns)

public GridLayout(int rows, int columns, int horizontalGap, int verticalGap)

Принаймні один із аргументів rows або columns повинен не дорівнювати нулю; якщо один із аргументів нуль, як в даному прикладі, тоді кількість рядків визначається кількістю доданих кнопок, причому кнопки розташовується в дві колонки. Аргументи horizontalGap і verticalGap дозволяють задати відстань між компонентами в пікселах. По замовчуванню ця відстань дорівнює нулю. Компонувальник GridBagLayout.

 

Приклад 6.

 

import javax.swing.*;

import java.awt.*;

 

public class Lab5 extends JFrame

{

public Lab5()

{

setTitle("GridBagLayoutDemo");

Container pane = getContentPane();

 

pane.setLayout(new GridBagLayout());

GridBagConstraints c = new GridBagConstraints();

c.fill = GridBagConstraints.HORIZONTAL;

 

JButton button1 = new JButton("Button 1");

c.weightx = 0.5;

c.gridx = 0;

c.gridy = 0;

pane.add(button1, c);

 

JButton button2 = new JButton("Button 2");

c.gridx = 1;

c.gridy = 0;

pane.add(button2, c);

 

JButton button3 = new JButton("Button 3");

c.gridx = 2;

c.gridy = 0;

pane.add(button3, c);

 

JButton button4 = new JButton("Long-Named Button 4");

c.ipady = 40; //make this component tall

c.weightx = 0.0;

c.gridwidth = 3;

c.gridx = 0;

c.gridy = 1;

pane.add(button4, c);

 

JButton button5 = new JButton("5");

c.ipady = 0; //reset to default

c.weighty = 1.0; //request any extra vertical space

c.anchor = GridBagConstraints.PAGE_END; //bottom of space

c.insets = new Insets(10,0,0,0); //top padding

c.gridx = 1; //aligned with button 2

c.gridwidth = 2; //2 columns wide

c.gridy = 2; //third row

pane.add(button5, c);

}

 

public static void main(String[] args)

{

Lab5 lab5 = new Lab5();

lab5.pack();

lab5.setVisible(true);

}

}

 

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

GridBagLayout є найбільш гнучким і разом з тим найбільш складним в платформі Java. Він дозволяє розміщувати компоненти у виляді сітки із рядів і колонок. При цьому компоненти можуть займати декілька рядків або колонок. Також колонки можуть мати різну ширину, а рядки різну висоту. При цьому для визначення висоти і ширини комірки приймається до уваги найоптимальніший розмір компонента. Цей розмір отримується функцією getPrefferedSize(). Його також можна задати для кожного компонента з допомогою функції setPrefferedSize(Dimension dim).

На наступному малюнку показана сітка для попереднього вікна. Як видно, сітка має три колонки і три рядки. Кнопка в другому рядку займає всі колонки; кнопка в третьому рядку займає дві праві колонки.

 

Якщо ми збільшимо вікно, як показано на малюнку, то побачимо, що нижній ряд, де знаходиться Button 5, займає весь новий вертикальний простір. Новий горизонтальний простір ділиться між всіма колонками. Така поведінка компонентів задається параметрами GridBagLayout. Слід відмітити, що кожен компонент займає весь можливий горизонтальний простір, але не весь можливий вертикальний простір (як можна бачити у Button 5). Ця поведінка теж задається в програмі.

 

Для того, щоб задати поведінку кожного компонента, ми повинні задати для кожного із них свої констрейнти (contraints). Констрейнт – це об’єкт класу GridBagConstraints. При додаванні компонента до контейнера, ми повинні вказати констрейнт для кожного компонента.

 

Наприклад:

 

GridBagConstraints c = new GridBagConstraints();

c.fill = GridBagConstraints.HORIZONTAL;

 

JButton button1 = new JButton("Button 1");

c.weightx = 0.5;

c.gridx = 0;

c.gridy = 0;

pane.add(button1, c);

 

Нижче пояснюється значення кожної змінної класу GridBagConstrains:

gridx, gridy

Задає рядок і колонку де буде знаходитись верхній лівий куток компонента. По замовчуванню, gridx=0 і gridy=0.

gridwidth, gridheight

Задає кількіть колонок (gridwidth) або рядків (gridheight) які буде займати компонент. Або інакше кажучи, цим параметром задається кількість комірок, але не пікселів, котрі займає компонент. Значення по замовчуванню - 1.

Fill

Якщо розмір оптимальний розмір компонента (визначається get/setPrefferedSize()) є меншим ніж комірка, в якій знаходиться компонент, цей параметр задає, яким чином буде зайнятий вільний простір в межах комірки. Значення по замовчування GridBagConstraints.NONE, Якщо цей параметр - GridBagConstraints.HORIZONTAL – компонент займає весь можливий горизонтальний простір, якщо - VERTICAL - компонент займає весь можливий вертикальний простір, а у випадку BOTH – компонент займає всю комірку.

ipadx, ipady

Задає мінімальний можливий розмір компонента в комірці. По замовчуванню – 0. Ширина компонента буде не менше, ніж його мінімальна ширина плюс ipadx*2 піксел, аналогічно, висота компонента буде не меншою, ніж його мінімальна висота плюс ipady*2 піксел. (Мінімальні розміри компонента задаються функцією getMinimumSize()).

Insets

Задає відстань між компонентом та краєм комірки, в якій знаходиться компонент. Ця величина – обєкт класу Insets(int top, int left, int bottom, int right). По замовчуванню, дорівнює null.

Anchor

Використовується, коли компонент є меншим, ніж комірка, в якій він знаходиться, визначає розташування компонента в комірці. Можливі значення (GridBagConstraints константи): CENTER (по замовчуванню), PAGE_START, PAGE_END, LINE_START, LINE_END, FIRST_LINE_START, FIRST_LINE_END, LAST_LINE_END, і LAST_LINE_START.

Нижче на малюнку показано розташування компонента в межах комірки із заданими значеннями anchor.

-----------------------------------------------------------------------

| NORTHEAST NORTH NORTHWEST |

| |

| |

|EAST CENTER WEST |

| |

| |

|SOUTHEAST EAST SOUTHWEST |

------------------------------------------------------------------------

weightx, weighty

Ці параметри визначають те, яким чином розподіляється вільна область контейнера. Параметр weightx - визначає як розподіляється область між колонками, а weighty – між рядками. Можливі значення – від 0.0 до 1.0.

Якщо ми не задали ці параметри, то всі компоненти будуть знаходитись по центру контейнера. Якщо одна із колонок має weightx=1.0, тоді вона буде займати весь вільний простір контейнера по ширині. Аналогічно розподіляється простір по-вертикалі.

Порядок виконання роботи

1. Виконайте приклад 1 із різними значеннями аргументу alignment.

Спробуєте змінити розміри вікна. Зверніть увагу як при цьому змінюється розташування кнопок.

2. Виконайте приклад 2 із різною кількістю доданих кнопок.

Спробуєте змінити розміри вікна. Зверніть увагу як при цьому змінюється розташування кнопок. Спробуйте додати дві кнопки з одним і тим же значенням BorderLayout.

3. Виконайте приклад 3.

4. Виконайте приклад 4. Задайте різні значення вирівнювання для всіх кнопок: button1.setAlignmentX(JButton.CENTER_ALIGNMENT).Задайте значення максимального розміру кнопок, як показано нижче: button1.setMaximumSize(new Dimension(Integer.MAX_VALUE,30)).

Спробуйте поміняти розмір вікна.

5.Виконайте приклад 5. Змініть кількість колонок та рядків в конструкторі. Зверніть увагу на поведінку кнопок при зміні розмірів вікна.

6. Виконайте приклад 6.

7. Зробити висновки.

8. Оформити звіт. У звіті повинно бути текст програми і скріншоти результатів.

9. Прикріпити до VNS файл [Ваша Фамілія].zip в архіві повинно бути файли програм [Ваша Фамілія]_labN_k.class,a також файли звіту [Ваша Фамілія]_Zvit_LabN.mdb, де N – номер лабораторної роботи, k – номер програми.

Контрольні питання

1. Який з компонувальників використовує змінну констрейнт (Constraints)?

2. Який параметр у компонувальнику GridBagLayout задає відстань між компонентом та краєм комірки, в якій знаходиться компонент.

3. Який параметр у компонувальнику GridBagLayout задає мінімальний можливий розмір компонента в комірці.

4. Який параметр у компонувальнику GridBagLayout задає кількіть колонок або рядків які буде займати компонент.

5. Який параметр у компонувальнику GridBagLayout задає рядок і колонку де буде знаходитись верхній лівий куток компонента.

6. Який з компонувальників дозволяє розміщувати компоненти у виляді сітки із рядів і колонок. При цьому компоненти можуть займати декілька рядків або колонок. Також колонки можуть мати різну ширину, а рядки різну висоту. При цьому для визначення висоти і ширини комірки приймається до уваги найоптимальніший розмір компонента.

7. Який компонувальник розташовує компоненти у вигляді сітки комірок.



Поделиться:


Последнее изменение этой страницы: 2016-04-26; просмотров: 205; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.149.234.141 (0.167 с.)