<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ū)
    主站蜘蛛池模板: 国产成人综合亚洲AV第一页| 亚洲精品成人av在线| 在线观看视频免费完整版| 成人毛片100免费观看| 国产精品久久久久久亚洲影视| 亚洲综合激情另类专区| 久久国产精品萌白酱免费| 亚洲综合色7777情网站777| 免费人成在线观看播放国产| 中国一级全黄的免费观看| 亚洲精品国产专区91在线| 国产AV无码专区亚洲AV男同| 亚洲精品一级无码鲁丝片| 日本免费一区二区三区最新| 日批视频网址免费观看| 亚洲国产福利精品一区二区| 全部免费毛片在线| 免费观看毛片视频| 国内精品久久久久影院免费| ww亚洲ww在线观看国产| 亚洲成av人片在线看片| 337p日本欧洲亚洲大胆色噜噜| 午夜亚洲www湿好大| 久久久久亚洲av无码尤物| 国产高清在线免费| 免费视频成人手机在线观看网址| 一级做a爰片性色毛片免费网站| 亚洲国产精品久久久久网站| 亚洲成年人在线观看| 亚洲国产成人久久综合一| 免费永久看黄在线观看app| 国产一区在线观看免费| 免费人成激情视频| 亚洲一区二区视频在线观看| 亚洲成a人片在线观看国产| 国产无人区码卡二卡三卡免费 | 国产h视频在线观看网站免费| 精品熟女少妇av免费久久| 亚洲免费视频观看| 成人免费a级毛片无码网站入口| 麻豆国产入口在线观看免费|