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

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

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

    有才華的人,別忘記給滋潤(rùn)你的那塊土壤施肥

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      28 隨筆 :: 5 文章 :: 147 評(píng)論 :: 0 Trackbacks

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

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

    源碼如下:
    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);    
            
    //改變相應(yīng)的背景顏色
            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());//設(shè)置自定義的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 閱讀(1456) 評(píng)論(2)  編輯  收藏 所屬分類: swing

    評(píng)論

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

    返回:
    如果鼠標(biāo)在按鈕上,則返回 true.

    button.getModel() -> ButtonModel

    然后根據(jù)這個(gè)狀態(tài)單獨(dú)繪制。  回復(fù)  更多評(píng)論
      

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

    主站蜘蛛池模板: 久久久久亚洲精品中文字幕| 久久精品一本到99热免费| 国产2021精品视频免费播放| 久久精品亚洲一区二区 | a毛片免费全部播放完整成| 亚洲国产精品无码中文字| 国产久爱免费精品视频| 亚洲国产精品久久久久久| 免费91麻豆精品国产自产在线观看 | 免费成人黄色大片| 午夜免费福利视频| 青草久久精品亚洲综合专区| 亚洲视频网站在线观看| 国内外成人免费视频| 国产乱子伦精品免费视频| 一级毛片a免费播放王色| 亚洲小说区图片区| 69式国产真人免费视频| 亚洲精品A在线观看| 午夜视频在线观看免费完整版| 亚洲精品国产精品乱码视色| 国产精品亚洲片在线观看不卡 | 国产精品1024在线永久免费| 亚洲欧美成人综合久久久| 伊人久久综在合线亚洲2019| 亚洲精品乱码久久久久久中文字幕 | 亚洲精品人成网线在线播放va | 噼里啪啦免费观看高清动漫4 | 成人精品国产亚洲欧洲| 84pao国产成视频免费播放| a拍拍男女免费看全片| 亚洲va中文字幕无码| 亚洲&#228;v永久无码精品天堂久久 | 全部在线播放免费毛片| 国产成人 亚洲欧洲| 污污污视频在线免费观看| 日本亚洲欧洲免费天堂午夜看片女人员 | 免费国产污网站在线观看15 | 国产午夜精品理论片免费观看 | 性xxxx黑人与亚洲| 亚洲AV成人一区二区三区观看|