ContentPane.add(sp, BorderLayout.CENTER);

Компонент JTable предназначен для отображения таблицы. Таблицы при­меняются для отображения связанной информации, например: ФИО, Дата рож­дения, Адрес, Образование и т. д. Класс JTable объявляет конструктор, добавляющий двумерную модель объектов в модель. В примере рассмотрен процесс создания, заполнения и редактирования простой таблицы из двух столбцов.

/* пример # 18 : простая таблица: JTableDemo.java */

package chapt13;

import java.awt.BorderLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.util.ArrayList;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JOptionPane;

import javax.swing.JScrollPane;

import javax.swing.JTable;

import javax.swing.table.AbstractTableModel;

 

public class JTableDemo extends JFrame {

 

static ArrayList<Object[]> list =

new ArrayList<Object[]>();

JTable table;

DataModel dataModel = new DataModel();

 

JTableDemo() {

dataModel.addRow("Агеев", 5);

dataModel.addRow("Смирнов", 2);

table = new JTable(dataModel);

getContentPane().add(new JScrollPane(table));

JButton insertBtn = new JButton("Добавить строку");

insertBtn.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent event) {

dataModel.addRow("", 0);

}

});

getContentPane().add(insertBtn, BorderLayout.SOUTH);

}

public static void main(String[] args) {

JTableDemo frame = new JTableDemo();

frame.setBounds(100, 100, 300, 300);

frame.setDefaultCloseOperation(EXIT_ON_CLOSE);

frame.setVisible(true);

}

}

class DataModel extends AbstractTableModel {

 

private final String[] HEADERS =

{"Студент", "Оценка"};

private final int COLS = 2;

private int rows = 0;

 

public String getColumnName(int col) {

return HEADERS[col];

}

public int getRowCount() {

return rows;

}

public int getColumnCount() {

return COLS;

}

public Object getValueAt(int row, int col) {

return JTableDemo.list.get(row)[col];

}

public void setValueAt(Object val, int row, int col) {

if (col == 1){

int mark = new Integer(val.toString());

if (mark > 10 || mark < 0){

JOptionPane.showMessageDialog(null, "Введите число от 0 до 10", "Ошибка ввода!", JOptionPane.ERROR_MESSAGE);

return;

}

}

JTableDemo.list.get(row)[col] = val.toString();

fireTableDataChanged(); //обновление таблицы после изменений

}

public boolean isCellEditable(int row, int col) {

return true;

}

public void addRow(String name, int mark) {

JTableDemo.list.add(new String[COLS]);

setValueAt(name, rows, 0);

setValueAt(mark, rows, 1);

rows++;

}

public Class getColumnClass(int col) {

switch (col) {

case 0: return String.class;

case 1: return Integer.class;

}

return null;

}

}

Рис. 13.21. Объект JTable

При попытке добавления в поле «Оценка» значений, выходящих за границы диапазона, генерируется исключительная ситуация, а при попытке внесения нецифровых символов поле подсвечивается красным цветом и добавление не производится.

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

Следующий пример показывает простейшее использование контейнерного класса JSplitPane. В верхней части содержится текстовое окно, а в нижней – текстовое поле.

/* пример # 19 : простое окно с разграничительной полосой: DemоJSplit.java */

package chapt13;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JSplitPane;

import javax.swing.JTextArea;

import javax.swing.JTextField;

public class DemoJSplit extends JFrame {

private JSplitPane tabs;

private JTextArea area;

private JPanel tab;

public DemoJSplit() {

tabs = new JSplitPane(JSplitPane.VERTICAL_SPLIT);

area =

new JTextArea("Текстовое окно в верхней области");

// установка текстового окна в верхнюю область

tabs.setTopComponent(area);

tab = new JPanel();

tab.add(new JTextField("Текстовое поле в нижней области"));

// установка текстового поля в нижнюю область

tabs.setBottomComponent(tab);

tabs.setDividerLocation(130);

setContentPane(tabs); // установка в окно фрейма компоненты tabs

}

public static void main(String[] args) {

DemoJSplit dspl = new DemoJSplit();

dspl.setBounds(200, 200, 250, 200);

dspl.setVisible(true);

}

}

Рис. 13.22. Объект JSplitPane

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

В следующем примере показано простое приложение, использующее окно
с закладками.

/* пример # 20 : простое окно с двумя закладками: DemоJTabbed.java */

package chapt13;

import java.awt.Container;

import javax.swing.JCheckBox;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JTabbedPane;

import javax.swing.JToggleButton;

 

public class DemoJTabbed extends JFrame {

JTabbedPane tabs;

JPanel pan1, pan2;

public DemoJTabbed() {

Container c = getContentPane();

tabs = new JTabbedPane();

pan1 = new JPanel();

pan1.add(new JToggleButton("Button"));

tabs.addTab("One", pan1); //добавление первой закладки

pan2 = new JPanel();

pan2.add(new JCheckBox("CheckBox"));

tabs.addTab("Two", pan2);//добавление второй закладки

c.add(tabs);

}

public static void main(String[] args) {

DemoJTabbed dt = new DemoJTabbed();

dt.setSize(250, 150);

dt.setLocation(200, 200);

dt.setVisible(true);

}

}

Рис. 13.23. Окно с закладками

В Java 6 стало больше графических возможностей по взаимодействию с рабочим столом Windows и интернетом. Класс java.awt.SystemTray обеспечивает прямой доступ к рабочему столу пользователя: позволяет добавлять иконки, советы для кнопок и спадающие меню к системным областям состояниям Windows.

/* пример # 21 : демонстрация SystemTray: DemоTray.java */

package chapt13;

import java.awt.*;

 

public class DemoTray {

public static void main(String[] args) {

if(SystemTray.isSupported()) {

SystemTray tray = SystemTray.getSystemTray();

Image image =

Toolkit.getDefaultToolkit().getImage("icon");

TrayIcon icon = new TrayIcon(image, "Demo Tray");

try{

tray.add(icon);

} catch (AWTException e) {

System.err.println(e);

}

} else{

System.err.println("Without system tray!");

}

}

}

Возможности класса java.awt.Desktop позволяют запустить браузер
с помощью одной строки:

/* пример # 22 : запуск браузера: DesktopTest.java */

package chapt13;

import org.jdesktop.jdic.desktop.*;

import java.net.*;

 

public class DesktopTest {

public static void main(String[] args) throws Exception {

Desktop.browse(new URL("http://java.sun.com"));

}

}

При необходимости можно легко использовать веб-браузер в приложении:

/* пример # 23 : использование web- браузера: BrowserTest.java */

package chapt13;

import org.jdesktop.jdic.browser.WebBrowser;

import java.net.URL;

import javax.swing.JFrame;

 

public class BrowserTest {

public static void main(String[] args) throws Exception {

 

WebBrowser browser = new WebBrowser();

browser.setURL(new URL("http://www.netbeans.org"));

JFrame frame = new JFrame("Использование Browser");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.getContentPane().add(browser);

frame.pack();

frame.setSize(640,480);

frame.setVisible(true);

}

}

Визуальные компоненты JavaBeans

Визуальные компоненты являются классами языка Java, объекты которых отображаются визуально в проектируемом приложении с помощью средств визуальной разработки. Визуальные компоненты являются удобным средством при создании пользовательских интерфейсов. Обычно часть визуальной разра­ботки приложений состоит в перетаскивании компонентов на форму и в опре­делении их свойств, событий и обработчиков событий. При этом компонент представляет собой объект класса, для которого, кроме данных и методов, дополнительно установлены свойства и события класса. Свойства и события устанавливаются через имена методов на основе соглашения об именовании методов.

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

Каждый бин должен поддерживать следующие возможности:

• интроспекцию, позволяющую средам разработки анализировать, из чего состоит и как работает данный бин;

• поддержку событий (events) ;

• поддержку свойств (properties) ;

• сохраняемость (persistence).

Каждый бин должен быть сериализуемым. Визуальная среда при сохранении скомпилированного приложения сохраняет настройки компонента, сделанные пользователем в процессе разработки приложения путем сериализации бина. При повторной загрузке приложения эти настройки восстанавливаются. Для этого среда разработки десериализует бины из файла.

Свойства бинов

Каждый бин имеет свойства (properties), которые определяют, как он будет работать и как выглядеть. Эти свойства являются private или protectedполями класса, которые доступны через специальные методы getИмя() и setИмя()(getters и setters), называемые также аксессорами. Так, утверждение “данный бин имеет свойство name типа String” означает, что
у этого бина

//есть поле

private String name;

//есть get-метод

public String getName(){

return name;

}

//есть set-метод

public void setString(String name){

this.name = name;

}

Пусть рассматривается, к примеру, компонент JLabel. Во-первых, JLabel удовлетворяет интерфейсу Serializable, во-вторых, имеет конструктор по умолчанию public JLabel() и, в-третьих, имеет ряд методов аксессоров, например public String getText(),public void setText(String text). Исходя из этого, можно сделать выводы, чтоJLabel является бином, имеющим свойство text. Значение этого свойства отображается как заголовок метки. Кроме того,JLabel имеет и другие свойства.

Для свойства типаboolean в бинах вместо get-методов может быть использован is-метод. Например,JLabel имеет boolean-свойство enabled, унаследованное от класса Component. Для доступа к этому свойству имеются методы