TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
鉴于之前看到很多高手们,都喜欢做登陆界面来做某方面的学习,所以为紧跟大众趋势不落单,本人也做了一个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 |
|