ユニットテストでRobotを使用してAWTイベント(mouse_pressed
、mouse_released
、key_pressed
、key_released
など)をログに記録しています。しかし、私は時々mouse_released
イベントを挿入する必要があることが分かりました。なぜなら、私のコンポーネントのいくつかはmouse_pressed
上にあるので、mouse_released
はディスパッチされません。私は、modifiersEx
= Button1
のマウスイベントが表示された後に、modifiersEx
= 0のイベントが続いたときに、mouse_released
を挿入するのが良い方法だと考えました。ただし、2番目のイベントが既にmouse_releasedされている場合を除きます。しかし、JComboBox
を使用すると問題が見つかりました。AWT(拡張)修飾子はいつ有効ですか?
ここにはJComboBox
を含む単純なメイン関数があり、その下にマウスイベントを受け取るコンポーネントがあります。 JComboBox
をクリックすると "1" の項目をクリックすると
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);
}
}
は、私はこれらのイベントを取得します。 extModifiers = Button1の
mouse_entered
は、の後に
のmouse_released event
の後に送出されたため意味がありません!ここでは、コンボボックスをクリックして最初の項目をクリックしたときの簡単なログを示します。下部に太字のイベントを見て:
- のMouseEvent [MOUSE_PRESSED、(1,13)、ボタン= 1、修飾子= Button1を、extModifiers = Button1を、clickCountは= 1] MetalComboBoxButtonの[...]
- MouseEvent [MOUSE_MOVED、(1,13)、button = 1、modifiers = Button1、clickCount = 1] MetalComboBoxButton [...]
- MouseEvent [ ( - 2,15)、ボタン= 0、clickCountは= 0] MetalComboBoxButtonの[...]
- のMouseEvent [MOUSE_ENTERED、(81,15)] MetalComboBoxButton [...]
- のMouseEvent [MOUSE_EXITED、オンbutton = 0、clickCoun JComboBoxのJComboBoxの上の[...]
- のMouseEvent [MOUSE_MOVED、(81,15)、ボタン= 0、clickCountは= 0] [...]
- (より移動)
- のMouseEventにT = 0] JComboBoxの[MOUSE_EXITED、button = 0、clickCount = 0]
- ComboPopup.popupのMouseEvent [MOUSE_ENTERED、(69,0)、button = 0、clickCount = 0] ComboPopup.popupにComboPopup.popupに
- のMouseEvent [MOUSE_MOVED、(69,0)、ボタン= 0、clickCountは= 0]
- のMouseEvent [MOUSE_EXITED、(68,2)、ボタン= 0、clickCountは= 0]
- MouseEven T [MOUSE_ENTERED、(67,1)、ボタン= 0、clickCountは= 0] ComboBox.listに
- のMouseEvent [MOUSE_MOVED、(67,1)、ボタン= 0、clickCountは= 0] ComboBox.listに
- (より移動)
- のMouseEvent [MOUSE_PRESSED、(57,9)、ボタン= 1、修飾子= Button1を、extModifiers = Button1を、clickCountは= 1] ComboBox.list
- 上のMouseEvent [MOUSE_RELEASED、(57,9)、 ComboBox.listの
- マウスイベント[MOUSE_ENTERED、(25,10)、ボタン= 1、修飾子= Button1、extModifiers = Button1、clickCount = 1] on JButton [ ...]
- のMouseEvent [MOUSE_MOVED、(26,10)、ボタン= 0、clickCountは= 0]のJButtonの[...]
質問:の改質剤と矛盾mouse_pressed
/mouse_released
の順序がある場合他のマウスイベント?一貫性のない修飾語で発生するのはmouse_entered
/mouse_exited
イベントですか?これはJComboBox
のポップアップをクリックしたときにのみ発生しますか?
私はUbuntuでJava 1.6を実行しています。
編集:明快にするために長いログを含めました。
+1 [sscce](http://sscce.org/)です。 – trashgod