Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 426|回复: 0

[Swing学习]画出你的Swing界面(二)(java)

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-16 00:01:40 | 显示全部楼层 |阅读模式
    鉴于之前看到很多高手们,都喜欢做登陆界面来做某方面的学习,所以为紧跟大众趋势不落单,本人也做了一个Swing的登录窗口,与大家交流。图片总是让人又爱又恨(本人PS太差),所以本程序未用一张图片。

    通过本登录窗口的介绍你可以了解到以下主要三点(其他不作介绍,可查看之前文章):
    1.如何画出圆角文本域,并改变输入的字体;
    2.如何画出圆角按钮
    3.如何画出关闭和最小按钮
      要制作一个圆角的文本域,我们只要用现成的JTextField就可以了,圆不圆角其实是边框的问题,所以我们只要让它的边框圆角就可以了,这里我们用到的边框是javax.swing.border.LineBorder,我们要覆盖它的
    paintBorder(Component c, Graphics g, int x, int y, int width, int height)方法,代码如下:
    package com.lgj.myLineBorder;
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;
    import javax.swing.border.LineBorder;
    public class MyLineBorder extends LineBorder{
            private static final long serialVersionUID = 1L;
           
            public MyLineBorder(Color color, int thickness, boolean roundedCorners) {
                    super(color, thickness, roundedCorners);
            }
             public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
                     
                     RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING,
                                                                    RenderingHints.VALUE_ANTIALIAS_ON);
                 Color oldColor = g.getColor();
                 Graphics2D g2 = (Graphics2D)g;
                 int i;
                 g2.setRenderingHints(rh);
                 g2.setColor(lineColor);
                 for(i = 0; i < thickness; i++)  {
                     if(!roundedCorners)
                     g2.drawRect(x+i, y+i, width-i-i-1, height-i-i-1);
                     else
                     g2.drawRoundRect(x+i, y+i, width-i-i-1, height-i-i-1, 5, 5); //就是这一句
                 }
                 g2.setColor(oldColor);
            }
    }
                      [/code]
    这样就实现了文本域的圆角。我们只要添加到JFrame就可以了,代码如下:
    //登录名文本域
                    JTextField nameTextField = new JTextField();
                    nameTextField.setBounds(120, 47, 130, 25);
                    //添加边框
                    MyLineBorder myLineBorder = new MyLineBorder(new Color(192, 192, 192), 1 , true);//这一句
                    nameTextField.setBorder(myLineBorder);
                    Font font = new Font("某字体",Font.HANGING_BASELINE,15);
                    nameTextField.setFont(font);
                    this.add(nameTextField);[/code]
       这样就完成了圆角文本域,包括输入字体的大小还有风格。当然这样并不完美,我们只是在LineBorder上画了一个圆角的矩形而已,所以要想看起来比较满意,JFrame主面板上放置JTextField周围的区域颜色不要太深,以便能清楚看到圆角。
       那圆角按钮呢?我们上一篇讲过,一般组件都是通过重写JComponent里面的paintComponent(Graphics g)方法画出来的,所以圆角按钮也是如此。代码如下:
    package com.lgj.myPanel;
    import java.awt.AlphaComposite;
    import java.awt.Color;
    import java.awt.GradientPaint;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;
    import javax.swing.JComponent;
    /**
    * 基面板
    * @author Guijin.Liang
    *
    */
    public class MyBasicPanel extends JComponent{
            /**
             *
             */
            private static final long serialVersionUID = 1L;
           
            private int isRectOrIsRount;//方形还是圆角方形
           
            private Color fillColor;//填充颜色
            private Color borderColor;//边框颜色
           
            private int width;//宽度;
            private int height;//高度
           
            private int roundValue;//圆角值
           
            public MyBasicPanel(int width
                                      , int height
                                      , Color borderColor
                                      , Color fillColor
                                      , int roundValue
                                      , int isRectOrIsRound)
            {
                    this.width = width;
                    this.height = height;
                   
                    this.fillColor = fillColor;
                    this.borderColor = borderColor;
                    this.isRectOrIsRount = isRectOrIsRound;
                    this.roundValue = roundValue;
            }
           
        public void paintComponent(Graphics g){
           
            g.setColor(this.borderColor);
                   
                    if(this.isRectOrIsRount == 1){ //圆角方形
                        g.drawRoundRect(0, 0, this.width - 1, this.height - 1, this.roundValue, this.roundValue);
                    }else if(this.isRectOrIsRount == 0){ //方形
                            g.drawRect(0, 0, this.width - 1, this.height - 1);
                    }
                   
                    RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING,
                                                                   RenderingHints.VALUE_ANTIALIAS_ON);
                    Graphics2D g2 = (Graphics2D)g;
                    g2.addRenderingHints(rh);//消除锯齿
                    g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));//不透明
                    g2.setPaint(new GradientPaint(this.getWidth()/2
                                                          , 1
                                                          , new Color(255,255,255)
                                                  , this.getWidth()/2
                                                  , this.getHeight() -1
                                                  , this.fillColor));
                   
                    if(this.isRectOrIsRount == 1){//圆角方形
                        g2.fillRoundRect(1, 1, this.width - 2, this.height - 2, this.roundValue, this.roundValue);
                    }else if(this.isRectOrIsRount == 0){ //方形
                            g2.fillRect(1, 1, this.width - 2, this.height - 2);
                    }
        }
    }
                      [/code]
    这是一个基面板,我们只要继承他就OK了。代码如下:
    package com.lgj.button;
    import java.awt.Color;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import com.lgj.myPanel.MyBasicPanel;
    /**
    * 小按钮基类
    * @author Guijin.liang
    *
    */
    public class SmallButton extends MyBasicPanel
                             implements MouseListener{
            /**
             *
             */
            private static final long serialVersionUID = 1L;
           
           
            public SmallButton(int width, int height, Color borderColor,
                            Color fillColor, int roundValue, int isRectOrIsRound) {
                    super(width, height, borderColor, fillColor, roundValue, isRectOrIsRound);
                    this.addMouseListener(this);
            }
            @Override
            public void mouseClicked(MouseEvent e) {}
            @Override
            public void mouseEntered(MouseEvent e) {}
            @Override
            public void mouseExited(MouseEvent e) {}
            @Override
            public void mousePressed(MouseEvent e) {}
            @Override
            public void mouseReleased(MouseEvent e) {}
    }
                      [/code]
    为什么要写SmallButton这个类,而且也没做什么工作?因为后面按钮都继承自这个类,我们可以在此添加一些共有的属性和动作,接下来就是登录按钮的制作,代码如下:
    package com.lgj.button;
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.event.MouseEvent;
    /**
    * 登录按钮
    * @author Guijin.Liang
    *
    */
    public class OkButton extends SmallButton{
            /**
             * 构造函数
             * @param width 宽度
             * @param height 高度
             * @param borderColor 边框颜色
             * @param fillColor  填充颜色
             * @param roundValue 圆角大小
             * @param isRectOrIsRound 圆角还是不圆角(1为圆角,0为不圆角)
             */
            public OkButton(int width, int height, Color borderColor,
                            Color fillColor, int roundValue, int isRectOrIsRound) {
                    super(width, height, borderColor, fillColor, roundValue, isRectOrIsRound);
            }
            /**
             *
             */
            private static final long serialVersionUID = 1L;
            public void paintComponent(Graphics g)
            {
                    super.paintComponent(g);
                    g.setColor(new Color(0,0,0));
                Font font = new Font("某字体",Font.HANGING_BASELINE,14); //字体
                g.setFont(font);
                g.drawString("登    录", 10, 17);
            }
           
            public void mouseEntered(MouseEvent e) {
                   
                    //super.mouseEntered(e);
                    Graphics g = this.getGraphics();
                    g.setColor(new Color(255,0,0));
                Font font = new Font("某字体",Font.HANGING_BASELINE,14); //字体
                g.setFont(font);
                g.drawString("登    录", 10, 17);
            }
           
            public void mouseExited(MouseEvent e) {
           
                    //super.mouseExited(e);
                    Graphics g = this.getGraphics();
                    g.setColor(new Color(0,0,0));
                Font font = new Font("某字体",Font.HANGING_BASELINE,14); //字体
                g.setFont(font);
                g.drawString("登    录", 10, 17);
            }
    }
                      [/code]
    这样一个圆角的登录按钮就做好了,其他按钮也是同样继承自SmallButton类,然后在调用时传进不同参数就OK了,在JFrame调用代码:
    //登录按钮
                    OkButton loginBtn = new OkButton(70
                                             , 25
                                             , new Color(192,192,192)
                                             , new Color(240, 255, 240)
                                                     , 5
                                             , 1);
                    this.add(loginBtn);[/code]
    最小化还有关闭按钮也是画出来的,只不过是画一条直线还有一个X而已,然后边框颜色去掉就Ok了。
       
       

      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/11/16/000140531.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 08:00 , Processed in 0.295372 second(s), 36 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表