自定義組件之Button
前面已經(jīng)向大家介紹過(guò)《用SWT實(shí)現(xiàn)MSN風(fēng)格的下拉框》、《SWT自定義組件之Slider》,現(xiàn)在再編寫(xiě)一個(gè)最常用的自定義組件——Button。
GUI組件要完成的任務(wù)有2個(gè),展現(xiàn)與業(yè)務(wù)。對(duì)于按鈕來(lái)說(shuō),文本、圖標(biāo)、邊框、背景屬于展現(xiàn)層,而這些元素在按鈕不同狀態(tài)下會(huì)不盡相同,一般來(lái)說(shuō)至少有4種狀態(tài)下的展現(xiàn):普通、鼠標(biāo)放在其上、被按下、被禁用,也就是按鈕應(yīng)該具備這4種狀態(tài)。
下面給出的示例是swing實(shí)現(xiàn)的自定義按鈕。
通常swing自定義組件繼承javax.swing.JComponent并重寫(xiě)protected void paintComponent(Graphics g)方法實(shí)現(xiàn)自定義繪制。重寫(xiě)paintComponent方法時(shí)通常要先去掉super.paintComponent(g),因?yàn)楦阜椒ㄕ{(diào)用會(huì)繪制背景色。不妨先看一下源代碼中的調(diào)用過(guò)程。
在JComponent.java中paintComponent(Graphics g)方法定義如下:
protected void paintComponent(Graphics g) {
if (ui != null) {
Graphics scratchGraphics = (g == null) ? null : g.create();
try {
ui.update(scratchGraphics, this);
}
finally {
scratchGraphics.dispose();
}
}
}
其中ui的聲明如下
protected transient ComponentUI ui;
然后轉(zhuǎn)向ComponentUI的update(Graphics g, JComponent c)方法:
public void update(Graphics g, JComponent c) {
if (c.isOpaque()) {
g.setColor(c.getBackground());
g.fillRect(0, 0, c.getWidth(),c.getHeight());
}
paint(g, c);
}
可見(jiàn)如果發(fā)現(xiàn)組件是非透明的,就繪制背景,可以看出swing組件的setBackground方法如何繪制背景的。
一般簡(jiǎn)單的自定義組件,你可以只通過(guò)重寫(xiě)paintComponent方法來(lái)實(shí)現(xiàn)繪制,對(duì)于一般的組件這已經(jīng)足夠。對(duì)于自定義按鈕一般的原則是準(zhǔn)備4張背景圖對(duì)應(yīng)上述4種狀態(tài),這4種狀態(tài)都可通過(guò)鼠標(biāo)監(jiān)聽(tīng)來(lái)感知,當(dāng)狀態(tài)改變時(shí),調(diào)用repaint()使Button重繪。除了背景,按鈕文本、圖標(biāo)等的改變一樣也必須調(diào)用repaint()來(lái)刷新。
然后重要的一點(diǎn)是你必須重寫(xiě)public Dimension getPreferredSize()來(lái)獲得按鈕的最佳尺寸。getPreferredSize方法對(duì)于布局管理器來(lái)說(shuō)至關(guān)重要,布局管理器會(huì)通過(guò)getPreferredSize的判斷組件的最佳大小,并進(jìn)行布局。而對(duì)于本范例而言,getPreferredSize的大小只和背景圖片大小有關(guān)。
對(duì)于業(yè)務(wù),盡量做到前臺(tái)界面與后來(lái)業(yè)務(wù)分離。你可以自定義按鈕動(dòng)作監(jiān)聽(tīng)器來(lái)實(shí)現(xiàn),本例是沿用swing的Action實(shí)現(xiàn),當(dāng)鼠標(biāo)抬起時(shí),構(gòu)造一個(gè)ActionEvent對(duì)象,然后交給Action成員的actionPerformed(ActionEvent e)處理。
范例源代碼這里下載
posted on 2007-11-11 15:33 sun_java_studio@yahoo.com.cn(電玩) 閱讀(5493) 評(píng)論(4) 編輯 收藏 所屬分類(lèi): Swing