|
В пользовательском интерфейсе 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 |