2010-01-13 21 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倍。

處理這一切接收到的數據是另一種努力,這就是爲什麼我一定把它發送到數據庫,而不是接受,說電子郵件或服務器目錄完全使用統計數據的文件。無論哪種方式,您將需要的東西來處理它,把它變成圖表或可分使用統計數據等。

相關問題