-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 に答える