2010-01-13 44 views
24

在网站上收集每个网页的使用情况统计数据是常见的做法,我对类似的事情感兴趣,但对于GUI:s。您会看到Google Chrome(和其他人)收集使用情况统计信息,以便Google可以找出人们使用的功能,以便挖掘似乎“有用”的内容。是否有任何好的工具来查找GUI的使用统计信息,分解窗格和组件?

做到这一点的直接方式是明确记录与每个GUI元素的交互,但这既乏味又易于在缺少的GUI部分中出错。

所以我想知道,这是一个解决的问题?是否有任何可以提供类似于代码分析的摘要,每个组件细分的度量标准(访问次数,点击次数等)?自动添加到AWT/Swing组件的整个树中的所有组件?

该信息将需要归纳到一个文件,以便它可以被发送到“我们”的聚集和数据挖掘,以推动决策等

我真的不知道我想要什么,所以我也要求找出好的想法,以及其他人已经做了哪些事情来面对这个问题。

+1

一个优秀的问题,因为它表明你实际上在考虑可用性(很多程序员往往忽略)。一个更全面的解决方案将跟踪指针的运动,看看他们的鼠标悬停以获得解释。人们在可用性跟踪行为,眼睛注意力焦点和指针运动方面进行研究。 – BobMcGee 2010-01-14 14:33:33

回答

6

虽然这不是一个完整的解决方案,它可以帮助引导你更接近一些可行的。我同意以前的海报,可以在代码中添加钩子,这对大型项目来说变得难以管理。此外,如果您错过应用程序的一部分并检查数据,则每次用户使用该组件时都会有一个空白区域。

相反,您可以直接聆听到由在UI每个组件产生AWTEvent中。这可能很容易成为数据挖掘的源代码信息。下面的代码告诉你如何做到这一点:

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,以防有什么帮助。

+0

优秀的答案。 – Pindatjuh 2010-01-18 15:34:06

+0

那么如何从鼠标事件中点击哪个窗格? – 2014-07-31 09:46:08

0

NetbeansEclipse都具有收集UI统计信息的机制,但我不知道使用基于其平台的应用程序是多么容易。

0

嗯,据我所知,我从来没有见过任何一种使用统计自动收集Swing应用程序。

在我看来,实现这种功能的最简单方法是使用look'n'feel:这样,每个组件都将透明地关联到最合适的记录器(一个JCheckBox将被监听检查,而JSCrollBar会将其滚动记录)。

您可能会考虑询问Kirill Grouchnikov关于该功能,但我担心即使Substance也没有实现它。

2

那么,你会首先期望以某种方式接收使用统计。那么你打算让你的应用程序连接到数据库吗?你会有另一个应用程序来处理使用情况统计信息吗?总之,我会创造这样

无效LogUsage功能(该对象ID或网名/字幕文本等)

,并让该函数处理的处理统计使用所有的处理。当然,你需要做一些/某些工作,比如将这个函数添加到onClicks,编辑更改等,但这应该相当简单。特别是如果你的LogUsage函数只是采用一些独特的(如名称)并将其用于统计。

LogUsage功能还可以远程管理连接并清除自上次传输以来可能存储的任何缓存。

简而言之,如果您创建了一个接受该对象的LogUsage函数,并且您始终获取该名称。你可以只轻松地复制/粘贴此行整个程序

LogUsage(本);

编辑 -

我也注意到你正在寻找的建议:我会做什么,我上面说的;一个简单的LogUsage函数,它接受一个参数(如对象),并获取名称,例如 - btnLogin,然后将该名称处理为某种文件。您显然会首先将此文件加载到某种映射或数组中,然后检查它是否先存在。如果没有,只需点击一次(或使用)即可将其添加到列表中。如果存在,则增加其使用点。你显然不想在文本框等OnChange方法上调用LogUsage,但可能是所有的onFocus,Clicks,或者你真正想要跟踪的任何东西。

最后,你可能最终的东西,如btnLogin(5)被发送给您,这表明用户点击btnLogin 5倍。

处理这一切接收到的数据是另一种努力,这就是为什么我一定把它发送到数据库,而不是接受,说电子邮件或服务器目录完全使用统计数据的文件。无论哪种方式,您将需要的东西来处理它,把它变成图表或可分使用统计数据等。

相关问题