11
回答
Swing第二集
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

Swing第二集

Swing第一集播出以后,收视率创历史新高点,香蕉台,芒果台都相继上映,我好像也是玩Swing玩上瘾了,今天我们开播第二集。上一集是为了增强大家对Swing的性趣(im sorry,把兴趣打成性趣了,罪孽呀,阿弥陀佛)所以我们用最简单的办法直接继承的JFrame来重绘,今天,我们不那样做了,我们走正规路线,做一个LAF(swing的外观)本人也是最近才开始猛啃swing的,以前都只是会拖控件(),我们知道一个完整的LAF文件包括swing所有组组件的外观,我一时间也做不出一整套的皮肤来(我确实是不会,因为书我还没看完),所以我们先一个一个来做,我们从最简单的Button开始做起。

JDK1.6u10后自带有以下几种外观

com.sun.java.swing.plaf.gtk.GTKLookAndFeel

com.sun.java.swing.plaf.motif.MotifLookAndFeel

com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel

com.sun.java.swing.plaf.nimbus.windows.WindowsLookAndFeel

可以通过在构造函数中写入以下代码来实现更换外观,例如

UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel") ; 
SwingUtilities.updateComponentTreeUI(ContainerClassName.this);//这一句重要,不加这句不会生效哟
关于外观的详细信息,大家去google一下,我们继续说我们的。

我们今天写的也是一个外观,但是这个外观不是针对swing所有组件的,只是针对JButton的,这个外观是继承BasicButtonUI,上图

多放几个按钮

很简单哈

下面是完整代码

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.javaea.ui;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.RoundRectangle2D;
import javax.swing.AbstractButton;
import javax.swing.ButtonModel;
import javax.swing.JComponent;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicButtonUI;

/**
 *
 * @author SeamanMei
 */
public class IButtonUI extends BasicButtonUI {

   
    public Color color = new Color(0x1E90FF);
    private final static IButtonUI iButtonUI = new IButtonUI();

    public static ComponentUI createUI(JComponent c) {
        return iButtonUI;
    }

    @Override
    public void installDefaults(final AbstractButton b) {
        super.installDefaults(b);
        b.setBorderPainted(false);//设置 borderPainted 属性。如果该属性为 true 并且按钮有边框,则绘制该边框。borderPainted 属性的默认值为 true。
        b.setFocusPainted(false);//设置 paintFocus 属性,对于要绘制的焦点状态,该属性必须为 true。paintFocus 属性的默认值为 true。一些外观没有绘制焦点状态;它们将忽略此属性
        b.setPreferredSize(new Dimension(70, 22));//从类 javax.swing.JComponent 继承的方法,设置此组件的首选大小。如果 preferredSize 为 null,则要求 UI 提供首选大小。
    }

    @Override
    public void paint(Graphics g, JComponent c) {
        AbstractButton button = (AbstractButton) c;
        ButtonModel model = button.getModel();
        if (button.isContentAreaFilled()) {
            int h = c.getHeight();
            int w = c.getWidth();
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            RoundRectangle2D.Float r2d = new RoundRectangle2D.Float(0, 0,
                    w - 1, h - 1, 8, 8);
            g2d.clip(r2d);
            if (model.isEnabled()) {
                boolean rollOver = model.isRollover();
                boolean pressed = model.isPressed() && model.isArmed();
                boolean focused = button.hasFocus();
                g2d.setColor(new Color(0x912CEE));
                if (focused) {
                    color = new Color(0xFFC0CB);

                }
                if (rollOver) {
                    color = new Color(0xFF3E96);
                }
                if (pressed) {
                    color = new Color(0xC0FF3E);
                }
                g2d.setColor(color);
                g2d.fillRect(0, 0, w, h);
            } else {
            }
            g2d.dispose();
        }
        super.paint(g, c);
    }
}
大家在需要使用这个外观的程序的构造函数里面输入

 UIManager.getLookAndFeelDefaults().put("ButtonUI", "com.javaea.ui.IButtonUI");

我的我的JFrame里面是这样写的

public class NewJFrame1 extends javax.swing.JFrame {

    /** Creates new form NewJFrame1 */
    public NewJFrame1() {
       UIManager.getLookAndFeelDefaults().put("ButtonUI", "com.javaea.ui.IButtonUI");
        initComponents();
    }
是不是很简单啊,尽管简单,可是这个按钮还是可以点击的,不信你试试,下一集我们将学习让这个按钮变得更漂亮。

举报
共有11个评论 最后回答: 4年前
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.javaea.ui;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.RoundRectangle2D;
import javax.swing.AbstractButton;
import javax.swing.ButtonModel;
import javax.swing.JComponent;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicButtonUI;

/**
 *
 * @author SeamanMei
 */
public class IButtonUI extends BasicButtonUI {

   
    public Color color = new Color(0x1E90FF);
    private final static IButtonUI iButtonUI = new IButtonUI();

    public static ComponentUI createUI(JComponent c) {
        return iButtonUI;
    }

    @Override
    public void installDefaults(final AbstractButton b) {
        super.installDefaults(b);
        b.setBorderPainted(false);//设置 borderPainted 属性。如果该属性为 true 并且按钮有边框,则绘制该边框。borderPainted 属性的默认值为 true。
        b.setFocusPainted(false);//设置 paintFocus 属性,对于要绘制的焦点状态,该属性必须为 true。paintFocus 属性的默认值为 true。一些外观没有绘制焦点状态;它们将忽略此属性
        b.setPreferredSize(new Dimension(70, 22));//从类 javax.swing.JComponent 继承的方法,设置此组件的首选大小。如果 preferredSize 为 null,则要求 UI 提供首选大小。
    }

    @Override
    public void paint(Graphics g, JComponent c) {
        AbstractButton button = (AbstractButton) c;
        ButtonModel model = button.getModel();
        if (button.isContentAreaFilled()) {
            int h = c.getHeight();
            int w = c.getWidth();
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            RoundRectangle2D.Float r2d = new RoundRectangle2D.Float(0, 0,
                    w - 1, h - 1, 8, 8);
            g2d.clip(r2d);
            if (model.isEnabled()) {
                boolean rollOver = model.isRollover();
                boolean pressed = model.isPressed() && model.isArmed();
                boolean focused = button.hasFocus();
                g2d.setColor(new Color(0x912CEE));
                if (focused) {
                    color = new Color(0xFFC0CB);

                }
                if (rollOver) {
                    color = new Color(0xFF3E96);
                }
                if (pressed) {
                    color = new Color(0xC0FF3E);
                }
                g2d.setColor(color);
                g2d.fillRect(0, 0, w, h);
            } else {
            }
            g2d.dispose();
        }
        super.paint(g, c);
    }
}
这个不就是源码吗,你直接新建一个IButtonUI类然后把代码黏贴进去就可以了
--- 共有 1 条评论 ---
北落打包 哈哈 6年前 回复
随便问下,用JButton做那种按钮效果,按的时候按钮会往下缩,放手后又会伸回来,这种效果是不是很难弄哟,我看见swing hack有做过,就是整个按钮都是画上去的,然后缩放就通过一个变量来计算压缩值,代码比较复杂,有简单一点的方法么?

引用来自“godlike”的答案

随便问下,用JButton做那种按钮效果,按的时候按钮会往下缩,放手后又会伸回来,这种效果是不是很难弄哟,我看见swing hack有做过,就是整个按钮都是画上去的,然后缩放就通过一个变量来计算压缩值,代码比较复杂,有简单一点的方法么?
我们下集就会讲到这个问题,解开swing神秘面纱,让你看看那些很炫的swing到底是怎么画出来的,用swing没有做不到,只有想不到,其实很简单,按钮我们会慢慢深入,一下子写得太深奥,我看不懂,很多swing新盆友也看不懂,请保持关注,这个就是你想要的~
顶部