【Swing 8】多个组件移动
上次介绍了单个按钮的拖动原理,今天来个联合作战,实现之前一直以为要制造监听器
的误区,加到各个组件上,结果昨天深夜偶然想出了解决方法。而且是超级简单的那种,唉
! 有时候,想多了真不见得是好事。
单个组件地拖动: http://www.cnblogs.com/Ruby517/p/6507001.html
其实要让多个组件都能响应拖动事件。那么给它们写一个带有拖动方法的父类即可。
这次,我们把源代码分成几个类文件, 以后其它要用到图形界面的就可以直接调用了,不
过,在此之前,先解决一个问题。由于JFrame类的add()方法只能添加JComponent类的对
象,所以我们在定义好各组件的类后,要返回组件(JComponent)自身。目前只想到一个解
决方法, 就是定义一个返回值的函数;
当然,对于使用JFrame类的Gui类来说, 它不用被别人添加, 所以除了返回JFrame, 来
使用JFrame 从父类继承的方法外(JComponent类的方法),还有就是覆盖其父类的方法, 比
如setSize(); setText()等。缺点就是要覆盖的方法TM多, 所以只能覆盖几个常用的。
1. 这是第一种方法, 比较简单
2.方法二比较麻烦,只覆盖了几个常用的方法, 写出来让大家参考参考:
1 package demo; 2 3 import java.awt.*; 4 import javax.swing.*; 5 import java.awt.event.*; 6 7 public class Gui { 8 JFrame f; 9 public Gui() { 10 f = new JFrame(); 11 f.setSize(800, 600); 12 screenCentered(); 13 } 14 public Gui(String title) { 15 this(); // this()用于调用其它构造函数, 如有参数则带参 16 f.setTitle(title); 17 } 18 public void screenCentered() { 19 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 20 int screenW = screenSize.width; 21 int screenH = screenSize.height; 22 int frameW = f.getWidth(); 23 int frameH = f.getHeight(); 24 f.setLocation(screenW / 2 - frameW / 2, screenH / 2 - frameH / 2); 25 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 26 f.setVisible(true); 27 } 28 public void setLayout(LayoutManager manger) { 29 f.setLayout(manger); 30 } 31 public void set(int width, int height) { 32 f.setSize(width, height); 33 screenCentered(); // 因为重设了窗口大小, 所以要读取新的尺寸去使窗口居中 34 } 35 public void add(JComponent component) { 36 f.add(component); 37 f.validate(); // 或用f.setVisible(true), add()新组件然后立即刷新 38 } 39 public void add(String location, JComponent component) { 40 f.add(location, component); 41 f.validate(); 42 } 43 }