-1

有没有人看到有什么问题?为什么 actionListener 没有收到事件?

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JFrame;

@SuppressWarnings("serial")
public class Main extends JFrame {

        JButton button = new JButton("MouseEventTest");

        public Main() {
                super("MouseEventTest");
                setSize(400, 200);
                setDefaultCloseOperation(3);
                setResizable(false);
                setLocationRelativeTo(null);
                setVisible(true);
                add(button);
                button.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                                System.out.println("ID: " + e.getID());
                        }      
                });

                clickMouse(button, 50, 50);
        }

        private void clickMouse(Component c, int x, int y) {
                button.dispatchEvent(new MouseEvent(c, MouseEvent.MOUSE_CLICKED, System.currentTimeMillis(), 0, x, y, 1, false));
        }

        public static void main(String args[]) {
                new Main();
        }

}
4

2 回答 2

1

发布的代码有很多问题:

  1. 应在事件调度线程 (EDT) 上创建 GUI。阅读 Swing 教程并阅读一些示例以了解创建 GUI 的正确方法。

  2. 在框架可见之前,应将组件添加到框架中。

但是您的 clickButton(...) 方法不起作用的主要原因是,当用户在按钮上生成 mousePressed 和 mouseReleased 时会生成 ActionEvent。这与 mouseClicked 事件不同。

如果您只想单击程序中的按钮,则只需调用:

button.doClick();
于 2013-11-04T04:44:34.373 回答
0

我不确定您为什么要这样做,但是在稍微挖掘了源代码之后,BasicButtonUI期望鼠标左键单击。

鼠标按钮由您设置为的事件修饰符确定0。此外,动作事件仅在鼠标释放事件上触发,而不是单击。

所以你需要创建你的事件更像......

button.dispatchEvent(new MouseEvent(c, MouseEvent.MOUSE_PRESSED, System.currentTimeMillis(), MouseEvent.BUTTON1_MASK, x, y, 1, false));

现在,话虽如此,正如 camickr 所指出的那样,在您的方法执行之前,按钮可能尚未在屏幕上实现clickMouse,这意味着它可能会忽略该事件。

您还应该小心,以这种方式执行不按顺序执行的事件或不满足剩余的事件预期可能会使您的 UI 进入无效状态。例如,在按下时,有一个释放的期望,并且可能是一个单击鼠标事件......

所以,坦率地说......JButton#doClick将是一个更合适的解决方案......恕我直言

import java.awt.Component;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

@SuppressWarnings("serial")
public class MouseButton extends JFrame {

    JButton button = new JButton("MouseEventTest");

    public MouseButton() {
        super("MouseEventTest");
        setSize(400, 200);
        setDefaultCloseOperation(3);
        setResizable(false);
        setLocationRelativeTo(null);
        setVisible(true);
        add(button);
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.println("ID: " + e.getID());
            }
        });


        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                clickMouse(button, 50, 50);
            }

        });

    }

    private void clickMouse(Component c, int x, int y) {
        button.dispatchEvent(new MouseEvent(c, MouseEvent.MOUSE_PRESSED, System.currentTimeMillis(), MouseEvent.BUTTON1_MASK, x, y, 1, false));
        button.dispatchEvent(new MouseEvent(c, MouseEvent.MOUSE_RELEASED, System.currentTimeMillis(), MouseEvent.BUTTON1_MASK, x, y, 1, false));
        button.dispatchEvent(new MouseEvent(c, MouseEvent.MOUSE_CLICKED, System.currentTimeMillis(), MouseEvent.BUTTON1_MASK, x, y, 1, false));
    }

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MouseButton();
            }
        });
    }

}
于 2013-11-04T04:52:17.843 回答