论坛首页 Java企业应用论坛

Swing界面优化进阶二

浏览 4931 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2015-05-17   最后修改:2015-05-18
承接此贴:
http://www.iteye.com/topic/1137293
http://www.iteye.com/topic/1138087

背景有了,那我们是否注意到右上角的按钮以及他的边框,这些地方还是需要优化、

边框修饰,我们需要考虑几点:
第一,我们需要将原始的边框去掉;
第二,去掉原始边框之后,右上角按钮没有了;
第三,去掉边框之后,拖动窗体的功能没有了;

去边框,java已经提供了一个现成的方法setUndecorated(true),此方法可以将上下左右的边框去掉,只显示出中间区域



代码:大家这里注意下,截图里面说的有点问题,不好意思,主窗体可以使用exit_on_close,这个取决于用户需要一般是可以由用户设置的,但是在聊天的窗体上,那就一定不能加上exit了,否则会将整个程序都关掉



边框去掉了,我们来加上按钮,以及每个按钮的功能



这里按钮放大缩小功能截图看不了,我直接给大家看代码:
public class Demo1 extends JFrame {

	private JPanel content;
	private JLabel minButton;
	private JLabel maxButton;
	private JLabel exitButton;
	private Point point = new Point();

	public Demo1() {
		initGUI();
		initListener();
	}
	
	/**
	 * 初始化界面
	 */
	private void initGUI() {
		setSize(450, 350);
		setTitle("course");
		// 去边框
		setUndecorated(true);
//		// 去边框了,这句就可以不要了
//		setDefaultCloseOperation(EXIT_ON_CLOSE);
		// 原生态
//		content = new JPanel();
		// 重写里面的paintComponent方法
		content = new JPanel() {
			@Override
			protected void paintComponent(Graphics g) {
				// 这一句可以清除之前绘制的图像,在这个例子中看不出来效果,若是java做画图板的程序就能看出来
				super.paintComponent(g);
		 		// 此方法有很多种,看的眼花缭乱,了解参数了就好多了,这里说一下基本的
				// 1:image对象
				// 2:重绘的起始横坐标
				// 3:重绘的起始纵坐标
				// 4:重绘的宽度
				// 5:重绘的高度
				// 6:一个实现ImageObserver 接口的对象。它将该对象登记为一个图像观察者,因此当图像的任何新信息可见时它被通知。大多组件可以简单的指定this或null
				//	    组件可以指定this作为图像观察者的原因是Component类实现了ImageObserver接口。当图像数据被加载时它的实现调用repaint方法
				g.drawImage(produceImage("back0.png").getImage(), 0, 0, getWidth(), getHeight(), null);
			}
		};
		content.setLayout(null);
		getContentPane().add(content);
		
		minButton = new JLabel();
		minButton.setBounds(357, 0, 31, 20);
		minButton.setIcon(produceImage("min.png"));
		content.add(minButton);
		
		maxButton = new JLabel();
		maxButton.setBounds(383, 0, 31, 20);
		maxButton.setIcon(produceImage("max.png"));
		content.add(maxButton);

		exitButton = new JLabel();
		exitButton.setBounds(411, 0, 39, 20);
		exitButton.setIcon(produceImage("close.png"));
		content.add(exitButton);
	}

	/**
	 * 初始化鼠标事件
	 */
	private void initListener() {
		// 窗体事件,用于拖动窗体位置
		this.addMouseListener(new MouseAdapter() {
			@Override
			public void mousePressed(MouseEvent e) {
				point.x = e.getX();
				point.y = e.getY();
			}
		});
		this.addMouseMotionListener(new MouseAdapter() {
			@Override
			public void mouseDragged(MouseEvent e) {
				Point p = getLocation();
				setLocation(p.x + e.getX() - point.x, p.y + e.getY() - point.y);
			}
		});
		// 最小化按钮事件
		minButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseExited(MouseEvent e) {
				minButton.setIcon(produceImage("min.png"));
			}
			@Override
			public void mouseEntered(MouseEvent e) {
				minButton.setIcon(produceImage("min_active.png"));
			}
			@Override
			public void mouseReleased(MouseEvent e) {
				setExtendedState(Frame.ICONIFIED);
			}
		});
		// 最大化按钮事件
		maxButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseExited(MouseEvent e) {
				if (getExtendedState() != Frame.MAXIMIZED_BOTH) {
					maxButton.setIcon(produceImage("max.png"));
				} else {
					maxButton.setIcon(produceImage("restore.png"));
				}
			}
			@Override
			public void mouseEntered(MouseEvent e) {
				if (getExtendedState() != Frame.MAXIMIZED_BOTH) {
					maxButton.setIcon(produceImage("max_active.png"));
				} else {
					maxButton.setIcon(produceImage("restore_active.png"));
				}
			}
			@Override
			public void mouseReleased(MouseEvent e) {
				// 若是最大化过了,就直接还原大小
				if (getExtendedState() == Frame.MAXIMIZED_BOTH) {
					setSize(450, 350);// 还原大小
					setLocationRelativeTo(null);// 这里需要重新设置坐标
					maxButton.setIcon(produceImage("max.png"));
				} else {
					setExtendedState(Frame.MAXIMIZED_BOTH);
					maxButton.setIcon(produceImage("restore.png"));
				}
				// 按比例放置按钮
				fixedButtonPoint();
			}
		});
		// 退出按钮事件
		exitButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseExited(MouseEvent e) {
				exitButton.setIcon(produceImage("close.png"));
			}
			@Override
			public void mouseEntered(MouseEvent e) {
				exitButton.setIcon(produceImage("close_active.png"));
			}
			@Override
			public void mouseReleased(MouseEvent e) {
				System.exit(0);
			}
		});
	}

	/**
	 * 按比例放置按钮,不管放大还是缩小窗体,按钮永远在右上角
	 */
	private void fixedButtonPoint() {
		// 里面这些39、28的数字是自己的算法比例
		minButton.setBounds(getWidth()-39-28-28, 0, 31, 20);
		maxButton.setBounds(getWidth()-39-28, 0, 31, 20);
		exitButton.setBounds(getWidth()-39, 0, 39, 20);
	}
	
	/**
	 * 获取图片
	 * @param name 图片名称
	 * @return
	 */
	private ImageIcon produceImage(String name) {
		ImageIcon backImage = new ImageIcon(getClass().getClassLoader().getResource(name));
		return backImage;
	}
	
	public static void main(String[] args) {
		Demo1 demo1 = new Demo1();
		demo1.setVisible(true);
		demo1.setLocationRelativeTo(null);
	}

}

代码大家可以前去 进阶三 下载,欢迎大家多多与我交流沟通。
  • 大小: 85.6 KB
  • 大小: 852.6 KB
  • 大小: 96.2 KB
   发表时间:2015-05-20  
小湿妹,牛逼啊
0 请登录后投票
   发表时间:2015-05-20  
eric_hwp 写道
小湿妹,牛逼啊


哎哟喂,我的个神,这都能被你认出来
0 请登录后投票
   发表时间:2015-05-22  
有很多线程的也很好看的哦:http://www.oschina.net/p/beautyeye
0 请登录后投票
   发表时间:2015-05-24  
15000346240 写道
有很多线程的也很好看的哦:http://www.oschina.net/p/beautyeye


是的,这个很漂亮,我之前有用过
0 请登录后投票
论坛首页 Java企业应用版

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