论坛首页 Java企业应用论坛

画出你的Swing界面(二)

浏览 9427 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-07-02   最后修改:2011-07-02

截图在后面附件

 

鉴于之前看到很多高手们,都喜欢做登陆界面来做某方面的学习,所以为紧跟大众趋势不落单,本人也做了一个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);
	}
}

 

 

这样就实现了文本域的圆角。我们只要添加到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);

 

这样就完成了圆角文本域,包括输入字体的大小还有风格。当然这样并不完美,我们只是在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);
		}
    }
}

 

 

这是一个基面板,我们只要继承他就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) {}
}

 

 

为什么要写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);
	}
}
 

 

这样一个圆角的登录按钮就做好了,其他按钮也是同样继承自SmallButton类,然后在调用时传进不同参数就OK了,在JFrame调用代码:

 

//登录按钮
		OkButton loginBtn = new OkButton(70
                                         , 25
                                         , new Color(192,192,192)
                                         , new Color(240, 255, 240)
		                                 , 5
                                         , 1);
                this.add(loginBtn);
 

 

最小化还有关闭按钮也是画出来的,只不过是画一条直线还有一个X而已,然后边框颜色去掉就Ok了。

 

后面会奉上源代码和截图,希望喜欢Swing的坛友们多多交流,一切权当学习。

  • 大小: 25.8 KB
   发表时间:2011-07-04  
一直比较喜欢swing
0 请登录后投票
   发表时间:2011-07-04  
兄台,能给我介绍点SWING开发的资料吗
0 请登录后投票
   发表时间:2011-07-04  
我得邮箱liuxiang00435057@163.com,在此先谢过了,对了,老兄如果有兴趣,对JInternalFrame重画下,也九是 SWING 的MDI
0 请登录后投票
   发表时间:2011-07-04  
hoton 写道
一直比较喜欢swing

有Swing相关的职位么,哈哈,如果有,推荐一下
0 请登录后投票
   发表时间:2011-07-04  
哥,顶你一个
0 请登录后投票
   发表时间:2011-07-04  
003 写道
hoton 写道
一直比较喜欢swing

有Swing相关的职位么,哈哈,如果有,推荐一下


你这薪水的职位不好找
0 请登录后投票
   发表时间:2011-07-04  
liuxiang00435057 写道
兄台,能给我介绍点SWING开发的资料吗

木有资料啊,都直接看API写的程序。网上找找看吧。
0 请登录后投票
   发表时间:2011-07-04  
我看了下你的这个对话框,逆是基于JFRAME,不是基于JDIALOG的,呵呵
0 请登录后投票
   发表时间:2011-07-04  
看完兄台的两篇帖子.我也写了一个画印章的小玩意.
但是javaeye改版后,不知道怎么发到论坛了,就留在自己博客了.
http://i2534.iteye.com/blog/1113965
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics