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

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

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

    有才華的人,別忘記給滋潤你的那塊土壤施肥

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      28 隨筆 :: 5 文章 :: 147 評論 :: 0 Trackbacks

    用了swing有一段時間了。最近在看它的源碼,所以就想著也寫一些自己喜歡UI,首先就從簡單的button開始,不料想就碰到問題了。
    問題是這樣的,寫它的測試用例的時候,用了兩種方法去測試:
    一是:
    KJButton btn1 = new KJButton("button 1");//JButton的子類
    二是:
    JButton btn2 = new JButton("button 2");
    btn2.setUI(
    new KJButtonUI());//設置自定義的UI

    結果當鼠標放在btn1的上面的時候button的背景顏色不會跟著變化,但是當鼠標移到在btn2的上面卻會改變,想了很久不知道是怎么回事,望高手幫忙哈。(效果圖如下,不曉得如何把鼠標放在上面再截圖,所以沒截對比圖。下圖button2是鼠標放在上面的效果,但button1卻不會)

    源碼如下:
    KJButtonUI.java
    package org.kissjava.ui;

    import java.awt.*;
    import java.awt.geom.RoundRectangle2D;
    import javax.swing.*;
    import javax.swing.border.Border;
    import javax.swing.plaf.ComponentUI;
    import javax.swing.plaf.basic.BasicButtonUI;
    import javax.swing.plaf.basic.BasicHTML;
    import javax.swing.text.View;

    public class KJButtonUI extends BasicButtonUI{
        
    public static final Color BUTTON_COLOR = new Color(5115447);
        
        
    public void installUI(JComponent c) {
            AbstractButton button 
    = (AbstractButton)c;
            Border border 
    = button.getBorder();
            c.putClientProperty(
    "oldBorder", border);
            c.setBorder(
    null);
            installListeners(button);
        }

        
    public static ComponentUI createUI(JComponent c){
            
    return new KJButtonUI();
        }
     
        @Override
        
    public void paint(Graphics g, JComponent c) {
            
    final AbstractButton button = (AbstractButton) c;
            ButtonModel model 
    = button.getModel();
            FontMetrics fm 
    = g.getFontMetrics();
            Insets i 
    = c.getInsets();
            Rectangle viewRect 
    = new Rectangle();
            Rectangle iconRect 
    = new Rectangle();
            
    final Rectangle textRect = new Rectangle();
            viewRect.x 
    = i.left;
            viewRect.y 
    = i.top;
            viewRect.width 
    = button.getWidth() - (i.right + viewRect.x);
            viewRect.height 
    = button.getHeight() - (i.bottom + viewRect.y);
            textRect.x 
    = textRect.y = textRect.width = textRect.height = 0;
            iconRect.x 
    = iconRect.y = iconRect.width = iconRect.height = 0;    
            Font f 
    = c.getFont();        
            String text 
    = SwingUtilities.layoutCompoundLabel(c, fm, button.getText(), button
                    .getIcon(), button.getVerticalAlignment(), button
                    .getHorizontalAlignment(), button.getVerticalTextPosition(), button
                    .getHorizontalTextPosition(), viewRect, iconRect, textRect, button
                    .getText() 
    == null ? 0 : button.getIconTextGap());
            Graphics2D g2d 
    = (Graphics2D) g.create();
            View v 
    = (View) c.getClientProperty(BasicHTML.propertyKey);
            g2d.setFont(f);    
            
    //改變相應的背景顏色
            updateBackground(g2d, button);        
            
    if (model.isArmed() && model.isPressed()) {
                 paintButtonPressed(g,button); 
            }

            
    // Paint the Icon
            if(button.getIcon() != null
               paintIcon(g,c,iconRect);
            }

           
    if (text != null && !text.equals("")){           
               
    if (v != null{
                   v.paint(g, textRect);
               }
     else {
                   paintText(g, button, textRect, text);
               }

            }

           
    if (button.isFocusPainted() && button.hasFocus()) {
                 paintFocus(g,button,viewRect,textRect,iconRect);
            }

        }

       
    protected void paintButtonPressed(Graphics g, AbstractButton button) {
             Graphics2D g2d 
    = (Graphics2D) g.create();   
             
    int h = button.getHeight();
             
    int w = button.getWidth();
             g2d.setColor(BUTTON_COLOR);
             RoundRectangle2D.Float r2d 
    = new RoundRectangle2D.Float(00,w, h , h, h);
             Shape clip 
    = g2d.getClip();
             g2d.clip(r2d);
             g2d.fillRect(
    00, w, h);
             g2d.setClip(clip);
             g2d.drawRoundRect(
    00, w-1, h-1 , h, h);
         }


       
    public void updateBackground(Graphics g, AbstractButton button) {
           Graphics2D g2d 
    = (Graphics2D) g.create();
           
    int h = button.getHeight();
           
    int w = button.getWidth();
           
    float tran = 0.7F;
           
    if (!button.getModel().isRollover()) {
               tran 
    = 0.3F;
           }

           g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
           g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,tran));
           g2d.setColor(BUTTON_COLOR);
           RoundRectangle2D.Float r2d 
    = new RoundRectangle2D.Float(00,w, h , h, h);
           Shape clip 
    = g2d.getClip();
           g2d.clip(r2d);
           g2d.fillRect(
    00, w, h);
           g2d.setClip(clip);
           g2d.drawRoundRect(
    00, w-1, h-1 , h, h);      
        }

    }

    KJButton.java
    package org.kissjava;

    import javax.swing.Action;
    import javax.swing.Icon;
    import javax.swing.JButton;
    import org.kissjava.ui.KJButtonUI;
    public class KJButton extends JButton{
        
        
    public KJButton(){
            
    this(null,null);
        }

        
        
    public KJButton(String text){
            
    this(text,null);
        }

        
        
    public KJButton(Action a) {
            
    this();
            setAction(a);
        }

        
    public KJButton(Icon icon) {
                
    this(null, icon);
        }

        
        
    public KJButton(String text, Icon icon) {         
                
    super(text, icon);
        }

        @Override
        
    public void updateUI() {
            
    //setUI((ButtonUI)UIManager.getUI(this));;
            setUI(new KJButtonUI());
        }

    }

    KJButtonTest.java
    package test;
    import java.awt.Container;
    import java.awt.Dimension;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.SwingUtilities;
    import org.kissjava.KJButton;
    import org.kissjava.ui.KJButtonUI;
    public class KJButtonTest extends JFrame{
        
    public KJButtonTest(){
        
    //    UIManager.put("ButtonUI", "KJButtonUI");
            this.setLayout(null);
            KJButton btn1 
    = new KJButton("button 1");//JButton的子類
            JButton btn2 = new JButton("button 2");
            btn2.setUI(
    new KJButtonUI());//設置自定義的UI
            btn1.setBounds(20208020);
            btn2.setBounds(
    208018040);
            Container contentPane 
    = getContentPane();    
            contentPane.add(btn1);
            contentPane.add(btn2);
            
    this.setVisible(true);        
        }

        
    public static void main(String[] args) {        
            SwingUtilities.invokeLater(
    new Runnable() {
                
    public void run() {
                    KJButtonTest tb 
    = new KJButtonTest();
                    tb.setPreferredSize(
    new Dimension(300200));
                    tb.setSize(tb.getPreferredSize());
                    tb.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    tb.setVisible(
    true);
                }

            }
    );
        }

    }

    posted on 2008-05-11 13:44 kissjava 閱讀(1442) 評論(2)  編輯  收藏 所屬分類: swing

    評論

    # re: 自定義Button的使用效果為何不一樣?[未登錄] 2008-05-16 09:14 beansoft
    建議看看ButtonModel,里面有個方法:isRollover
    boolean isRollover()指示鼠標是否在按鈕上。

    返回:
    如果鼠標在按鈕上,則返回 true.

    button.getModel() -> ButtonModel

    然后根據這個狀態單獨繪制。  回復  更多評論
      

    # re: 自定義Button的使用效果為何不一樣? 2008-05-16 14:19 枯寬
    @beansoft
    在UI的updateBackground方法里面有這個判斷的?,F在就是用
    JButton btn2 = new JButton("button 2");
    btn2.setUI(new KJButtonUI());//設置自定義的UI
    這種情況下button會有各個顏色狀態畫出
    但是用自定義的
    KJButton btn1 = new KJButton("button 1");//JButton的子類
    這樣就沒那個效果。。。  回復  更多評論
      

    主站蜘蛛池模板: 亚洲av无码专区首页| 十九岁在线观看免费完整版电影| 久久亚洲高清综合| 国产白丝无码免费视频| 久久亚洲精品国产亚洲老地址| 国产免费人成视频在线观看 | 日韩人妻无码精品久久免费一| 亚洲一区二区三区无码国产| 亚洲成a人片在线观看国产| 免费A级毛片av无码| 豆国产96在线|亚洲| 亚洲视频欧洲视频| www.亚洲色图.com| 国产曰批免费视频播放免费s| 无码免费又爽又高潮喷水的视频| 亚洲蜜芽在线精品一区| 亚洲裸男gv网站| 全免费a级毛片免费看不卡| 久草免费福利视频| 日韩在线视频线视频免费网站| 亚洲精品国产啊女成拍色拍| 精品国产日韩亚洲一区| 免费毛片在线播放| 最近免费中文字幕mv在线电影| 人妻巨大乳hd免费看| 亚洲一区在线视频| 亚洲短视频男人的影院| 亚洲福利精品一区二区三区| 最新猫咪www免费人成| 99在线观看视频免费| 99久久精品毛片免费播放| 精品在线视频免费| 亚洲色偷偷综合亚洲av78| 亚洲美女在线观看播放| 亚洲av永久无码精品漫画| 亚洲日本在线观看视频| 国产亚洲精品免费| 久久WWW色情成人免费观看| 麻豆高清免费国产一区| 免费91麻豆精品国产自产在线观看| 免费无码专区毛片高潮喷水|