在网站上收集每个网页的使用情况统计数据是常见的做法,我对类似的事情感兴趣,但对于GUI:s.您会看到谷歌浏览器(和其他人)收集使用情况统计数据,以便谷歌可以找出人们使用的功能,以便对数据进行数据挖掘.
一种直接的方法是明确记录与每个GUI元素的交互,但这既繁琐又容易出现GUI缺失部分的错误.
所以我想知道,这是一个解决的问题吗?是否存在可以提供类似于每个组件细分的代码分析,指标(访问次数,点击次数等)的摘要?自动添加到整个AWT/Swing组件树中的所有组件?
此信息需要汇总到一个文件中,以便可以将其发送给"我们"进行聚合和数据挖掘,以推动决策等.
我真的不知道我到底想要什么,所以我也要求找出好的想法和其他人所面对的这个问题.
虽然这不是一个完整的解决方案,但它可能有助于指导您更接近可行的事情.我同意上一张海报,可以在代码中添加钩子,这在大型项目中变得无法管理.此外,如果您错过了应用程序的一部分并开始检查数据,则每次用户使用该组件时都会有一个空白区域.
相反,您可以直接监听由UI中的每个组件生成的AWTEvents.这很容易成为数据挖掘的源信息.以下代码显示了如何完成此操作:
package awteventlistenerexample; import java.awt.AWTEvent; import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.FlowLayout; import java.awt.Toolkit; import java.awt.event.AWTEventListener; import java.awt.event.ActionEvent; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class Test { private static final String ACTION_CLOSE = "Close"; private JFrame frame; public Test() { frame = new JFrame(); initActions(); frame.setLayout(new BorderLayout()); frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { frame.getRootPane().getActionMap().get(ACTION_CLOSE).actionPerformed(null); } }); JPanel content = new JPanel(new FlowLayout()); content.add(new JLabel("Creature")); JButton badger = new JButton("Badger"); badger.setName("badger"); JButton ferret = new JButton("Ferret"); ferret.setName("ferret"); JButton stoat = new JButton("Stoat"); stoat.setName("stoat"); content.add(badger); content.add(ferret); content.add(stoat); frame.add(content, BorderLayout.CENTER); JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); JButton close = new JButton(frame.getRootPane().getActionMap().get(ACTION_CLOSE)); buttonPanel.add(close); frame.add(buttonPanel, BorderLayout.SOUTH); frame.setSize(200, 150); frame.pack(); frame.setLocationByPlatform(true); frame.setVisible(true); } private void initActions() { Action close = new AbstractAction("Close") { public void actionPerformed(ActionEvent e) { frame.dispose(); } }; frame.getRootPane().getActionMap().put(ACTION_CLOSE, close); } public static void main(String args[]) { // Attach listener to AWTEvents (Mouse Events) Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() { public void eventDispatched(AWTEvent event) { if (event instanceof MouseEvent) { MouseEvent m = (MouseEvent) event; if (m.getID() == MouseEvent.MOUSE_CLICKED) { System.out.println(m.toString()); } } } }, AWTEvent.MOUSE_EVENT_MASK); EventQueue.invokeLater(new Runnable() { public void run() { new Test(); } }); } }
在这种情况下,我听了鼠标事件.这些似乎是最有用的,因为它们可以告诉您用户点击了什么.从这里开始,您需要找出需要收集的内容,以便建立用户点击内容的图片.我也会对用户没有点击的内容感兴趣.
围绕使用此技术的自动UI测试有很多工作要做.Abbot和FEST是我用过的例子.您可能希望了解它们如何处理AWTEvents以防有任何有用的东西.