3

AWT イベント ( mouse_pressedmouse_releasedkey_pressedkey_releasedなど) をログに記録して、単体テストで Robot を使用してそれらを再生しています。しかし、イベントが欠落しているときにイベントを挿入する必要がある場合があることがわかりました。これmouse_releasedは、一部のコンポーネントが自分自身を削除してディスパッチされないためですmouse_pressed。2 番目のイベントが既に mouse_released でない限り、= の後に =0のイベントが続くマウス イベントが表示されるたびmouse_releasedに挿入することをお勧めします。しかし、使用時に問題が見つかりました。mouse_releasedmodifiersExButton1modifiersExJComboBox

JComboBox以下は、マウス イベントも受け取るコンポーネントを含む を含む単純な main 関数です。

JComboBox を含むウィンドウのスクリーンショット

import java.awt.AWTEvent;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Toolkit;
import java.awt.event.AWTEventListener;
import java.awt.event.InputEvent;
import java.util.logging.Logger;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class DemoEvents {
    public static void main(String[] argv) {
        JFrame jframe = new JFrame("Test events");
        jframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        Container contentPane = jframe.getContentPane();
        contentPane.setLayout(new BorderLayout());
        JComboBox jcomboBox = new JComboBox(new String[]{"one", "two", "three"});
        JButton jbutton = new JButton("Hello");
        JPanel outerPanel = new JPanel();
        JPanel innerPanel = new JPanel();
        innerPanel.setLayout(new BoxLayout(innerPanel, BoxLayout.PAGE_AXIS));
        innerPanel.add(jcomboBox);
        innerPanel.add(jbutton);
        outerPanel.add(innerPanel);
        contentPane.add(outerPanel, BorderLayout.CENTER);
        jframe.setSize(200, 200);
        jframe.setVisible(true);

        long mask =
            AWTEvent.MOUSE_EVENT_MASK |
            AWTEvent.MOUSE_WHEEL_EVENT_MASK |
            AWTEvent.MOUSE_MOTION_EVENT_MASK;

        final Logger logger = Logger.getLogger("awt-events");
        Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
            @Override
            public void eventDispatched(AWTEvent event) {
                InputEvent ev = (InputEvent)event;
                logger.info(ev.toString());
            }
        }, mask);
    }
}

をクリックしてJComboBoxアイテム「one」をクリックすると、これらのイベントが発生します。mouse_enteredwith extModifiers=Button1 は意味がありません。これは ! の後にディスパッチされたためです。mouse_released eventこれは、コンボ ボックスをクリックしてから最初の項目をクリックしたときの簡略化されたログです。一番下の太字のイベントを見てください。

  1. MouseEvent[MOUSE_PRESSED,(1,13),button=1,modifiers=Button1,extModifiers=Button1,clickCount=1] on MetalComboBoxButton[...]
  2. MouseEvent[MOUSE_RELEASED,(1,13),button=1,modifiers=Button1,clickCount=1] on MetalComboBoxButton[...]
  3. MouseEvent[MOUSE_MOVED,(0,14),button=0,clickCount=0] on MetalComboBoxButton[...]
  4. MouseEvent[MOUSE_EXITED,(-2,15),button=0,clickCount=0] on MetalComboBoxButton[...]
  5. MouseEvent[MOUSE_ENTERED,(81,15),button=0,clickCount=0] on JComboBox[...]
  6. MouseEvent[MOUSE_MOVED,(81,15),button=0,clickCount=0] on JComboBox[...]
  7. (より多くの動き)
  8. MouseEvent[MOUSE_EXITED,(69,24),button=0,clickCount=0] on JComboBox[...]
  9. MouseEvent[MOUSE_ENTERED,(69,0),button=0,clickCount=0] on ComboPopup.popup
  10. MouseEvent[MOUSE_MOVED,(69,0),button=0,clickCount=0] on ComboPopup.popup
  11. MouseEvent[MOUSE_EXITED,(68,2),button=0,clickCount=0] on ComboPopup.popup
  12. MouseEvent[MOUSE_ENTERED,(67,1),button=0,clickCount=0] on ComboBox.list
  13. MouseEvent[MOUSE_MOVED,(67,1),button=0,clickCount=0] on ComboBox.list
  14. (より多くの動き)
  15. MouseEvent[MOUSE_PRESSED,(57,9),button=1,modifiers=Button1,extModifiers=Button1,clickCount=1] on ComboBox.list
  16. MouseEvent[MOUSE_RELEASED,(57,9),button=1,modifiers=Button1,clickCount=1] on ComboBox.list
  17. MouseEvent[MOUSE_ENTERED,(25,10),button=1,modifiers=Button1, extModifiers=Button1 ,clickCount=1] on JButton[...]
  18. MouseEvent[MOUSE_MOVED,(26,10),button=0,clickCount=0] on JButton[...]

質問: mouse_pressed/の順序mouse_releasedが他のマウス イベントの修飾子と矛盾するのはいつですか? 一貫性のない修飾子で発生するのはmouse_entered/イベントだけですか? これは、のポップアップmouse_exitedをクリックしたときにのみ発生しますか?JComboBox

UbuntuでJava 1.6を実行しています。

編集:明確にするために、より長いログを含めました。

4

1 に答える 1