论坛首页 Java企业应用论坛

Swing界面优化进阶三

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

现在按钮及其功能已经有了,现在我们需要再做两点:
1、随心所欲的缩放改变窗体大小;
2,动态更换背景图片





缩放功能截图效果大家看起来不是很明显,所以还是直接上代码。代码是在Swing界面优化进阶二的基础上修改的,主要就是在鼠标事件中多修改了两个地方,所以这里就不放置重复代码了,只把改进的地方贴出来

// 这里大家需要注意,每个窗体的最小值,也就是下限需要给他判断一下,不然会缩小到看不见了
this.addMouseMotionListener(new MouseAdapter() {
			@Override
			public void mouseDragged(MouseEvent e) {
				// 右
				if (getCursor().getType() == Cursor.E_RESIZE_CURSOR) {
					setSize(e.getX(), getHeight());
					content.fixedButtonPoint();
				// 左
				} else if (getCursor().getType() == Cursor.W_RESIZE_CURSOR) {
					setSize(getWidth() - e.getX(), getHeight());
					setLocation(getLocationOnScreen().x + e.getX(), getLocationOnScreen().y);
					content.fixedButtonPoint();
				// 下
				} else if (getCursor().getType() == Cursor.S_RESIZE_CURSOR) {
					setSize(getWidth(), e.getY());
				// 上
				} else if (getCursor().getType() == Cursor.N_RESIZE_CURSOR) {
					setSize(getWidth(), getHeight() - e.getY());
					setLocation(getLocationOnScreen().x, getLocationOnScreen().y + e.getY());
				} else {
					Point p = getLocation();
					setLocation(p.x + e.getX() - point.x, p.y + e.getY() - point.y);
				}
			}
			@Override
			public void mouseMoved(MouseEvent e) {
				// 根据边界和鼠标坐标的对比来决定鼠标的样式
				// 这里范围大家实际考量,这里只是我自己写的一个范围,大家看看就好
				if (e.getX() == 0 || e.getX() == 1 || e.getX() == 2 
						|| e.getX() == 3 || e.getX() == 4 || e.getX() == 5) {
					setCursor(new Cursor(Cursor.W_RESIZE_CURSOR));
					
				} else if (e.getX() == getWidth() || e.getX() == getWidth()-1 || e.getX() == getWidth()-2 
						|| e.getX() == getWidth()-3 || e.getX() == getWidth()-4 || e.getX() == getWidth()-5) {
					setCursor(new Cursor(Cursor.E_RESIZE_CURSOR));
					
				} else if (e.getY() == 0 || e.getY() == 1 || e.getY() == 2 
						|| e.getY() == 3 || e.getY() == 4 || e.getY() == 5) {
					setCursor(new Cursor(Cursor.N_RESIZE_CURSOR));
					
				} else if (e.getY() == getHeight() || e.getY() == getHeight()-1 || e.getY() == getHeight()-2 
						|| e.getY() == getHeight()-3 ||e.getY() == getHeight()-4 || e.getY() == getHeight()-5) {
					setCursor(new Cursor(Cursor.S_RESIZE_CURSOR));
					
				} else {
					setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
				}
			}
		});


在进阶一,大家看到我在new Jpanel的时候直接给他绘制了一个背景,这肯定是不够完美的,下面我们来看看动态更换背景图片,这个类似于QQ换肤的效果,个人认为算得上是一个亮点。

进阶一中,着重讲解了一下paintComponent方法的作用,以及repaint方法,大家可能已经发现,既然paintComponent的作用是负责绘制组件,那么不管是否动态,绘制的时候一定是要调用paintComponent方法的,所以大家明白了,repaint方法要派上大用场了。

好了,不啰嗦了,给大家看看效果图











上代码:
大家这里注意一下,为了能随时调用paintComponent方法,所以我们需要继承Jpanel来定义我们自己的panel
package course;

import java.awt.Cursor;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;

/**
 * Swing界面优化示例
 * @author SongFei
 * @date 2015年5月17日
 */
public class Demo1 extends JFrame {

	private DemoPanel content;
	private Point point = new Point();

	public Demo1() {
		initGUI();
		initListener();
	}
	
	/**
	 * 初始化界面
	 */
	private void initGUI() {
		setSize(450, 350);
		setTitle("course");
		// 去边框
		setUndecorated(true);
		// 初始化自定义panel时需要将自己带过去,因为设置大小之类的操作需要用到
		content = new DemoPanel(this);
		// 加入到容器
		// 大家这里注意一下
		// 虽然getContentPane()取出来的容器,我们可以直接进行操作,但是有可能涉及到重绘什么的,
		// 所以还是再将我们自定义的一层panel覆盖上比较好,操作自己的东西是可控的
		getContentPane().add(content);
	}

	/**
	 * 初始化鼠标事件
	 */
	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) {
				// 右
				if (getCursor().getType() == Cursor.E_RESIZE_CURSOR) {
					setSize(e.getX(), getHeight());
					content.fixedButtonPoint();
				// 左
				} else if (getCursor().getType() == Cursor.W_RESIZE_CURSOR) {
					setSize(getWidth() - e.getX(), getHeight());
					setLocation(getLocationOnScreen().x + e.getX(), getLocationOnScreen().y);
					content.fixedButtonPoint();
				// 下
				} else if (getCursor().getType() == Cursor.S_RESIZE_CURSOR) {
					setSize(getWidth(), e.getY());
				// 上
				} else if (getCursor().getType() == Cursor.N_RESIZE_CURSOR) {
					setSize(getWidth(), getHeight() - e.getY());
					setLocation(getLocationOnScreen().x, getLocationOnScreen().y + e.getY());
				} else {
					Point p = getLocation();
					setLocation(p.x + e.getX() - point.x, p.y + e.getY() - point.y);
				}
			}
			@Override
			public void mouseMoved(MouseEvent e) {
				// 根据边界和鼠标坐标的对比来决定鼠标的样式
				// 这里范围大家实际考量,这里只是我自己写的一个范围,大家看看就好
				if (e.getX() == 0 || e.getX() == 1 || e.getX() == 2 
						|| e.getX() == 3 || e.getX() == 4 || e.getX() == 5) {
					setCursor(new Cursor(Cursor.W_RESIZE_CURSOR));
					
				} else if (e.getX() == getWidth() || e.getX() == getWidth()-1 || e.getX() == getWidth()-2 
						|| e.getX() == getWidth()-3 || e.getX() == getWidth()-4 || e.getX() == getWidth()-5) {
					setCursor(new Cursor(Cursor.E_RESIZE_CURSOR));
					
				} else if (e.getY() == 0 || e.getY() == 1 || e.getY() == 2 
						|| e.getY() == 3 || e.getY() == 4 || e.getY() == 5) {
					setCursor(new Cursor(Cursor.N_RESIZE_CURSOR));
					
				} else if (e.getY() == getHeight() || e.getY() == getHeight()-1 || e.getY() == getHeight()-2 
						|| e.getY() == getHeight()-3 ||e.getY() == getHeight()-4 || e.getY() == getHeight()-5) {
					setCursor(new Cursor(Cursor.S_RESIZE_CURSOR));
					
				} else {
					setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
				}
			}
		});
	}
	
	public static void main(String[] args) {
		Demo1 demo1 = new Demo1();
		demo1.setVisible(true);
		demo1.setLocationRelativeTo(null);
	}

}



package course;

import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/**
 * 自定义Jpanel
 * 为了动态调用其paintComponent方法
 * @author SongFei
 * @date 2015年5月18日
 */
public class DemoPanel extends JPanel {

	private JLabel minButton;
	private JLabel maxButton;
	private JLabel exitButton;
	private JFrame frame;
	
	private JButton backButton1;
	private JButton backButton2;
	private JButton backButton3;
	private JButton backButton4;
	private JButton backButton5;
	
	private ImageIcon imageIcon;
	
	public DemoPanel(JFrame frame) {
		this.frame = frame;
		initGUI();
		initListener();
		// 给imageIcon指定默认图片
		imageIcon = produceImage("back0.png");
	}
	
	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.drawImage(imageIcon.getImage(), 0, 0, getWidth(), getHeight(), null);
	}
	
	/**
	 * 初始化界面
	 */
	private void initGUI() {
		setLayout(null);
		
		minButton = new JLabel();
		minButton.setBounds(357, 0, 31, 20);
		minButton.setIcon(produceImage("min.png"));
		add(minButton);
		
		maxButton = new JLabel();
		maxButton.setBounds(383, 0, 31, 20);
		maxButton.setIcon(produceImage("max.png"));
		add(maxButton);

		exitButton = new JLabel();
		exitButton.setBounds(411, 0, 39, 20);
		exitButton.setIcon(produceImage("close.png"));
		add(exitButton);
		
		backButton1 = new JButton("背景1");
		backButton1.setBounds(170, 25, 100, 45);
		add(backButton1);
		backButton2 = new JButton("背景2");
		backButton2.setBounds(170, 90, 100, 45);
		add(backButton2);
		backButton3 = new JButton("背景3");
		backButton3.setBounds(170, 155, 100, 45);
		add(backButton3);
		backButton4 = new JButton("背景4");
		backButton4.setBounds(170, 220, 100, 45);
		add(backButton4);
		backButton5 = new JButton("背景5");
		backButton5.setBounds(170, 285, 100, 45);
		add(backButton5);
	}

	/**
	 * 初始化监听
	 */
	private void initListener() {
		// 最小化按钮事件
		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) {
				frame.setExtendedState(Frame.ICONIFIED);
			}
		});
		// 最大化按钮事件
		maxButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseExited(MouseEvent e) {
				if (frame.getExtendedState() != Frame.MAXIMIZED_BOTH) {
					maxButton.setIcon(produceImage("max.png"));
				} else {
					maxButton.setIcon(produceImage("restore.png"));
				}
			}
			@Override
			public void mouseEntered(MouseEvent e) {
				if (frame.getExtendedState() != Frame.MAXIMIZED_BOTH) {
					maxButton.setIcon(produceImage("max_active.png"));
				} else {
					maxButton.setIcon(produceImage("restore_active.png"));
				}
			}
			@Override
			public void mouseReleased(MouseEvent e) {
				// 若是最大化过了,就直接还原大小
				if (frame.getExtendedState() == Frame.MAXIMIZED_BOTH) {
					frame.setSize(450, 350);// 还原大小
					frame.setLocationRelativeTo(null);// 这里需要重新设置坐标
					maxButton.setIcon(produceImage("max.png"));
				} else {
					frame.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);
			}
		});
		
		backButton1.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseReleased(MouseEvent e) {
				backButton1.setText(backButton1.getText()+"-我被选中啦");
				imageIcon = produceImage("back0.png");
				// 重点:此方法会去调用paintComponent()方法来进行绘制工作
				repaint();
			}
		});
		backButton2.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseReleased(MouseEvent e) {
				imageIcon = produceImage("back1.png");
				repaint();
			}
		});
		backButton3.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseReleased(MouseEvent e) {
				imageIcon = produceImage("back2.jpg");
				repaint();
			}
		});
		backButton4.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseReleased(MouseEvent e) {
				imageIcon = produceImage("back3.jpg");
				repaint();
			}
		});
		backButton5.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseReleased(MouseEvent e) {
				imageIcon = produceImage("back4.jpg");
				repaint();
			}
		});
	}
	
	/**
	 * 获取图片
	 * @param name 图片名称
	 * @return
	 */
	private ImageIcon produceImage(String name) {
		ImageIcon backImage = new ImageIcon(getClass().getClassLoader().getResource(name));
		return backImage;
	}
	
	/**
	 * 按比例放置按钮,不管放大还是缩小窗体,按钮永远在右上角
	 */
	public void fixedButtonPoint() {
		// 里面这些39、28的数字是自己的算法比例
		minButton.setBounds(frame.getWidth()-39-28-28, 0, 31, 20);
		maxButton.setBounds(frame.getWidth()-39-28, 0, 31, 20);
		exitButton.setBounds(frame.getWidth()-39, 0, 39, 20);
	}
	
}

好了,讲解完毕,到这里基本上一个漂亮的Swing界面就做好了,大家还觉着Swing做不出来好看的界面么?

代码我已经打包上传了,环境没问题的话,大家下载之后就可以直接运行看到效果了。如果大家有什么没弄明白的问题或者发现我还有什么遗漏的地方,欢迎与我联系交流,我也还有很多不明白的地方请教大家(新公司没网络,可能不能及时回答大家的问题,大家不要介意,看到了一定立即回复)
QQ:1347384268
人生格言:谁若真心待我,我必拿命珍惜
  • 大小: 96.2 KB
  • 大小: 120.1 KB
  • 大小: 79.9 KB
  • 大小: 31.8 KB
  • 大小: 176.3 KB
  • 大小: 88.4 KB
  • 大小: 78.7 KB
论坛首页 Java企业应用版

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