Подтвердить что ты не робот

Есть ли хорошие инструменты для поиска статистики использования графического интерфейса, разбитых панелей и компонентов?

Сбор статистики использования на веб-странице на сайтах является обычной практикой, меня интересует аналогичная вещь, но для GUI: s. Вы видите, что Google Chrome (и другие) собирает статистику использования, чтобы Google мог узнать, какие функции люди используют, для данных, которые, как кажется, "работают".

Прямой способ сделать это - явно зарегистрировать взаимодействие с каждым элементом GUI, но это одновременно утомительно и подвержено ошибкам в недостающих частях графического интерфейса.

Так что я задаюсь вопросом, это решена проблема? Есть ли что-нибудь существующее, которое может предоставить сводку, аналогичную профилированию кода, метрикам (количеству посещений, кликам и т.д.), Разбитым на каждый компонент? Автоматически добавляется ко всем компонентам всего дерева компонентов AWT/Swing?

Эта информация должна быть сведена к файлу, чтобы ее можно было отправить "нам" для агрегации и интеллектуального анализа данных, для принятия решений и т.д.

Я не знаю точно, что хочу, поэтому я также прошу выяснить хорошие идеи и то, что сделали другие люди, столкнувшиеся с этой проблемой.

4b9b3361

Ответ 1

Хотя это не полное решение, это может помочь вам приблизиться к чему-то работоспособному. Я согласен с предыдущим плакатом, что в ваш код можно добавить крючки, это становится неуправляемым в большом проекте. Кроме того, если вы пропустите часть приложения и приступите к анализу данных, вы будете иметь пустое место каждый раз, когда пользователь будет использовать этот компонент.

Вместо этого вы можете напрямую прослушивать 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();
            }
        });
    }
}

В этом случае я слушал Mouse Events. Они кажутся наиболее полезными, поскольку они могут рассказать вам, что пользователь нажал. Отсюда вам нужно будет выяснить, что вам нужно собрать, чтобы создать картину того, что пользователь нажал. Я также был бы заинтересован в том, что пользователь также не нажал.

Существует много работ, связанных с автоматическим тестированием пользовательского интерфейса, которое использует эту технику. Аббат и FEST являются примерами, которые я использовал. Вы можете посмотреть, как они обрабатывают AWTEvents, если там что-то полезно.

Ответ 2

Хорошо, сначала вы ожидаете получить статистику использования. Так вы собираетесь подключить ваше приложение к базе данных? У вас будет другое приложение, которое обрабатывает статистику использования? Короче говоря, я бы создал такую ​​функцию

void LogUsage (этот идентификатор объекта или имя дескриптора/текст подписи и т.д.)

и пусть эта функция обрабатывает всю обработку обработки статистического использования. Конечно, вам нужно будет выполнить какую-то работу, например, добавить эту функцию в onClicks, изменить изменения и т.д., Но это должно быть довольно просто. Особенно, если ваша функция LogUsage просто берет что-то уникальное (например, имя) и использует это для статистики.

Функция LogUsage также может управлять удаленным удаленным подключением и очищать любой кеш, который он мог сохранить с момента последней передачи.

Проще говоря, если вы создали функцию LogUsage, которая принимает объект, и вы всегда получаете имя. Вы можете просто скопировать/вставить эту строку в своей программе

LogUsage (это);

Изменить

Я также заметил, что вы ищете предложения: я бы сделал то, что я сказал выше; простая функция LogUsage, которая принимает параметр, такой как объект, и захватывает имя, например - btnLogin, а затем обрабатывает это имя в каком-то файле. Вы, очевидно, сначала загрузите этот файл в какую-то карту или массив, проверьте, существует ли она в первую очередь. Если он не добавляет его в список с 1 кликом (или использованием). Если он существует, он увеличивает свою точку использования. Вы, очевидно, не захотите вызвать LogUsage в методе OnChange в текстовом поле и т.д., Но, вероятно, все onFocus, клики или все, что вы действительно хотите отслеживать.

В конце концов, вы можете получить что-то вроде btnLogin (5), которое будет отправлено вам, указав, что пользователь нажимал на btnLogin 5 раз.

Обработка всех этих полученных данных - это еще одна попытка, поэтому я бы определенно отправил ее в базу данных, а не получал, скажем, адрес электронной почты или каталог сервера, полный файлов статистики использования. В любом случае вам потребуется что-то, чтобы обработать его и превратить в графики или отсортированную статистику использования и т.д.

Ответ 3

Netbeans и Eclipse у обоих есть механизмы для сбора статистики пользовательского интерфейса, но я понятия не имею, насколько просто использовать эти outwith приложения на основе своих платформ.

Ответ 4

Хорошо, насколько я знаю, я никогда не видел автоматического сбора статистики использования для приложений Swing.

На мой взгляд, самый простой способ реализовать такую ​​функцию - использовать look'n'feel: таким образом, каждый компонент будет прозрачно связан с лучшими фишками регистрации (JCheckBox будет прослушиваться для проверок, в то время как У ЗАО "АКРОЛБАР" будет свой журнал прокрутки).

Вы можете подумать о том, чтобы просить Кирилл Гроучников об этой функции, но я боюсь даже Substance не реализует его.