|
В пользовательском интерфейсе Win32 присутствуют панели с несколькими вкладками. Они очень широко используются в самых различных приложениях Windows. К сожалению, интерфейс AWT не включал подобных панелей. Теперь в среде Java программист может создать собственную панель с несколькими вкладками - они реализуются с помощью класса JTabbedPane библиотеке Swing. Вкладки на панели могут находится вверху, внизу, слева или справа относительно самой панели. Это можно менять с помощью метода setTabPlacement(), передавая ему как параметр одно из соответствующих полей SwingConstants. Для добавления компонента в панель со вкладками мы употребляем один из перегруженых методов add(). Также можно использовать методы addTab() и insertTab(). Метод remove(Component c) удаляет вкладку ассоциированную с этой компонентой, если такая есть. Мы можем получить/установить индекс выбранной панели используя методы getSelectedIndex() и setSelectedIndex(int index) соответственно. Также мы можем получить/установить компоненту ассоциированную с выбранной вкладкой употребляя getSelectedComponent() и setSelectedComponent(Component c). Вот небольшой пример показывающий как создавать такие панели и управлять ими.
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;
public class TabbedPaneDemo extends JApplet implements ActionListener
{
private ImageIcon m_tabimage;
private ImageIcon m_utsguy;
private ImageIcon m_jfcgirl;
private ImageIcon m_sbeguy;
private ImageIcon m_tiger;
private JTabbedPane m_tabbedPane;
private JButton m_topButton;
private JButton m_bottomButton;
private JButton m_leftButton;
private JButton m_rightButton;
private JButton m_addButton;
private JButton m_removeButton;
private JLabel m_status;
private JLabel m_loading;
private AudioClip m_layoutsound;
private AudioClip m_tabsound;
public void init() {
m_loading = new JLabel("Initializing applet...",
SwingConstants.CENTER);
getContentPane().add(m_loading);
Thread initialize = new Thread() {
public void run() {
m_tabimage = new ImageIcon("tabimage.gif");
m_utsguy = new ImageIcon("utsguy.gif");
m_jfcgirl = new ImageIcon("jfcgirl.gif");
m_sbeguy = new ImageIcon("sbeguy.gif");
m_tiger = new ImageIcon("tiger.gif");
m_tabbedPane = new JTabbedPane(SwingConstants.TOP);
m_topButton = new JButton("TOP");
m_bottomButton = new JButton("BOTTOM");
m_leftButton = new JButton("LEFT");
m_rightButton = new JButton("RIGHT");
m_addButton = new JButton("add");
m_removeButton = new JButton("remove");
m_status = new JLabel();
Color buttonColor = new Color(245,242,219);
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(1,6));
JPanel lowerPanel = new JPanel();
lowerPanel.setLayout(new BorderLayout());
m_topButton.setBackground(buttonColor);
m_bottomButton.setBackground(buttonColor);
m_leftButton.setBackground(buttonColor);
m_rightButton.setBackground(buttonColor);
m_addButton.setBackground(buttonColor);
m_removeButton.setBackground(buttonColor);
m_topButton.addActionListener(TabbedPaneDemo.this);
m_bottomButton.addActionListener(TabbedPaneDemo.this);
m_leftButton.addActionListener(TabbedPaneDemo.this);
m_rightButton.addActionListener(TabbedPaneDemo.this);
m_addButton.addActionListener(TabbedPaneDemo.this);
m_removeButton.addActionListener(TabbedPaneDemo.this);
buttonPanel.add(m_topButton);
buttonPanel.add(m_bottomButton);
buttonPanel.add(m_leftButton);
buttonPanel.add(m_rightButton);
buttonPanel.add(m_addButton);
buttonPanel.add(m_removeButton);
buttonPanel.setBackground(buttonColor);
buttonPanel.setOpaque(true);
buttonPanel.setBorder(new CompoundBorder(
new EtchedBorder(EtchedBorder.RAISED),
new EtchedBorder(EtchedBorder.LOWERED)));
lowerPanel.add("Center", buttonPanel);
m_status.setHorizontalTextPosition(SwingConstants.LEFT);
m_status.setOpaque(true);
m_status.setBackground(buttonColor);
m_status.setForeground(Color.black);
lowerPanel.add("South", m_status);
createTab();
createTab();
createTab();
createTab();
getContentPane().setLayout(new BorderLayout());
m_tabbedPane.setBackground(new Color(245,232,219));
m_tabbedPane.setOpaque(true);
getContentPane().add("South", lowerPanel);
getContentPane().add("Center", m_tabbedPane);
m_tabbedPane.addChangeListener(new MyChangeListener());
m_layoutsound = getAudioClip(getCodeBase(), "switch.wav");
m_tabsound = getAudioClip(getCodeBase(), "tab.wav");
getContentPane().remove(m_loading);
getRootPane().revalidate();
getRootPane().repaint();
}
};
initialize.start();
}
public void createTab() {
JLabel label = null;
switch (m_tabbedPane.getTabCount()%4) {
case 0:
label = new JLabel("Tab #" + m_tabbedPane.getTabCount(),
m_utsguy, SwingConstants.CENTER);
break;
case 1:
label = new JLabel("Tab #" + m_tabbedPane.getTabCount(),
m_jfcgirl, SwingConstants.CENTER);
break;
case 2:
label = new JLabel("Tab #" + m_tabbedPane.getTabCount(),
m_sbeguy, SwingConstants.CENTER);
break;
case 3:
label = new JLabel("Tab #" + m_tabbedPane.getTabCount(),
m_tiger, SwingConstants.CENTER);
break;
}
label.setVerticalTextPosition(SwingConstants.BOTTOM);
label.setHorizontalTextPosition(SwingConstants.CENTER);
label.setOpaque(true);
label.setBackground(Color.white);
m_tabbedPane.addTab("Tab #" + m_tabbedPane.getTabCount(),
m_tabimage, label);
m_tabbedPane.setBackgroundAt(m_tabbedPane.getTabCount()-1,
new Color(245,232,219));
m_tabbedPane.setForegroundAt(m_tabbedPane.getTabCount()-1,
new Color(7,58,141));
m_tabbedPane.setSelectedIndex(m_tabbedPane.getTabCount()-1);
setStatus(m_tabbedPane.getSelectedIndex());
}
public void killTab() {
if (m_tabbedPane.getTabCount() > 0) {
m_tabbedPane.removeTabAt(m_tabbedPane.getTabCount()-1);
setStatus(m_tabbedPane.getSelectedIndex());
}
else
setStatus(-1);
}
public void setStatus(int index) {
if (index > -1)
m_status.setText(" Selected Tab: " + index);
else
m_status.setText(" No Tab Selected");
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == m_topButton) {
m_tabbedPane.setTabPlacement(SwingConstants.TOP);
m_layoutsound.play();
}
else if(e.getSource() == m_bottomButton) {
m_tabbedPane.setTabPlacement(SwingConstants.BOTTOM);
m_layoutsound.play();
}
else if(e.getSource() == m_leftButton) {
m_tabbedPane.setTabPlacement(SwingConstants.LEFT);
m_layoutsound.play();
}
else if(e.getSource() == m_rightButton) {
m_tabbedPane.setTabPlacement(SwingConstants.RIGHT);
m_layoutsound.play();
}
else if(e.getSource() == m_addButton)
createTab();
else if(e.getSource() == m_removeButton)
killTab();
m_tabbedPane.revalidate();
m_tabbedPane.repaint();
}
public static void main(String[] args) {
new TabbedPaneDemo();
}
class MyChangeListener implements ChangeListener
{
public void stateChanged(ChangeEvent e) {
setStatus(
((JTabbedPane) e.getSource()).getSelectedIndex());
m_tabsound.play();
}
}
}
Описание кода.Класс TabbedPaneDemo наследуется от JApplet и реалезует интерфейс ActionListener(для прослушивания событий от кнопок) ImageIcon m_tabimage: рисунок, который будет размещен на вкладке. ImageIcon m_utsguy, m_jfcgirl, m_sbeguy, m_tiger: рисунки, которые будут размещены в панелях. JTabbedPane m_tabbedPane: главная панель со вкладками JButton m_topButton: кнопка помещающая вкладки вверху. JButton m_bottomButton: кнопка помещающая вкладки внизу. JButton m_leftButton: кнопка помещающая вкладки слева. JButton m_rightButton: кнопка помещающая вкладки справа. JButton m_addButton: кнопка добавляющая новую вкладку. JButton m_removeButton: кнопка удаляющая вкладку. JLabel m_status: статусная строка. Наша JTabbedPane это панель создающаяся со вкладками сверху (TOP - это выравнивание, которое используется в конструкторе по умолчанию). Метод init() создает кнопки внутри JPanel используя GridLayout, и добавляет слушателей ActionListener на каждую из них. Процесс инициализации и построения GUI мы создаем отдельный поток и стартуем его в этом методе. Это делается так, потому что загрузка может занять несколько секунд и лучше что бы интерфейс был максимально чувствителным в это время. Так же мы обеспечиваем визуализацию этого процесса для пользователя, во время загрузки приложения на экране можно видеть надпись "Initializing applet...". За время инициализации метод createTab() вызывается 4 раза. Затем мы добавляем панели на contentPane. И наконец добавляем MyChangeListener (см. ниже) для отслеживания событий происходящих с нашей m_tabbedPane. Метод ctreatTab() вызывается всякий раз, когда нажимается кнопка m_addButton. Метод killTab() вызывается всякий раз, когда нажимается кнопка m_removeButton, чтобы удалить вкладку с самым высоким индексом. Метод setStatus() вызывается всякий раз, когда выбирается какая-нибудь из вкладок. Поле m_status корректируется, что бы отобразить какая из вкладок выбрана на данный момент. Метод actionPerformed() вызывается, когда нажимается какая-нибудь из кнопок. Нажатие на m_topButton, m_bottomButton, m_leftButton, or m_rightButton является причиной изменения расположения вкладок на JTabbedPane, для этого используется метод setTabPlacement(). При каждом нажатии проигрывается файл WAV. Файлы с этими звуками загружаются в конце метода init().
m_layoutsound = getAudioClip(getCodeBase(), "switch.wav");
m_tabsound = getAudioClip(getCodeBase(), "tab.wav");
Класс TabbedPaneDemo.MyChangeListenerЭтот класс реализует интерфейс ChangeListener. Дле реализации необходимо переопределить один единственный метод - stateChanged(). Этот метод обрабатывает соответствующее событие, происходящее при изменениях в панели со вкладками. В нашем случае stateChanged() обновляет информацию в строке статуса и проигрывает звуковой файл.
public void stateChanged(ChangeEvent e) {
setStatus(
((JTabbedPane) e.getSource()).getSelectedIndex());
m_tabsound.play();
}
Запуск кода:На рисунке показано как выглядит апплет в действии. Для запуска надо создать HTML файл следующего содержания <applet code=TabbedPaneDemo width=570 height=400> </applet> К сожалению это не поможет увидеть апплет в окне браузера, пользуйтесь утилитой Appletviewer. Для использования браузера необходимо скачать plug-in с сайта фирмы Sun Microsystem |
||||||||||