為演示新的 AWT 功能
我們將創建一個程序將屏幕設為全屏(最小化桌面裝飾如工具欄)並使用新的顏色常量設置背景
您將能夠通過旋轉鼠標滾輪或使用左和右 shift 鍵更改背景色
清單
提供了該程序的基本骨架程序
遺憾的是
在要使用的鼠標滾輪支持功能中仍存在錯誤(有關詳細信息請參閱參考資料)
為使這種功能起作用
您需要把 JButton 添加到 JScrollPane
再把 JScrollPane 添加到框架中
這個錯誤使得這個骨架程序比必需的復雜了一點
清單
創建可關閉框架的骨架程序
import java
awt
*;
import java
awt
event
*;
import javax
swing
*;
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
frame
getContentPane()
add(button
BorderLayout
CENTER);
frame
setDefaultCloseOperation(JFrame
EXIT_ON_CLOSE);
frame
show();
}
}
工具箱 insets 在上一個專欄中
我提到了用 setExtendedState() 最大化 Frame 的功能
如果您將框架的狀態設置為 Frame
MAXIMIZED_BOTH
您的框架就被完全最大化了
但如果您不希望把框架最大化
卻希望它的大小填滿用戶的桌面區域(扣除所有桌面裝飾的大小)
那麼現在您可以查詢那些裝飾使用的 Insets(請參閱清單
)
這些信息由 Toolkit 的 getScreenInsets() 方法提供
如果從屏幕大小中減去那些 insets
您就得到了窗口的應有大小
為正確地定位
您還需要使用頂端和左邊的 insets
清單
確定屏幕大小
private static void sizeScreen(JFrame frame) {
Toolkit kit = Toolkit
getDefaultToolkit();
Dimension screenSize = kit
getScreenSize();
GraphicsConfiguration config = frame
getGraphicsConfiguration();
Insets insets = kit
getScreenInsets(config);
screenSize
width
= (insets
left + insets
right);
screenSize
height
= (insets
top + insets
bottom);
frame
setSize(screenSize);
frame
setLocation(insets
left
insets
top);
}
只需把 sizeScreen() 調用添加到 main() 方法中
顏色常量大寫 Java 語言規范的第
節包含包
方法
字段和常量等項的命名約定
關於常量名的子節(
)聲明常量不應使用小寫字母
但從一開始
Color 類中的全部顏色常量如 red
green 和 blue 就是以全小寫指定的
Merlin 也直接開了個先例
現在以全大寫提供相同的常量
現在尚不反對使用舊名稱
但在您的
程序中您可以使用較新的名稱
我們將為測試程序創建一個顏色常量數組和一個對這些顏色常量進行循環的計數程序
然後提供一個 changeBackground() 方法
該方法按兩個方向的其中一個方向對這些顏色常量進行循環(請參閱
清單
)
清單
更改背景色
private static final Color colors[] = {
Color
BLACK
Color
BLUE
Color
CYAN
Color
DARK_GRAY
Color
GRAY
Color
GREEN
Color
LIGHT_GRAY
Color
MAGENTA
Color
ORANGE
Color
PINK
Color
RED
Color
WHITE
Color
YELLOW
};
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()
button
setBackground(colors[colorCounter]);
// Update counter based on direction
if (direction == UP) {
colorCounter++;
} else {
colorCounter;
}
// Wrap colors
if (colorCounter == colors
length) {
colorCounter =
;
} else if (colorCounter <
) {
colorCounter = colors
length
;
}
}
向您的 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 = e
getWheelRotation();
int direction = (Math
abs(count) >
) ? UP : DOWN;
changeBackground(frame
direction);
}
};
button
addMouseWheelListener(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
如果您想找出按下的是哪個按鈕
下列方法更常用
isButton
Down()
isButton
Down()
isButton
Down()
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 (e
getKeyCode() == KeyEvent
VK_SHIFT) {
int location = e
getKeyLocation();
int direction = (location == KeyEvent
KEY_LOCATION_LEFT) ?
UP : DOWN;
changeBackground(frame
direction);
}
}
};
button
addKeyListener(listener);
}
完整的示例 清單
為您提供了一個完整的示例來試驗所有這些新功能
修正鼠標滾輪偵聽器後
您將可以不用按鈕和滾動窗格
清單
完整的示例
import java
awt
*;
import java
awt
event
*;
import javax
swing
*;
public class AwtTest {
private static final Color colors[] = {
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26642.html