2012-05-11 3 views
3

ユニットテストでRobotを使用してAWTイベント(mouse_pressedmouse_releasedkey_pressedkey_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); 
    } 
} 

Screenshot of window with JComboBox

は、私はこれらのイベントを取得します。 extModifiers = Button1の mouse_enteredは、の後に mouse_released eventの後に送出されたため意味がありません!ここでは、コンボボックスをクリックして最初の項目をクリックしたときの簡単なログを示します。下部に太字のイベントを見て:

  1. のMouseEvent [MOUSE_PRESSED、(1,13)、ボタン= 1、修飾子= Button1を、extModifiers = Button1を、clickCountは= 1] MetalComboBoxButtonの[...]
  2. MouseEvent [MOUSE_MOVED、(1,13)、button = 1、modifiers = Button1、clickCount = 1] MetalComboBoxButton [...]
  3. MouseEvent [ ( - 2,15)、ボタン= 0、clickCountは= 0] MetalComboBoxButtonの[...]
  4. のMouseEvent [MOUSE_ENTERED、(81,15)] MetalComboBoxButton [...]
  5. のMouseEvent [MOUSE_EXITED、オンbutton = 0、clickCoun JComboBoxのJComboBoxの上の[...]
  6. のMouseEvent [MOUSE_MOVED、(81,15)、ボタン= 0、clickCountは= 0] [...]
  7. (より移動)
  8. のMouseEventにT = 0] JComboBoxの[MOUSE_EXITED、button = 0、clickCount = 0]
  9. ComboPopup.popupのMouseEvent [MOUSE_ENTERED、(69,0)、button = 0、clickCount = 0]
  10. ComboPopup.popupにComboPopup.popupに
  11. のMouseEvent [MOUSE_MOVED、(69,0)、ボタン= 0、clickCountは= 0]
  12. のMouseEvent [MOUSE_EXITED、(68,2)、ボタン= 0、clickCountは= 0]
  13. MouseEven T [MOUSE_ENTERED、(67,1)、ボタン= 0、clickCountは= 0] ComboBox.listに
  14. のMouseEvent [MOUSE_MOVED、(67,1)、ボタン= 0、clickCountは= 0] ComboBox.listに
  15. (より移動)
  16. のMouseEvent [MOUSE_PRESSED、(57,9)、ボタン= 1、修飾子= Button1を、extModifiers = Button1を、clickCountは= 1] ComboBox.list
  17. 上のMouseEvent [MOUSE_RELEASED、(57,9)、 ComboBox.listの
  18. マウスイベント[MOUSE_ENTERED、(25,10)、ボタン= 1、修飾子= Button1、extModifiers = Button1、clickCount = 1] on JButton [ ...]
  19. のMouseEvent [MOUSE_MOVED、(26,10)、ボタン= 0、clickCountは= 0]のJButtonの[...]

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

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

編集:明快にするために長いログを含めました。

+0

+1 [sscce](http://sscce.org/)です。 – trashgod

答えて

1

私のプラットフォームでは、「JComboBoxをクリックしてをクリックすると、」というイベントが生成されます。

結果はcom.apple.laf.AquaComboBoxButton、プラットフォームのComboBoxUI代理人によって異なる場合があります。あなたの結果にMOUSE_CLICKEDがないことを説明できません。私はJComboBoxをクリックした後マウスを動かさなかった。あなたがしたように見え、その結果が記録されます。ので、いくつかのイベントにextModifiersの存在は矛盾していないようだ「Extended modifiersは、ちょうど後のイベントが発生したすべてのモーダルな​​などのキー、CTRLMETA、およびマウスボタンの状態を表す」

注こと。私はMOUSE_MOVEDイベントに何らかの修飾語が含まれていることを示すものは何も表示されません。

合成MOUSE_RELEASEDイベントの必要性を再検討する以外は、基本的な問題の解決策がわかりません。代わりに、containment hierarchyを調べてコンポーネントが削除されたことを確認することもできます。

 
May 11, 2012 10:36:36 AM DemoEvents$1 eventDispatched 
INFO: java.awt.event.MouseEvent[MOUSE_PRESSED,(85,9),absolute(124,58),button=1,modifiers=Button1,extModifiers=Button1,clickCount=1] on com.apple.laf.AquaComboBoxButton[…] 
May 11, 2012 10:36:36 AM DemoEvents$1 eventDispatched 
INFO: java.awt.event.MouseEvent[MOUSE_RELEASED,(85,9),absolute(124,58),button=1,modifiers=Button1,clickCount=1] on com.apple.laf.AquaComboBoxButton[…] 
May 11, 2012 10:36:36 AM DemoEvents$1 eventDispatched 
INFO: java.awt.event.MouseEvent[MOUSE_CLICKED,(85,9),absolute(124,58),button=1,modifiers=Button1,clickCount=1] on com.apple.laf.AquaComboBoxButton[…] 
May 11, 2012 10:36:38 AM DemoEvents$1 eventDispatched 
INFO: java.awt.event.MouseEvent[MOUSE_ENTERED,(91,6),absolute(124,58),button=1,modifiers=Button1,extModifiers=Button1,clickCount=1] on ComboBox.list 
May 11, 2012 10:36:38 AM DemoEvents$1 eventDispatched 
INFO: java.awt.event.MouseEvent[MOUSE_PRESSED,(91,6),absolute(124,58),button=1,modifiers=Button1,extModifiers=Button1,clickCount=1] on ComboBox.list 
May 11, 2012 10:36:38 AM DemoEvents$1 eventDispatched 
INFO: java.awt.event.MouseEvent[MOUSE_RELEASED,(91,6),absolute(124,58),button=1,modifiers=Button1,clickCount=1] on ComboBox.list 
+0

私が参照していたイベントは、ログの直後、2回目のクリック後でした。 Ubuntuでは、2番目のmouse_releasedの後にまだ修飾子を持つmouse_enteredがあります。 – yonran

+0

OK、 'MOUSE_PRESSED'はすべて' extModifiers'を持っていますが、 'MOUSE_ENAGED'では' MOUSE_DRAGGED'の間だけ、つまりマウスボタンがまだ押されている間に表示されます。 – trashgod

+0

* nixプラットフォームで何が起こっているのか分かりません+1 – mKorbel

関連する問題