Нужен хук javax.swing, который говорит мне, какой компонент в иерархии выполняет действие - PullRequest
2 голосов
/ 24 июня 2011

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

Ответы [ 2 ]

0 голосов
/ 28 июня 2011

Использование AspectJ для встраивания аспекта регистрации в вашу базу кода может быть сделано. Ниже приведен пример совета по точке соединения при выполнении любых объектов с помощью метода actionPerformed(ActionEvent), который есть в вашей базе кода. Подобные конструкции могут использоваться для консультирования других слушателей.

Ниже приведено описание советов по нажатию кнопок и других компонентов, имеющих ActionListeners. Он просто выводит имя класса источника действия и подпись метода actionPerformed.

import java.awt.event.ActionEvent;

import org.aspectj.lang.Signature;

public aspect Logger {
  before(ActionEvent e) : execution(* *.actionPerformed(ActionEvent)) && args(e) {
    Signature sig = thisJoinPoint.getSignature();
    System.out.println(e.getSource().getClass() + " lead to " + sig);
  }
}

Тестовый класс, который создает две кнопки разных классов (в файле StackTraceExample.java):

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

class MyButton extends JButton {
  public MyButton(String string) {
    super(string);
  }
}

class MyOtherButton extends JButton {
  public MyOtherButton(String string) {
    super(string);
  }
}

class ButtonStackDisplay implements ActionListener {
  private final JTextArea stackTraceText;

  ButtonStackDisplay(JTextArea textArea) {
    this.stackTraceText = textArea;
  }

  public void actionPerformed(ActionEvent e) {
    String endl = System.getProperty("line.separator");
    StringBuilder b = new StringBuilder();

    // you can see the source of the event 
    b.append(e.getSource()).append(endl).append(endl);

    // the stack trace shows that events don't propagate through the components
    // originating them, but instead processed in a different thread
    for (StackTraceElement se : new Throwable().getStackTrace()) {
      b.append(se.toString());
      b.append(endl);
    }
    stackTraceText.setText(b.toString());
  }
}

public class StackTraceExample {
  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        f.setLayout(new BorderLayout());
        JPanel top = new JPanel();
        JButton button = new MyButton("Stack Trace");
        top.setLayout(new GridLayout(2, 1));
        top.add(button);
        JButton otherButton = new MyOtherButton("Stack Trace");
        top.add(otherButton);
        f.getContentPane().add(top, BorderLayout.NORTH);
        JTextArea stackTraceText = new JTextArea();
        f.add(stackTraceText, BorderLayout.CENTER);
        ButtonStackDisplay bsd = new ButtonStackDisplay(stackTraceText);
        button.addActionListener(bsd);
        otherButton.addActionListener(bsd);
        f.setSize(400, 400);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
        f.toFront();
      }
    });
  }
}
0 голосов
/ 24 июня 2011

Поместите в специальный диспетчер событий: http://tips4java.wordpress.com/2009/09/06/global-event-dispatching/

Также посмотрите AWTEvent.getID (), MouseEvent, KeyEvent в документации API.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...