6.3 使用工具欄:JToolBar類
工具欄是現代用戶界面中主程序窗口的主要部分。工具欄向用戶提供了對於常用命令的簡單訪問,這通常構建為層次結構的菜單結構。支持這種功能的Swing組件就是JToolBar。
JToolBar是一個種存放組件的特殊Swing容器。這個容器可以在我們的Java Applet或是程序中用作工具欄,而且可以在程序的主窗口之外浮動或是托拽。JToolBar是一個非常容易使用與理解的簡單組件。
6.3.1 創建JToolBar組件
有四個構造函數可以用來創建JToolBar組件:
public JToolBar() JToolBar jToolBar = new JToolBar(); public JToolBar(int orientation) JToolBar jToolBar = new JToolBar(JToolBar.VERTICAL); public JToolBar(String name) JToolBar jToolBar = new JToolBar("Window Title"); public JToolBar(String name,int orientation) JToolBar jToolBar = new JToolBar("Window Title", ToolBar.VERTICAL);
在默認情況下,工具欄是以水平方向進行創建的。然而,我們可以通過JToolBar的常量HORIZONTAL與VERTICAL顯示指定方向。
而且在默認情況下,工具欄是可以浮動的。所以,如果我們使用水平方向創建一個工具欄,用戶可以在窗口周圍拖動工具欄來改變工具欄的方向。
6.3.2 向JToolBar添加組件
一旦我們擁有一個JToolBar,我們需要向其中添加組件。任意的Component都可以添加到工具欄。當處理水平工具欄時,由於美觀的原因,如果工具欄的組件是大致相同的高度時是最好的。對於垂直工具欄,如果工具欄組件具有大致相同的寬度則是最好的。JToolBar類只定義了一個方法用於添加工具欄項目;其他的方法,例如add(Component)是由Container繼承而來的。另外,我們可以向工具欄添加分隔符。
public JButton add(Action action); public void addSeparator(); public void addSeparator(Dimension size);
當使用JToolBar的add(Action)方法時,所添加的Action被封閉在一個JButton對象中。這與向JMenu或是JPopupMenu組件添加Action不同,在后一種情況中,所添加的是JMenuItem對象。對於JMenu與JPopupMenu,以這種方式添加Action是類的Javadoc中所不推薦的。對於分隔符,如果我們沒有指定尺寸,所安裝的觀感會強制默認的尺寸設置。
由工具欄移除組件可以使用下面的方法:
public void remove(Component component)
6.3.3 JToolBar屬性
表6-15列出了JToolBar所定義的9個屬性。
JToolBar屬性
屬性名 |
數據類型 |
訪問性 |
accessibleContext |
AccessibleContext |
只讀 |
borderPainted |
boolean |
讀寫綁定 |
floatable |
boolean |
讀寫綁定 |
layout |
LayoutManager |
只寫 |
margin |
Insets |
讀寫綁定 |
orientation |
int |
讀寫綁定 |
rollover |
boolean |
讀寫綁定 |
UI |
ToolBarUI |
讀寫 |
UIClassID |
String |
只讀 |
在默認情況下繪制JToolBar的邊框。如果我們不希望繪制邊框,我們可以將borderPainted屬性設置為false。如果不使用borderPainted屬性,我們需要修改border屬性(由超類JComponent繼承的屬性)。
orientation屬性只可以設置為JToolBar的HORIZONTAL或是VERTICAL常量。如果使用其他的值,則會拋出IllegalArgumentException。修改方向會改變工具欄的布局管理器。如果我們通過setLayout()方法直接修改布局管理器,改變方向會撤銷我們的布局管理器。
正如前面所提到的,默認情況下工具欄是可浮動的。這就意味着用戶可以拖動工具欄並放置在其他位置。要拖動工具欄,用戶選擇工具欄的空白部分。然后工具欄可以停留在原始的程序窗口,在主窗口內部浮動,或者是拖動到原始程序窗口的其他部分。如果原始窗口的布局管理器是BorderLayout,可拖動的部分是布局管理器無組件的邊。(我們不能將工具欄放在窗口的中央。)否則,工具欄會被拖動到容器的最后一個點上。圖6-10顯示了拖動與停放過程的不同階段。
rollover屬性定義了當用戶在工具欄的不同組件上移動時與觀感特定的行為。這種行為涉及到顏色與邊框的不同。
6.3.4 處理JToolBar事件
並沒有特定於JToolBar的事件。我們需要將監聽器關聯到我們需要響應用戶交互的JToolBar上的每一項上。當然,JToolBar是一個Container,所以我們也可以監聽其事件。
6.3.5 自定義JToolBar觀感
每一個可安裝的Swing觀感都提供了其自己的JToolBar外觀以及默認的UIResource值集合。外觀的大部分是由工具欄中的實際組件控制的。圖6-11顯示了預安裝的觀感類型集合Motif,Windows以及Ocean的JToolBar組件外觀。每一個工具欄都有五個JButton組件,在第四個與第五個組件之間有一個分隔符。
表6-16中列出了JToolBar的UIResource相關的屬性。對於JToolBar組件,有22個不同的屬性。
JToolBar UIResource元素
屬性字符串 |
對象類型 |
ToolBar.actionMap |
ActionMap |
ToolBar.ancestorInputMap |
InputMap |
ToolBar.background |
Color |
ToolBar.border |
Border |
ToolBar.borderColor |
Color |
ToolBar.darkShadow |
Color |
ToolBar.dockingBackground |
Color |
ToolBar.docingForeground |
Color |
ToolBar.floatingBackground |
Color |
ToolBar.floatingForeground |
Color |
ToolBar.font |
Font |
ToolBar.foreground |
Color |
ToolBar.handleIcon |
Icon |
ToolBar.highlight |
Color |
ToolBar.isRollover |
Boolean |
ToolBar.light |
Color |
ToolBar.nonrolloverBorder |
Border |
ToolBar.rolloverBorder |
Border |
ToolBar.separatorSize |
Dimension |
ToolBar.shadow |
Color |
ToolBarSeparatorUI |
String |
ToolBarUI |
String |
6.3.6 完整的JToolBar使用示例
列表6-8演示了一個完整的JToolBar示例,這個程序生成了一個帶有多個菱形按鈕的工具欄。這個程序同時重用了本章前面列表6-2中為菜單示例所定義的ShowAction。
在這個示例中允許了rollover屬性以演示當前觀感的不同。圖6-12是我們在不同的按鈕上移動鼠標時的輸出結果。
package net.ariel.ch06;
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;
import javax.swing.Action; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JToolBar;
import net.ariel.ch04.DiamondIcon; public class ToolBarSample {
private static final int COLOR_POSITION = 0; private static final int STRING_POSITION = 1; static Object buttonColors[][] = { {Color.RED, "RED"}, {Color.BLUE, "BLUE"}, {Color.GREEN, "GREEN"}, {Color.BLACK, "BLACK"}, null, // separator {Color.CYAN, "CYAN"} };
public static class TheActionListener implements ActionListener { public void actionPerformed(ActionEvent event) { System.out.println(event.getActionCommand()); } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Runnable runner = new Runnable() { public void run() { JFrame frame = new JFrame("JToolBar Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ActionListener actionListener = new TheActionListener(); JToolBar toolbar = new JToolBar(); toolbar.setRollover(true); for(Object[] color: buttonColors) { if(color == null) { toolbar.addSeparator(); } else { Icon icon = new DiamondIcon((Color)color[COLOR_POSITION], true, 20, 20); JButton button = new JButton(icon); button.setActionCommand((String)color[STRING_POSITION]); button.addActionListener(actionListener); toolbar.add(button); } } Action action = new ShowAction(frame); JButton button = new JButton(action); toolbar.add(button); Container contentPane = frame.getContentPane(); contentPane.add(toolbar, BorderLayout.NORTH); JTextArea textArea = new JTextArea(); JScrollPane pane = new JScrollPane(textArea); contentPane.add(pane, BorderLayout.CENTER); frame.setSize(350, 150); frame.setVisible(true); } }; EventQueue.invokeLater(runner); } }
6.3.7 JToolBar.Separator類
JToolBar維護其自己的分隔符從而允許自定義JToolBar上的分隔符的觀感。
這個分隔符是我們調用JToolBar的addSeparator()方法時自動創建的。另外,如果我們希望手動創建這個組件,則有兩個方法可以創建JToolBar.Separator。
public JToolBar.Separator() JSeparator toolBarSeparator = new JToolBar.Separator(); public JToolBar.Separator(Dimension size) Dimension dimension = new Dimension(10, 10); JSeparator toolBarSeparator = new JToolBar.Separator(dimension);
這兩個構造函數都創建一個水平分隔符。我們可以配置其尺寸。如果我們沒有指定尺寸,觀感類型會決定分隔符的尺寸。
與JPopupMenu.Separator類似,如果我們希望修改分隔符的方向,我們必須調用由JSeparator所繼承的setOrientation()方法,此時的參數為JToolBar.Separator.VERTICAL。
6.4 小結
本章介紹了許多Swing菜單相關的類及其內部關系,以及Swing工具欄類。首先,我們了解了JMenuBar及其選擇模型,並且了解了菜單欄如何應用在Applets以及程序中。
接下來,我們探討了JMenuItem,這是用戶選擇的菜單元素,以及系統用來處理事件的兩個新的事件/監聽器對,MenuKeyEvent/MenuKeyListener以及MenuDragMouseEvent/MenuDragMouseListener。然后,我們探討了JMenu組件,這是JMenuItem實放置的地方,及其新的事件/監聽器對,MenuEvent/MenuListener,這可以用來確定菜單何時將會發送。
接下來,我們了解了JSeparator組件以及我們如何可以將其作為一個菜單分隔符或是菜單外的可視分隔符。
然后我們探討了JPopupMenu,JMenu用其來顯示其JMenuItem組件集合。對於JPopupMenu,我們了解了彈出菜單自己的事件/監聽器對,PopupMenuEvent/PopupMenuListener。
然后我們探討了JCheckBoxMenuItem與JRadioButtonMenuItem中的可選擇的菜單元素,以及MenuElement接口,同時我們了解了如何創建自定義的菜單組件。
菜單並不是唯一可以彈出的內容,所以我們探討了Popup與PopupFactory。最后,本章探討了JToolBar類。
在第7章中,我們將會了解Swing提供的用來自定義Swing組件周圍邊框的不同類。