your technologies license kit descargar cost java user-interface profiling

java - technologies - ¿Hay alguna buena herramienta para encontrar estadísticas de uso de GUI, paneles desglosados y componentes?



your kit profiler (4)

La recopilación de estadísticas de uso por página web en sitios es una práctica común; me interesa algo similar, pero para GUI: s. Verá que Google Chrome (y otros) recopilan estadísticas de uso para que Google pueda descubrir qué características usan las personas, para extraer datos que parecen "funcionar".

Una manera directa de hacerlo es registrar explícitamente la interacción con cada elemento de la GUI, pero eso es tedioso y propenso a errores en las partes faltantes de la GUI.

Entonces, ¿qué me pregunto si este es un problema resuelto? ¿Hay algo existente que pueda proporcionar un resumen similar al perfil del código, las métricas (número de visitas, clics, etc.) desglosadas por componente? ¿Se agregó automáticamente a todos los componentes en todo el árbol de los componentes AWT / Swing?

Esta información debería resumirse en un archivo para que pueda enviarse a "nosotros" para la agregación y la extracción de datos, para impulsar decisiones, etc.

Realmente no sé exactamente lo que quiero, así que también estoy pidiendo que descubra buenas ideas y lo que otras personas han hecho que se han enfrentado a este problema.


Bueno, hasta donde sé, nunca he visto ningún tipo de recopilación automática de estadísticas de uso para las aplicaciones Swing.

En mi opinión, la forma más fácil de implementar una característica de este tipo sería usar look''n''feel: de esta forma, cada componente se asociará de forma transparente con los registradores que mejor se adapten (se escuchará una JCheckBox para verificaciones, mientras que una JSCrollBar tendría su desplazamiento registrado).

Puede pensar en preguntarle a Kirill Grouchnikov sobre esa característica, pero me temo que incluso Substance no lo implementa.


Bueno, primero esperarías recibir las estadísticas de uso de alguna manera. Entonces, ¿vas a tener tu aplicación conectada a una base de datos? ¿Va a tener otra aplicación que procese las estadísticas de uso? En resumen, crearía una función como esta

void LogUsage (esta identificación de objeto o nombre de manejador / texto de leyenda, etc.)

y deja que esa función maneje todo el procesamiento del manejo del uso estadístico. Por supuesto, tendrá que hacer / algo / tipo de trabajo como agregar esta función a onClicks, editar cambios, etc., pero eso debería ser bastante simple. Especialmente si su función LogUsage simplemente toma algo único (como el nombre) y lo usa para las estadísticas.

La función LogUsage también puede administrar la conexión de forma remota y borrar cualquier caché que pueda haber almacenado desde su última transmisión.

En pocas palabras, si creó una función LogUsage que acepta el objeto, y siempre agarra el nombre. Podrías simplemente copiar / pegar esta línea en tu programa

LogUsage (esto);

Editar-

También noté que estás buscando sugerencias: haría lo que dije arriba; una función de LogUsage simple que acepta un parámetro como el objeto y toma el nombre, por ejemplo, btnLogin, y luego lo procesa en algún tipo de archivo. Obviamente, primero deberías cargar este archivo en algún tipo de mapa o matriz, verifica si existe primero. Si no, lo agrega a la lista con 1 clic (o uso). Si existe, incrementa su punto de uso. Obviamente, no querrá llamar a LogUsage en el método OnChange en un cuadro de texto, etc., pero probablemente todos enFocus, Clics o lo que sea que realmente desee hacer un seguimiento.

Al final, puede terminar con algo como btnLogin (5) que se le envía, lo que indica que el usuario hizo clic en btnLogin 5 veces.

Manejar todos estos datos recibidos es otra tarea, y es por eso que definitivamente la enviaría a una base de datos en lugar de recibirla, por ejemplo, un correo electrónico o un directorio de servidores lleno de archivos de estadísticas de uso. De cualquier manera, necesitará algo para procesarlo y convertirlo en gráficos o estadísticas de uso ordenables, etc.


Si bien esta no es una solución completa, podría ayudarlo a estar más cerca de algo viable. Estoy de acuerdo con el cartel anterior, que es posible agregar ganchos en su código, esto se vuelve inmanejable en un proyecto grande. Además, si omite una parte de la aplicación y viene a examinar los datos, tendrá un espacio en blanco cada vez que el usuario use ese componente.

En su lugar, puede escuchar directamente AWTEvents que son generados por cada componente en la interfaz de usuario. Esta podría ser fácilmente la información de origen para su minería de datos. El siguiente código muestra cómo se hace esto:

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(); } }); } }

En este caso, he escuchado Mouse Events. Estos parecen ser los más útiles ya que le pueden decir en qué hizo clic el usuario. A partir de aquí, tendrá que calcular lo que necesita recopilar para crear una imagen de lo que el usuario hizo clic. También me interesaría lo que el usuario no hizo clic también.

Hay mucho trabajo en torno a la prueba de IU automatizada que utiliza esta técnica. Abbot y FEST son ejemplos que he usado. Es posible que desee ver cómo procesan AWTEvents en caso de que haya algo útil allí.


Netbeans y Eclipse tienen mecanismos para recopilar estadísticas de UI, pero no tengo idea de lo fácil que es usar estas aplicaciones outwith basadas en sus plataformas.