Java桌面技術(shù)

          Java Desktop Technology

          常用鏈接

          統(tǒng)計

          友情連接

          最新評論

          自定義組件之Button

          前面已經(jīng)向大家介紹過《用SWT實現(xiàn)MSN風(fēng)格的下拉框》、《SWT自定義組件之Slider》,現(xiàn)在再編寫一個最常用的自定義組件——Button。

          GUI組件要完成的任務(wù)有2個,展現(xiàn)與業(yè)務(wù)。對于按鈕來說,文本、圖標(biāo)、邊框、背景屬于展現(xiàn)層,而這些元素在按鈕不同狀態(tài)下會不盡相同,一般來說至少有4種狀態(tài)下的展現(xiàn):普通、鼠標(biāo)放在其上、被按下、被禁用,也就是按鈕應(yīng)該具備這4種狀態(tài)。
          下面給出的示例是swing實現(xiàn)的自定義按鈕。
          通常swing自定義組件繼承javax.swing.JComponent并重寫protected void paintComponent(Graphics g)方法實現(xiàn)自定義繪制。重寫paintComponent方法時通常要先去掉super.paintComponent(g),因為父方法調(diào)用會繪制背景色。不妨先看一下源代碼中的調(diào)用過程。
          在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);
              }
          可見如果發(fā)現(xiàn)組件是非透明的,就繪制背景,可以看出swing組件的setBackground方法如何繪制背景的。
          一般簡單的自定義組件,你可以只通過重寫paintComponent方法來實現(xiàn)繪制,對于一般的組件這已經(jīng)足夠。對于自定義按鈕一般的原則是準(zhǔn)備4張背景圖對應(yīng)上述4種狀態(tài),這4種狀態(tài)都可通過鼠標(biāo)監(jiān)聽來感知,當(dāng)狀態(tài)改變時,調(diào)用repaint()使Button重繪。除了背景,按鈕文本、圖標(biāo)等的改變一樣也必須調(diào)用repaint()來刷新。
          然后重要的一點(diǎn)是你必須重寫public Dimension getPreferredSize()來獲得按鈕的最佳尺寸。getPreferredSize方法對于布局管理器來說至關(guān)重要,布局管理器會通過getPreferredSize的判斷組件的最佳大小,并進(jìn)行布局。而對于本范例而言,getPreferredSize的大小只和背景圖片大小有關(guān)。

          對于業(yè)務(wù),盡量做到前臺界面與后來業(yè)務(wù)分離。你可以自定義按鈕動作監(jiān)聽器來實現(xiàn),本例是沿用swing的Action實現(xiàn),當(dāng)鼠標(biāo)抬起時,構(gòu)造一個ActionEvent對象,然后交給Action成員的actionPerformed(ActionEvent e)處理。

          范例源代碼這里下載

          posted on 2007-11-11 15:33 sun_java_studio@yahoo.com.cn(電玩) 閱讀(5510) 評論(4)  編輯  收藏 所屬分類: Swing

          評論

          # re: 自定義組件之Button 2007-11-13 11:32 Matthew Chen

          有個問題請教樓主,如何實現(xiàn)jtree針對不同節(jié)點(diǎn)的組件有不同的行高度,我現(xiàn)在被這個問題困擾了很久,想用拖拽來改變節(jié)點(diǎn)的行高,在DefaultTreeCellRenderer里處理重繪出來,但是在里面用setSize()怎么改都不行,網(wǎng)上沒搜到這樣的例子。  回復(fù)  更多評論   

          # re: 自定義組件之Button 2007-11-13 13:38 sun_java_studio@yahoo.com.cn(電玩)

          hehe,你在http://blogs.sun.com/Swing/entry/that_s_almost_what_i也提問了啊。  回復(fù)  更多評論   

          # re: 自定義組件之Button 2007-11-13 13:49 Matthew Chen

          是啊,TreeCellRenderer提供組件只用來實現(xiàn)節(jié)點(diǎn)本身的繪制,但節(jié)點(diǎn)所占的空間大小卻不知用什么設(shè)置,我試過tree的getPathBounds()方法,好像也不是,哎。  回復(fù)  更多評論   

          # re: 自定義組件之Button 2007-11-13 14:03 sun_java_studio@yahoo.com.cn(電玩)

          @Matthew Chen
          我在http://blogs.sun.com/Swing/entry/that_s_almost_what_i
          上面回復(fù)了。  回復(fù)  更多評論   


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          TWaver中文社區(qū)
          主站蜘蛛池模板: 彭水| 平潭县| 博客| 正镶白旗| 顺平县| 乌兰察布市| 广丰县| 延边| 喜德县| 土默特右旗| 商城县| 静宁县| 乐昌市| 新宁县| 波密县| 榆林市| 综艺| 安国市| 沙湾县| 张家川| 安塞县| 察隅县| 云安县| 汝阳县| 库伦旗| 澳门| 静安区| 云龙县| 合江县| 邓州市| 镇沅| 天气| 吉安县| 前郭尔| 全南县| 永顺县| 新乐市| 昌图县| 莱州市| 册亨县| 金堂县|