使用的教材是java核心技术卷1,我将跟着这本书的章节同时配合视频资源来进行学习基础java知识。
如果你看过Swing窗口,肯定想知道它的设计者如何把组件摆放得如此恰到好处,可以查看它的内容。按下Ctrl+Shift+Fl得到所有组件的层次结构输出:
如果设计你自己的定制Swing组件,但组件没能正确显示,你肯定很高兴有一个Swing图形化调试器。即使你没有写自己的组件类,能直观地看到如何绘制组件内容也是很有趣的。
可以使用JComponent类的setDebugGraphicsOptions方法打开对一个Swing组件的调试。有以下几个选项。
我们发现,要让闪烁选项起作用,必须禁用“双缓冲”—这是Swing更新窗口时为减少闪烁所用的策略。打开闪烁选项的魔咒是:
RepaintManager.currentManager(getRootPane()).setDoubleBufferingEnabled(false);
((JComponent) getContentPane()).setDebugCraphicsOptions(DebugCraphics.FLASH.OPTION);
只需要把这些代码行放在feme窗口构造器的末尾。程序运行时,你将看到会用慢动作填充内容窗格。或者,对于更本地化的调试,只需要为组件调用setDebugGraphicsOpticms。“控制狂人”可能还会设置闪烁的时间段、次数和颜色—详细信息参见DebugGmphics类的在线文档。
如果希望得到GUI应用中生成的每一个AWT事件的记录,可以在发出事件的每一个组件中安装一个监听器。利用反射,可以很容易地自动完成这个工作。下面给出了EventTracer类。
要查看消息,可以把希望跟踪事件的组件增加到一个事件跟踪器:
EventTracer tracer = newEventTracer();
tracer.add(frame);
这样一来,就可以得到所有事件的一个文本描述,如图。
Robot类可以向任何AWT程序发送按键和鼠标点击事件。这个类就是用来自动测试用户界面的。要得到一个机器人,首先需要得到一个GraphicsDevice对象。可以通过以下调用序列得到默认的屏幕设备:
GraphicsEnvironment environment = GraphicsEnvironment.getlocalGraphicsEnvironment();
GraphicsDevice screen = environinent.getDefaultScreenDevice():
然后构造一个机器人:
Robotro bot=new Robot(screen);
若要发送一个按键事件,需告知机器人模拟按下和松开按键:
robot.keyPress(KeyEvent.VK_TAB):
robot.keyRelease(KeyEvent.VK.TAB);
对于鼠标点击事件,首先需要移动鼠标,然后按下再释放鼠标按钮:
robot.mouseMove(x,y);//x and y are absolute screen pixel coordinates,
robot.nousePress(InputEvent.BUTTONl_MASK);
robot.mouseRelease(InputEvent.BUTTON1_MASK);
我们的思路是首先模拟按键和鼠标输入,然后截屏来查看应用是否完成了它该完成的工作。截屏需要使用createScreenCapture方法:
Rectangle rect = new Rectangle(x,y,width,height);
Bufferedlmage image=robot.createScreenCapture(rect):
矩阵坐标也指示绝对屏幕像素。最后,通常我们都希望在机器人指令之间增加一个很小的延迟,使应用能跟得上。可以使用delay方法并提供延迟时间(毫秒数)。例如:
robot.delay(1000);//delay by 1000 milliseconds
下面的程序显示了如何使用机器人。首先,按下空格键激活最左边的按钮。然后机器人会等待两秒,以便你能看到它做了什么。这个延迟之后,机器人会模拟按下Tab键和再按一次空格键,来点击下一个按钮。最后,它会模拟用鼠标点击第3个按钮。(要按下按钮,可能需要调整程序的x和y坐标。)程序的最后会截屏,并在另一个frame窗口中显示。
从这个例子可以看到,单凭Robot类本身并不能方便地测试用户界面。实际上,这只是一个基本构建模块,可以作为测试工具的一个基础部分。专业的测试工具可以捕获、存储和重放用户交互场景,并得到组件在屏幕上的位置,这样就不用猜测鼠标点击的位置了。