2012-03-20 19 views
2

この問題の解決方法を教えてください。Java JPanelマウスリスナーがコンポーネント上で動作しない

JPanelにマウスリスナーを追加しましたが、そのパネルにはJPanelの全領域をカバーするボタンがいっぱいです。

例(擬似)コード:

Create JPanel 
Set to GridLayout 
Add 25 buttons (5x5 grid) 
Add MouseListener to JPanel 

のMouseListener /のMouseMotionListener:

onMouseMove { print out X,Y co-ords of mouse } 

私は右のJPanel容器の縁に到達するまでための共ordsは、プリントアウトされることはありませんボタンが残りの部分をブロックしています。

各コンポーネントにリスナーを追加することなく、パネルのすべてのコンポーネントに対してマウスリスナーを機能させるにはどうすればよいですか?または、各コンポーネントにリスナーを追加するはずですか?

情報を追加: 私は(パネルをスワイプすると発生するアクションを起こす)タッチスクリーンシステム用のタッチジェスチャーを追加しようとしています。 私はジェスチャーを自分自身で認識することについてかなり自信がありますが、実際には、各コンポーネントにリスナーのコピーを追加するよりも「より良い」方法を探していました(コンポーネントが変更されているため、私は...代わりのglassPaneにそれを追加しようとするつもりです

(瞬間のgetRootPane()には、私のNullPointerExceptionを与える)

EDIT: 私は今、私は(のgetRootPaneにしようとしていることを知っています)JPanelからルートコンテナではないので、なぜ私はnullを得ているthats。私はメインのJFrameでこれを行う必要があります。

EDIT2:だから、それを

myGlassPane.setVisible(true);

わかりましたので、私は私がこれをしなかったので、(メインのJFrameに窓ガラスを追加しました)、最初に私は問題を抱えていたことをやりましたそれは動作していないようだった。しかし、私は私がしなければならなかったすべてはそれ透明

myGlassPane.setOpaque(false);

はだから今、私はボタンの上にプリントアウトするX、Yの共同ordsを取得し、すべてのものよ作るためにfalseに不透明なフラグを設定したことをやった後、しかし、それらの上にパネルがあるため、ボタンは機能しません。

+0

マウスをインターセプトしてマウスイベントを下位のすべてのコンポーネントにディスパッチさせる必要がある場合があります。 –

+0

ボタンに 'MouseListener'を使わないでください! 'ActionListener'はマウスとキーボード入力の両方に応答します。 –

+0

こんにちは。 'myPanel.getRootPane()...を試してみると' NullPointerException'を回避できません私がglassPaneに乗ろうとしているときに。 – Ozzy

答えて

1

JButtonをカスタムボタンに置​​き換えます。必要なイベントをボタンからボタンの親に転送します。マウス入力イベントを転送する例を次に示します。転送を調整し、必要に応じて例外/エラー処理を追加します。

class JJButton extends JButton { 
    { 
     addMouseListener(new MouseAdapter(){ 
     public void mouseEntered(MouseEvent e) { 
      if (JJButton.this.getParent()!=null){ 
       MouseListener[] ml = JJButton.this.getParent().getMouseListeners(); 
       for (MouseListener l : ml) { 
        l.mouseEntered(e); 
       } 
      } 
     } 
     }); 
    } 
    public JJButton(String string) { 
     super(string); 
    }  
} 
+0

これは私がやったことだっただろう、私は最終的に私のイベントがガラスの窓ガラスを通って働いていないので、私はこの質問の答えとしてこれを受け入れています。ありがとう。 – Ozzy

+0

これは私が今やったことです。私は、JavaアプリケーションをMouseListenerイベントが1つ以上のレイヤーで動作するようにする方法がない、長い/難しい方法を見つけた後です。もう一度@ChuckFricanoに感謝します。 – Ozzy

2

パネルとrheボタンの両方にリスナーを追加します。

+0

これは普通のコンベンション@Snicolasですか? – Ozzy

+1

しかし、あなたが探しているものは、通常の規約でもありません。 :) – Snicolas

+0

しかし、共有リスナーは一般的な方法です。しかし、より多くの共有アクション。とにかく、deduplicatnigコードよりはるかに良い。 – Snicolas

関連する問題