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

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

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

    Java桌面技術

    Java Desktop Technology

    常用鏈接

    統(tǒng)計

    友情連接

    最新評論

    自定義組件之Button

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

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

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

    范例源代碼這里下載

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

    評論

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

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

    # 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也提問了啊。  回復  更多評論   

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

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

    # 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ā)表評論。


    網站導航:
     
    TWaver中文社區(qū)
    主站蜘蛛池模板: 岛国片在线免费观看| 在线观看特色大片免费网站| 99在线精品免费视频九九视| 亚洲网站在线观看| 久久免费的精品国产V∧| 亚洲一区二区中文| 亚欧人成精品免费观看| 亚洲AV综合色区无码二区爱AV| 18国产精品白浆在线观看免费| 亚洲五月综合网色九月色| 一二三四影视在线看片免费| 亚洲国产精品自在自线观看| 国产在线观看www鲁啊鲁免费| 国产午夜亚洲精品不卡| 亚洲日本一区二区一本一道 | 91麻豆国产免费观看| 亚洲国产成人久久| 午夜视频免费成人| 又黄又大的激情视频在线观看免费视频社区在线 | 波多野结衣在线免费视频| 亚洲日韩精品国产一区二区三区| 国产精品高清全国免费观看| 四虎精品免费永久免费视频| 亚洲AV无码成人精品区天堂| 黄色免费网站网址| 看亚洲a级一级毛片| 亚洲精品无码永久在线观看你懂的| 99爱视频99爱在线观看免费| 亚洲色一区二区三区四区| 亚洲国产综合无码一区二区二三区 | 亚洲精品无码久久久久久| 亚洲精品高清一二区久久| 久久精品一区二区免费看| 亚洲 日韩经典 中文字幕| 国产偷窥女洗浴在线观看亚洲| 2020因为爱你带字幕免费观看全集 | 337p日本欧洲亚洲大胆人人| 亚洲毛片αv无线播放一区| 免费精品国产日韩热久久| 男人j进女人p免费视频| 亚洲综合一区二区|