1

さまざまな機能を持つ多くのサブコンポーネントとサブパネルを含む JFrame があります。それらのいくつかに mouseListeners を追加しました。

どのコンポーネントがフォーカスされているかに関係なく、フレーム内でマウスボタンがクリックされたときに関数を呼び出せるようにしたいと考えています。すべてのコンポーネントにマウスリスナーを追加したくありません。keyEventDispacher と同じように、キーボードに使用しています。

このDispatch MouseEventを見てきましたが、解決できませんでした。それがどのように機能するかを示すために、誰かに小さな例を教えてもらえますか?

4

3 に答える 3

2

グローバル マウス リスナーの簡単な例を次に示します。

public static void main ( String[] args )
{
    final JFrame frame = new JFrame ();

    // Some content
    frame.getContentPane ().setLayout ( new FlowLayout ( FlowLayout.CENTER, 5, 5 ) );
    frame.getContentPane ().add ( new JButton ( "Test" ) );
    frame.getContentPane ().add ( new JLabel ( "Test" ) );
    frame.getContentPane ().add ( new JTextField ( "Test" ) );

    // Global mouse listener
    final AWTEventListener listener = new AWTEventListener ()
    {
        public void eventDispatched ( AWTEvent event )
        {
            // Event and component that recieved that event
            MouseEvent me = ( MouseEvent ) event;
            Component c = me.getComponent ();

            // Ignoring mouse events from any other frame
            if ( SwingUtilities.getWindowAncestor ( c ) == frame )
            {
                if ( event.getID () == MouseEvent.MOUSE_PRESSED )
                {
                    System.out.println ( "Mouse pressed on " + c.getClass ().getCanonicalName () );
                }
                if ( event.getID () == MouseEvent.MOUSE_RELEASED )
                {
                    System.out.println ( "Mouse released on " + c.getClass ().getCanonicalName () );
                }
                if ( event.getID () == MouseEvent.MOUSE_ENTERED )
                {
                    System.out.println ( "Mouse entered " + c.getClass ().getCanonicalName () );
                }
                if ( event.getID () == MouseEvent.MOUSE_EXITED )
                {
                    System.out.println ( "Mouse exited " + c.getClass ().getCanonicalName () );
                }
            }
        }
    };
    Toolkit.getDefaultToolkit ().addAWTEventListener ( listener, AWTEvent.MOUSE_EVENT_MASK );

    frame.pack ();
    frame.setLocationRelativeTo ( null );
    frame.setVisible ( true );
}

このリスナーは、フレーム/ダイアログ/ウィンドウ/ポップアップ内のすべてのマウス イベントについて通知することに注意してください。そのため、他のフレーム/ウィンドウ/からのイベントが必要ない場合に備えて、例で行ったように、アクションを特定のフレームに制限する必要があります...

ところで、同じアプローチを使用して、他のいくつかのイベント (主要なイベントなど) をグローバルに簡単にリッスンできます。たとえば、AWTEvent.MOUSE_EVENT_MASK の代わりに AWTEvent.KEY_EVENT_MASK キーを使用し、MouseEvent の代わりに AWTEvent を KeyEvent にキャストします。

于 2012-07-16T10:55:38.777 に答える
1

これは、最高の時でも混乱と苦痛の世界になるでしょう...

ここで、AWTEventListener を使用したグローバル イベント リスナーと、そこから MouseEvent をプルする方法を確認して、別の概念を確認してください。基本的に、これはグローバル マウス リスナーです。これを機能させるには多くの作業を行う必要があります (子が親に属していることを確認するなど) が、うまく機能します。

于 2012-07-16T10:52:26.580 に答える
0

MouseEvent Class静的メソッドで、を使用してみてくださいMOUSE_CLICKED

詳細については、こちらをご覧ください。

http://docs.oracle.com/javase/6/docs/api/java/awt/event/MouseEvent.html

roseindiaのこの例を参照してください

import java.awt.*;
import java.awt.event.*;

public class MouseClick {
  Label lbl;
  public static void main(String[] args) {
  MouseClick MC = new MouseClick();
  }

  public MouseClick(){
  Frame f = new Frame("Checking the mouse click");
  Panel p = new Panel();
  Button button = new Button("Click Me");
  button.addMouseListener(new MyMouseListener());
  p.add(button, BorderLayout.NORTH);
  f.add(p,BorderLayout.NORTH);
  lbl = new Label("Roseindia.net");
  f.add(lbl, BorderLayout.CENTER);
  f.addWindowListener(new WindowAdapter(){
  public void windowClosing(WindowEvent we){
  System.exit(0);
  }
  });
  f.setSize(400,400);
  f.setVisible(true);
  }

  public class MyMouseListener extends MouseAdapter{
  public void mouseClicked(MouseEvent me){
  String str = lbl.getText();
  if (str.equals("Roseindia.net")){
  lbl.setText("You have clicke the button.");
  }
  else if (str.equals("You have clicke the button.")){
  lbl.setText("Roseindia.net");
  }
  }
  }
}

Oracleのこの例を参照してください

 public class MouseEventDemo ... implements MouseListener {
            //where initialization occurs:
            //Register for mouse events on blankArea and the panel.
            blankArea.addMouseListener(this);
            addMouseListener(this);
        ...

        public void mousePressed(MouseEvent e) {
           saySomething("Mouse pressed; # of clicks: "
                        + e.getClickCount(), e);
        }

        public void mouseReleased(MouseEvent e) {
           saySomething("Mouse released; # of clicks: "
                        + e.getClickCount(), e);
        }

        public void mouseEntered(MouseEvent e) {
           saySomething("Mouse entered", e);
        }

        public void mouseExited(MouseEvent e) {
           saySomething("Mouse exited", e);
        }

        public void mouseClicked(MouseEvent e) {
           saySomething("Mouse clicked (# of clicks: "
                        + e.getClickCount() + ")", e);
        }

        void saySomething(String eventDescription, MouseEvent e) {
            textArea.append(eventDescription + " detected on "
                            + e.getComponent().getClass().getName()
                            + "." + newline);
        }
    }
于 2012-07-16T10:47:14.410 に答える