Swing菜單與工具欄(六) – JAVA編程語言程序開發技術文章

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組件,在第四個與第五個組件之間有一個分隔符。


 swing_6_11


表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();
     }
  &nbs

發佈留言