Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методичка по JAVA

.PDF
Скачиваний:
647
Добавлен:
21.03.2016
Размер:
926 Кб
Скачать
☆

java.lang.Object

•

реализация PL&F

 

•

расширяемость

java.awt.Component

java.awt.Container

JComponent

Рисунок 22. JComponent

•обработка событий клавиатуры

•прорисовка границ

•масштабируемость

•отображение подсказок

•автопрокрутка

•возможность отладки графики

•поддержка вспомогательных технологий

• многоязыковая поддержка

Класс JPanel

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

Интерфейс Icon и класс ImageIcon

Интерфейс Icon описывает изображения фиксированного размера. Класс ImageIcon реализует интерфейс Icon для объекта типа java.awt.Image.

public interface Icon {

void paintIcon(Component c, Graphics g, int x, int y); int getIconWidth();

int getIconHeight();

}

Отличия ImageIcon от java.awt.Image:

•не требует монитора при загрузке

•является сериализуемым

Если объект типа IconImage использует динамически меняющееся изображение, то для его отображения необходимо связать наблюдатель ImageObserver с изображением IconImage. Обычно наблюдателем является тот компонент, на котором изображается ImageIcon.

IconImage picture = new IconImage("pic.gif");

Jbutton button = new Jbutton(picture); picture.setImageObserver(button);

101

Класс JLabel

Реализует однострочную текстовую метку с дополнительными возможностями по сравнению с java.awt.Label, такими как:

•Наличие изображения

•Возможность изменения взаимного расположения текста и изображения Пример использования:

public class LabelPanel extends JPanel { public LabelPanel() {

// Создать и добавить JLabel

JLabel plainLabel = new JLabel("Plain Small Label"); add(plainLabel);

// Создать вторую JLabel

JLabel fancyLabel = new JLabel("Fancy Big Label"); // Реализовать объект Font для использования на метке Font fancyFont = new Font("Serif",

Font.BOLD | Font.ITALIC, 32);

//Связать шрифт и метку fancyLabel.setFont(fancyFont);

//Создать изображение Icon

Icon tigerIcon = new ImageIcon("SmallTiger.gif");

//Поместить изображение на метку fancyLabel.setIcon(tigerIcon);

//Поместить текст справа от изображения fancyLabel.setHorizontalAlignment(JLabel.RIGHT);

//Поместить на панель

add(fancyLabel);

}

}

Класс JButton

Является реализацией кнопки с возможностью включения изображения. Фон кнопки должен совпадать с фоном контейнера, в котором она находится.

public class ButtonPanel extends JPanel { public ButtonPanel() {

Icon tigerIcon = new ImageIcon("SmallTiger.gif");

JButton myButton = new JButton("Tiger", tigerIcon); myButton.setBackground (SystemColor.control); add(myButton);

}

}

102

Класс JCheckBox

Соответствует объекту CheckBox, не входящему в группу. Можно задавать собственные изображения для выбранного и невыбранного состояния.

public class CheckboxPanel extends JPanel {

Icon unchecked = new ToggleIcon (false);

Icon checked = new ToggleIcon (true); public CheckboxPanel() {

//Установить компоновку для JPanel setLayout(new GridLayout(2, 1));

//Создать элемент выбора с состоянием true

JCheckBox cb1 = new JCheckBox("Choose Me", true); cb1.setIcon(unchecked); cb1.setSelectedIcon(checked);

//Создать элемент выбора с состоянием false

JCheckBox cb2 = new JCheckBox("No Choose Me", false); cb2.setIcon(unchecked); cb2.setSelectedIcon(checked);

add(cb1);

add(cb2);

}

class ToggleIcon implements Icon { boolean state;

public ToggleIcon (boolean s) { state = s;

}

public void paintIcon (Component c, Graphics g, int x, int y) {

int width = getIconWidth(); int height = getIconHeight(); g.setColor (Color.black);

if (state)

g.fillOval (x, y, width, height); else

g.drawOval (x, y, width, height);

}

public int getIconWidth() { return 10;

}

public int getIconHeight() { return 10;

}

}

}

103

Класс JRadioButton

Соответствует объекту CheckBox, входящему в группу, так, что в данный мо-

мент времени может быть выбран только один из них. Группа объектов задается с помощью ButtonGroup.

public class RadioButtonPanel extends JPanel { public RadioButtonPanel() {

//Установить компоновку GridLayout setLayout(new GridLayout(4,1));

//Объявление переключателя JRadioButton radioButton;

//Реализация группы для переключателей

ButtonGroup rbg = new ButtonGroup();

//Создание метки для группы

JLabel label = new JLabel("Annual Salary: "); label.setFont(new Font("SansSerif", Font.BOLD, 14)); add(label);

//Добавить новый переключатель radioButton = new JRadioButton("$45,000"); add (radioButton);

//установить "горячую" клавишу radioButton.setKeyAccelerator ('4');

//Добавить переключатель в группу rbg.add (radioButton);

//Установить данный переключатель по умолчанию radioButton.setSelected(true);

//Установить еще 2 переключателя

radioButton = new JRadioButton("$60,000"); radioButton.setKeyAccelerator ('6');

add (radioButton); rbg.add (radioButton);

radioButton = new JRadioButton("$75,000"); radioButton.setKeyAccelerator ('7');

add (radioButton); rbg.add (radioButton);

}

}

Класс JToggleButton

Является суперклассом для JCheckBox и JRadioButton. Кнопка остается в на-

жатом состоянии, и возвращается в исходное состояние при повторном нажатии.

public class ToggleButtonPanel extends JPanel { public ToggleButtonPanel() {

// Установить компоновку GridLayout

104

setLayout(new GridLayout(4,1, 10, 10)); add (new JToggleButton ("Fe"));

add (new JToggleButton ("Fi")); add (new JToggleButton ("Fo")); add (new JToggleButton ("Fum"));

}

}

Класс JTextComponent

Класс обеспечивает основные функции простого текстового редактора. Основными подклассами JTextComponent являются JTextField, JTextArea,

JTextPane.

JTextField tf = new JTextField();

JTextArea ta = new JTextArea(); tf.setText("TextField"); ta.setText("JTextArea\n Allows Multiple Lines"); add(tf);add(ta);

JTextPane tp = new JTextPane();

MutableAttributeSet attr = new SimpleAttributeSet(); StyleConstants.setFontFamily(attr, "Serif"); StyleConstants.setFontSize(attr, 18); StyleConstants.setBold(attr, true); tp.setCharacterAttributes(attr, false);

add(tp);

Класс JScrollBar

Реализует полосу прокрутки

public class ScrollbarPanel extends JPanel { public ScrollbarPanel() {

setLayout(new BorderLayout());

JScrollBar sb1 =

new JScrollBar (JScrollBar.VERTICAL, 0, 5, 0, 100); add(sb1, BorderLayout.EAST);

JScrollBar sb2 =

new JScrollBar (JScrollBar.HORIZONTAL, 0, 5, 0, 100); add(sb2, BorderLayout.SOUTH);

}

}

Класс JSlider

Реализует полосу прокрутки с возможностью разметки. public class SliderPanel extends JPanel {

105

public SliderPanel() { setBackground (Color.lightGray); setLayout(new BorderLayout()); setBackground (Color.lightGray);

JSlider s1 = new JSlider (JSlider.VERTICAL, 0, 100, 50); s1.setPaintTicks(true);

s1.setMajorTickSpacing(10);

s1.setMinorTickSpacing(2); add(s1, BorderLayout.EAST);

JSlider s2 = new JSlider (JSlider.VERTICAL, 0, 100, 50); s2.setPaintTicks(true);

s2.setMinorTickSpacing(5); add(s2, BorderLayout.WEST);

JSlider s3 = new JSlider (JSlider.HORIZONTAL, 0, 100, 50); s3.setPaintTicks(true);

s3.setMajorTickSpacing(10); add(s3, BorderLayout.SOUTH);

JSlider s4 = new JSlider (JSlider.HORIZONTAL, 0, 100, 50); s4.setBorder(LineBorder.createBlackLineBorder());

add(s4, BorderLayout.NORTH);

}

}

Класс JProgressBar

Данный класс позволяет отображать линейку прогресса, показывая ход выполнения операции. Использование JProgressBar:

/Инициализация компонента

JProgressBar progressBar = new JProgressBar(); progressBar.setMinimum(0); progressBar.setMaximum(numberSubOperations);

//Выполнение операции progressBar.setValue(progressBar.getMinimum()); for (int i = 0; i < numberSubOperations; i++) {

// Установка значения progressBar.setValue(i);

}

Класс JComboBox

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

public class ComboPanel extends JPanel {

String choices[] = {"Mercury", "Venus", "Earth", "Mars", "Saturn", "Jupiter", "Uranus","Neptune","Pluto"};

public ComboPanel() {

106

JComboBox combo1 = new JComboBox();

JComboBox combo2 = new JComboBox(); for (int i=0;i<choices.length;i++) {

combo1.addItem (choices[i]); combo2.addItem (choices[i]);

}

combo2.setEditable(true);

combo2.setSelectedItem("X");

combo2.setMaximumRowCount(4);

add(combo1);

add(combo2);

}

}

Класс JList

Реализует список элементов.

public class ListPanel extends JPanel {

String label [] = {"Cranberry", "Orange", "Banana",

"Kiwi", "Blueberry", "Pomegranate", "Apple", "Pear",

"Watermelon", "Raspberry", "Snozberry" };

public ListPanel() {

setLayout (new BorderLayout()); JList list = new JList(label); ScrollPane pane = new ScrollPane(); pane.add (list);

add(pane, BorderLayout.CENTER);

}

}

Класс JScrollPane

Реализует область прокрутки.

public class ScrollPanel extends JPanel { public ScrollPanel() {

setLayout(new BorderLayout());

Icon bigTiger = new ImageIcon("BigTiger.gif");

JLabel tigerLabel = new JLabel(bigTiger);

JScrollPane scrollPane = new JScrollPane(); scrollPane.getViewport().add(tigerLabel); add(scrollPane, BorderLayout.CENTER);

}

}

107

Бордюры (Border)

Рисование границ вокруг компонентов (бордюров) обеспечивается с помощью интерфейса Border. Border требует реализации следующих методов:

//Определяет область, необходимую для рисования public Insets getBorderInsets(Component c);

//Определяет прозрачность и непрозрачность границы public boolean isBorderOpaque();

//Определяет каким образом рисовать границу public void paintBorder (Component c, Graphics g,

int x, int y,

int width, int height)

В пакет Swing входит 9 классов для рисования бордюров

BevelBorder

Объемный бордюр, поднятый или опущенный

CompoundBorder

Составной бордюр

DefaultBorder

Бордюр по умолчанию — реализация интерфейса

EmptyBorder

Пустой бордюр

EtchedBorder

Бордюр-канавка

LineBorder

Цветной бордюр произвольной толщины

MatteBorder

Бордюр с заполнением цветом или изображением

SoftBevelBorder

Объемный бордюр с закругленными углами

TitledBorder

Бордюр с заголовками в различных позициях

Классы меню

Классы, обеспечивающие работу с меню (JCheckBoxMenuItem, JMenuItem,

JRadioButtonMenuItem, JMenu, JMenuBar, JSeparator), являются подклассами компонента JComponent. Это позволяет в отличие от AWT добавить меню в любое место программы, к любому контейнеру.

public class MenuTester extends JFrame implements

ActionListener {

public void actionPerformed (ActionEvent e) { System.out.println (e.getActionCommand());

}

public MenuTester() { super ("Menu Example");

JMenuBar jmb = new JMenuBar();

108

JMenu file = new JMenu ("File");

JMenuItem item;

file.add (item = new JMenuItem ("New")); item.addActionListener (this);

file.add (item = new JMenuItem ("Open")); item.addActionListener (this); file.addSeparator();

file.add (item = new JMenuItem ("Close")); item.addActionListener (this);

jmb.add (file);

JMenu edit = new JMenu ("Edit"); edit.add (item = new JMenuItem ("Copy")); item.addActionListener (this);

edit.add (item = new JMenuItem ("Woods", tigerIcon)); item.setHorizontalTextPosition (JMenuItem.RIGHT); item.addActionListener (this);

JCheckBoxMenuItem check= new JCheckBoxMenuItem ("Toggle"); check.addActionListener (this);

edit.add (check);jmb.add (edit); setJMenuBar (jmb);

}}

Классы JFrame, JWindow, JDialog

Основное отличие этих классов от других компонентов Swing заключается в том, что они не являются легковесными компонентами, и наследуются соответственно от Frame, Window, Dialog. В отличие от Frame, Window, Dialog, для добавления компонентов в JFrame, JWindow, JDialog используется панель содержимого (content pane).

public class FrameTester {

public static void main (String args[]) {

JFrame f = new JFrame ("JFrame Example");

Container c = f.getContentPane(); c.setLayout (new FlowLayout()); for (int i = 0; i < 5; i++) {

c.add(new

JButton("No")).setBackground(SystemColor.control); c.add (new Button("Batter"));

}

c.add (new JLabel ("Swing")); f.setSize (300, 200); f.show();

}

109

Класс JPopupMenu

Позволяет связать выпадающее меню с любым компонентом.

public class PopupPanel extends JPanel {

JPopupMenu popup = new JPopupMenu (); public PopupPanel() {

JMenuItem item;

popup.add (item = new JMenuItem ("Cut")); popup.add (item = new JMenuItem ("Copy")); popup.add (item = new JMenuItem ("Paste")); popup.addSeparator();

popup.add (item = new JMenuItem ("Select All")); enableEvents (AWTEvent.MOUSE_EVENT_MASK);

}

protected void processMouseEvent (MouseEvent e) { if (e.isPopupTrigger())

popup.show (e.getComponent(), e.getX(), e.getY()); super.processMouseEvent (e);

}

}

Подсказки (ToolTip)

В пакете swing имеется класс JtoolTip, предназначенный для реализации подсказок, однако обычно достаточно вызвать метод setToolTip() класса

JComponent.

public class TooltipPanel extends JPanel { public TooltipPanel() {

JButton myButton = new JButton("Hello"); myButton.setBackground (SystemColor.control); myButton.setToolTipText ("World"); add(myButton);

}

}

Класс JToolBar

Используется для реализации линейки инструментов.

public class ToolbarPanel extends JPanel {

ToolbarPanel() {

setLayout (new BorderLayout());

JToolBar toolbar = new JToolBar(); JButton myButton = new JButton("Hello"); toolbar.add(myButton);

110