浏览 6769 次
锁定老帖子 主题:Swing界面优化进阶三
精华帖 (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 人生格言:谁若真心待我,我必拿命珍惜 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |