锁定老帖子 主题:画出你的Swing界面(二)
精华帖 (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的坛友们多多交流,一切权当学习。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-07-04
一直比较喜欢swing
|
|
返回顶楼 | |
发表时间:2011-07-04
兄台,能给我介绍点SWING开发的资料吗
|
|
返回顶楼 | |
发表时间:2011-07-04
我得邮箱liuxiang00435057@163.com,在此先谢过了,对了,老兄如果有兴趣,对JInternalFrame重画下,也九是 SWING 的MDI
|
|
返回顶楼 | |
发表时间:2011-07-04
hoton 写道 一直比较喜欢swing
有Swing相关的职位么,哈哈,如果有,推荐一下 |
|
返回顶楼 | |
发表时间:2011-07-04
哥,顶你一个
|
|
返回顶楼 | |
发表时间:2011-07-04
003 写道 hoton 写道 一直比较喜欢swing
有Swing相关的职位么,哈哈,如果有,推荐一下 你这薪水的职位不好找 |
|
返回顶楼 | |
发表时间:2011-07-04
liuxiang00435057 写道 兄台,能给我介绍点SWING开发的资料吗
木有资料啊,都直接看API写的程序。网上找找看吧。 |
|
返回顶楼 | |
发表时间:2011-07-04
我看了下你的这个对话框,逆是基于JFRAME,不是基于JDIALOG的,呵呵
|
|
返回顶楼 | |
发表时间:2011-07-04
看完兄台的两篇帖子.我也写了一个画印章的小玩意.
但是javaeye改版后,不知道怎么发到论坛了,就留在自己博客了. http://i2534.iteye.com/blog/1113965 |
|
返回顶楼 | |