<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Java桌面技術(shù)

    Java Desktop Technology

    常用鏈接

    統(tǒng)計(jì)

    友情連接

    最新評(píng)論

    自定義組件之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

    評(píng)論

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

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

    # 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也提問(wèn)了啊。  回復(fù)  更多評(píng)論   

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

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

    # 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ù)  更多評(píng)論   


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


    網(wǎng)站導(dǎo)航:
     
    TWaver中文社區(qū)
    主站蜘蛛池模板: 国产在线jyzzjyzz免费麻豆| 曰批全过程免费视频在线观看无码| 久久免费精品视频| 亚洲精品国产V片在线观看| 亚洲欧美日韩国产成人| 免费看香港一级毛片| 亚洲 日韩 色 图网站| 野花高清在线电影观看免费视频| 亚洲1234区乱码| 成人黄页网站免费观看大全 | 亚洲区小说区图片区QVOD| 巨胸喷奶水www永久免费| 中文字幕亚洲第一| 国产一区二区三区免费观看在线 | 青青草原精品国产亚洲av| 99在线观看免费视频| 亚洲国产高清美女在线观看| 青春禁区视频在线观看直播免费| 亚洲国产最大av| 免费少妇a级毛片人成网| 中文字幕免费视频精品一| 久久亚洲精品AB无码播放| 波多野结衣免费在线| 亚洲aⅴ无码专区在线观看| 亚洲情a成黄在线观看| 国内精品免费视频精选在线观看 | 久久精品国产亚洲av麻豆| 2021国内精品久久久久精免费| 国产午夜亚洲精品| 亚洲免费一区二区| 久久午夜夜伦鲁鲁片免费无码影视 | 在线a免费观看最新网站| 亚洲午夜无码毛片av久久京东热| 亚洲精品无码99在线观看| 精品国产麻豆免费人成网站| 精品亚洲AV无码一区二区三区 | 久久久久国产精品免费网站| 亚洲一区二区三区成人网站| 亚洲日本乱码在线观看| 国产在线国偷精品产拍免费| 男女一边摸一边做爽的免费视频|