Обо мне
Article
Applet
Стихи
Мои фотки
Электроника
Гостевая книга
Форум
JTabbedPane

В пользовательском интерфейсе 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
Используются технологии uCoz