首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我想要一个javax.swing钩子,它告诉我层次结构中的哪个组件正在执行操作

我想要一个javax.swing钩子,它告诉我层次结构中的哪个组件正在执行操作
EN

Stack Overflow用户
提问于 2011-06-24 04:23:47
回答 2查看 463关注 0票数 2

如何在最少代码丑化的情况下,在Swing程序中编写调试钩子,告诉我层次结构中的哪个组件实际上正在处理每个KeyStroke或鼠标单击,并执行组件的操作映射中映射到它的操作?我们正在编写一个复杂的GUI,了解这些信息将非常有用。

EN

回答 2

Stack Overflow用户

发布于 2011-06-24 04:59:29

放入一个自定义的事件分派器:http://tips4java.wordpress.com/2009/09/06/global-event-dispatching/

还可以在API文档中查找AWTEvent.getID()、MouseEvent、KeyEvent。

这就是我工作的软件如何监视鼠标和键盘,以查看用户是否忙于工作,如果不忙,则锁定窗口。

票数 0
EN

Stack Overflow用户

发布于 2011-06-28 11:27:20

可以使用AspectJ将日志方面编织到代码库中。下面是关于使用代码库中的actionPerformed(ActionEvent)方法执行任何对象的连接点的建议示例。类似的结构也可以用来给其他监听器提供建议。

以下是建议按钮按下和其他具有ActionListeners的组件的方面。它只是输出操作源的类名和actionPerformed方法的签名。

代码语言:javascript
运行
复制
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中):

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6460168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档