2011-12-23 17 views
2

私のアプリケーションのテキストフィールドに汎用の右クリックを追加しようとしています。私は、私のフレームの上にガラスの枠を追加し、それを見えなくし、普遍的なマウスのリスナーとして登録することができる解決策を見つけました。コンポーネントがテキストフィールドの場合は、ポップアップメニューを表示します。それ以外の場合は、イベントを再ディスパッチします。私は以下のコードを貼り付けました...フレームにglasspaneを追加するとstackoverflowエラーが発生する

この例はうまくいきます。私も自分のアプリケーションでこれを使用する場合でも、私はすべての時間がマウスを窓ガラスがイベントを受信した後、再送出コンポーネントに入力されていることを理解し

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError 
at apple.awt.CWindow._getLocationOnScreen(Native Method) 
at apple.awt.CWindow.getLocationOnScreen(CWindow.java:878) 
at java.awt.Component.getLocationOnScreen_NoTreeLock(Component.java:1960) 
at java.awt.Component.getLocationOnScreen(Component.java:1938) 
at javax.swing.SwingUtilities.convertPointToScreen(SwingUtilities.java:364) 
at javax.swing.SwingUtilities.convertPoint(SwingUtilities.java:165) 
at com.aesthete.csmart.ui.common.components.RightClickGlassPane.redispatchMouseEvent(RightClickGlassPane.java:79) 
at com.aesthete.csmart.ui.common.components.RightClickGlassPane.mouseEntered(RightClickGlassPane.java:61) 

でstackoverflowのエラーを取得します。しかし、なぜ再帰呼び出しに変換されているのですか?

EDIT: はちょうど私がCamickrの提案とそれを解決する方法を皆に見せたかった:

SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      final JPopupMenu popup = new JPopupMenu(); 
      JMenuItem mnItemCopy = new JMenuItem("Copy", CommonUI.getScaledImage(13, 13, "/images/copy.png")); 
      JMenuItem mnItemCut = new JMenuItem("Cut", CommonUI.getScaledImage(13, 13, "/images/cut.png")); 
      JMenuItem mnItemPaste = new JMenuItem("Paste", CommonUI.getScaledImage(13, 13, "/images/paste.png")); 
      popup.add(mnItemCopy); 
      popup.add(mnItemCut); 
      popup.add(mnItemPaste); 

      Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() { 
       @Override 
       public void eventDispatched(AWTEvent event) { 
        if(event instanceof MouseEvent) { 
         MouseEvent mouseevent=(MouseEvent)event; 
         if(mouseevent.isPopupTrigger()) { 
          if (mouseevent.getComponent() instanceof JTextField) { 
           popup.show(mouseevent.getComponent(), mouseevent.getX(), mouseevent.getY()); 
          } 
         } 
        } 
       } 
      }, AWTEvent.MOUSE_EVENT_MASK); 
     } 
    }); 
+0

すぐに役立つように、[SSCCE](http://sscce.org/)を投稿してください。問題を表示していないコードに基づいて**削除された投稿が**あります。さらに同じ混乱を避けるため、同じコードが編集されました。 –

+0

Andrewに感謝します。 SSCCEが間違っているのは残念です。私は自分のコードベースに投稿したのと同じクラスを使用しました。私はそれを抜き出し、正しく動作しているのを見ました。自分のコードベースと統合したときになぜ失敗したのか分かりませんでした。私が持っていたすべての情報を載せると思った。 – sethu

+0

あなたはそれを整理してうれしいです。ダウンボートの逆転 - ソリューションの報告。 –

答えて

3

私は自分のアプリケーション内のテキストフィールドにユニバーサル右クリックを追加しようとしています。

チェックアウトGlobal Event LIsteners。イベントのソースを確認し、必要に応じて処理してください。イベントを再配布する必要はありません。

右クリックがポップアップを表示するLAF方法であるとは限りません。より良い解決法については、Bringing Up a Popup MenuのSwingチュートリアルのセクションを読んでください。

+0

グローバルイベントリスナーのリンクに感謝します。それは私のために解決した.. – sethu

+0

@AndrewThompson、正しい、私はNOTを追加する答えを編集しました。 – camickr

関連する問題