熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

AWT在鼠標滾輪和輸入等事件上的支持

2022-06-13   來源: Java核心技術 

  為演示新的 AWT 功能我們將創建一個程序將屏幕設為全屏(最小化桌面裝飾如工具欄)並使用新的顏色常量設置背景您將能夠通過旋轉鼠標滾輪或使用左和右 shift 鍵更改背景色
  
  清單 提供了該程序的基本骨架程序遺憾的是在要使用的鼠標滾輪支持功能中仍存在錯誤(有關詳細信息請參閱參考資料)為使這種功能起作用您需要把 JButton 添加到 JScrollPane再把 JScrollPane 添加到框架中這個錯誤使得這個骨架程序比必需的復雜了一點
  
  清單 創建可關閉框架的骨架程序
  import javaawt*;
  import javaawtevent*;
  import javaxswing*;
  
  public class AwtTest {
  
   // See bug
   static JButton button = new JButton();
   static JScrollPane pane = new JScrollPane(button);
  
   public static void main(String args[]) {
    JFrame frame = new JFrame(AwtTest);
    // See bug
    framegetContentPane()add(button BorderLayoutCENTER);
    framesetDefaultCloseOperation(JFrameEXIT_ON_CLOSE);
    frameshow();
   }
  }
  
  工具箱 insets
  在上一個專欄中我提到了用 setExtendedState() 最大化 Frame 的功能如果您將框架的狀態設置為 FrameMAXIMIZED_BOTH您的框架就被完全最大化了但如果您不希望把框架最大化卻希望它的大小填滿用戶的桌面區域(扣除所有桌面裝飾的大小)那麼現在您可以查詢那些裝飾使用的 Insets(請參閱清單 這些信息由 Toolkit 的 getScreenInsets() 方法提供如果從屏幕大小中減去那些 insets您就得到了窗口的應有大小為正確地定位您還需要使用頂端和左邊的 insets
  
  清單 確定屏幕大小
   private static void sizeScreen(JFrame frame) {
    Toolkit kit = ToolkitgetDefaultToolkit();
    Dimension screenSize = kitgetScreenSize();
    GraphicsConfiguration config = framegetGraphicsConfiguration();
    Insets insets = kitgetScreenInsets(config);
    screenSizewidth = (insetsleft + insetsright);
    screenSizeheight = (insetstop + insetsbottom);
    framesetSize(screenSize);
    framesetLocation(insetsleft insetstop);
   }
  
  只需把 sizeScreen() 調用添加到 main() 方法中
  
  顏色常量大寫
  Java 語言規范的第 節包含包方法字段和常量等項的命名約定關於常量名的子節()聲明常量不應使用小寫字母但從一開始Color 類中的全部顏色常量如 redgreen 和 blue 就是以全小寫指定的Merlin 也直接開了個先例現在以全大寫提供相同的常量現在尚不反對使用舊名稱但在您的 程序中您可以使用較新的名稱
  
  我們將為測試程序創建一個顏色常量數組和一個對這些顏色常量進行循環的計數程序然後提供一個 changeBackground() 方法該方法按兩個方向的其中一個方向對這些顏色常量進行循環(請參閱清單
  
  清單 更改背景色
   private static final Color colors[] = {
    ColorBLACK
    ColorBLUE
    ColorCYAN
    ColorDARK_GRAY
    ColorGRAY
    ColorGREEN
    ColorLIGHT_GRAY
    ColorMAGENTA
    ColorORANGE
    ColorPINK
    ColorRED
    ColorWHITE
    ColorYELLOW
   };
  
   static int colorCounter;
   
   private static final int UP = ;
   private static final int DOWN = ;
  
   private static void changeBackground(JFrame frame int direction) {
    // See bug
    // w/o bug change background of getContentPane()
    buttonsetBackground(colors[colorCounter]);
  
    // Update counter based on direction
    if (direction == UP) {
     colorCounter++;
    } else {
     colorCounter;
    }
  
    // Wrap colors
    if (colorCounter == colorslength) {
     colorCounter = ;
    } else if (colorCounter < ) {
     colorCounter = colorslength;
    }
   }
  
  向您的 main() 例程添加對 changeBackground() 方法的調用
  
  在其它類如 GridBagLayout 中也對命名約定進行了更新GridBagLayout 類包括幾個 protected 方法如 AdjustForGravity()這些 protected 方法現在已被修改為以小寫字母開頭
  
  檢測鼠標滾輪移動
  自從上個世紀以來 Java 開發者就嚷著要求的一個功能是支持鼠標滾輪旋轉事件隨著 Merlin 發行版的出現現在您可以為任何 Component 增加一個 MouseWheelListener 並做出相應的響應除了前面提及的錯誤之外它運行得很順利JScrollPane 組件甚至隨預注冊的偵聽器一起提供所以當這個組件獲得焦點且用戶移動鼠標滾輪時窗格將會滾動
  
  該偵聽器有一個方法mouseWheelMoved()它獲取一個 MouseWheelEvent 參數在事件中您可以使用 getScrollAmount() 查明滾動總量使用 getScrollType() 查明是單元滾動還是塊滾動使用 getWheelRotation 查明滾動方向和鼠標滾輪旋轉的次數為方便起見還可以使用 getUnitsToScroll() 查明要滾動的單元
  
  在測試程序中我們增加了一個鼠標滾輪偵聽器它讓背景色按照某一方向在顏色數組中循環如清單 所示文檔聲明鼠標滾輪事件向上傳遞容器層次結構但錯誤導致這件事無法發生所以您需要為按鈕增加一個偵聽器確保在 main() 方法中添加一個偵聽器
  
  清單 增加鼠標滾輪偵聽器
   private static void attachMouseWheelListener(final JFrame frame) {
    MouseWheelListener listener = new MouseWheelListener() {
     public void mouseWheelMoved(MouseWheelEvent e) {
      int count = egetWheelRotation();
      int direction = (Mathabs(count) > ) ? UP : DOWN;
      changeBackground(frame direction);
     }
    };
    buttonaddMouseWheelListener(listener);
   }
  
  輸入事件
  這最後一個功能比您剛開始想象的要多一些因為測試程序只使用了已添加的功能的一小部分基本上Merlin 添加了區別同一鍵的不同版本(鍵區鍵和常規鍵)以及鍵盤鍵和鼠標按鈕的不同次序的功能例如以前無法說出按下 shift 再單擊和單擊不同按鈕之間的不同兩者產生相同的鼠標事件有了 InputEvent 類中下列新常量的幫助一切都不同了
  
  ALT_DOWN_MASK
  CTRL_DOWN_MASK
  META_DOWN_MASK
  SHIFT_DOWN_MASK
  BUTTON_DOWN_MASK
  BUTTON_DOWN_MASK
  BUTTON_DOWN_MASK
  BUTTON_CHANGED_MASK
  BUTTON_CHANGED_MASK
  BUTTON_CHANGED_MASK
  如果您想找出按下的是哪個按鈕下列方法更常用
  
  isButtonDown()
  isButtonDown()
  isButtonDown()
  MouseEvent 還提供 getButton() 方法用來發現哪個按鈕改變了狀態
  
  所有這些方法和常量應該會使得對按鈕事件做出響應更加容易
  
  區分同一個鍵的不同版本要求對 KeyEvent 類做一些修改您可以使用 getKeyLocation() 從事件中得到鍵的位置您會重新使用下列常量之一
  
  KEY_LOCATION_LEFT
  KEY_LOCATION_NUMPAD
  KEY_LOCATION_RIGHT
  KEY_LOCATION_STANDARD
  KEY_LOCATION_UNKNOWN
  通過詢問鍵的位置您可以區分小鍵盤鍵標准鍵以及左和右 shift 鍵
  
  對於測試程序我們只簡單地讓鍵偵聽器根據按下的是左還是右 shift 鍵按向上或向下的方向循環如清單 所示我們務必要首先核實按下的是哪個鍵然後再檢查其位置當然還要在 main() 方法中添加對例程的調用
  
  清單 增加鍵偵聽器
   private static void attachKeyListener(final JFrame frame) {
    KeyListener listener = new KeyAdapter() {
     public void keyPressed(KeyEvent e) {
      if (egetKeyCode() == KeyEventVK_SHIFT) {
       int location = egetKeyLocation();
       int direction = (location == KeyEventKEY_LOCATION_LEFT) ?
        UP : DOWN;
       changeBackground(frame direction);
      }
     }
    };
    buttonaddKeyListener(listener);
   }
  
  完整的示例
  清單 為您提供了一個完整的示例來試驗所有這些新功能修正鼠標滾輪偵聽器後您將可以不用按鈕和滾動窗格
  
  清單 完整的示例
  import javaawt*;
  import javaawtevent*;
  import javaxswing*;
  
  public class AwtTest {
  
   private static final Color colors[] = {
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26642.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.