2013-12-19 6 views
5

2つのパネルにマウスリスナーを追加したときに問題が発生しました。どちらもmouseEntered()mouseExited()メソッドを使用しています。MouseListenerが重なっている複数のペイン

テストコードベローズの期待される結果は次のとおり

  • IがIフレームで赤色矩形に置くと赤色矩形
  • 可視化されるべきフレームにホバー青はになるはずです。私のマウスは今青い四角形を終了
  • (それでもフレームの内側)には有効にする必要があり赤私のマウスは完全に今長方形が表示されないはずのフレームを終了

マウスを色の付いた四角形の上に移動しようとすると、表示されている状態から表示されない状態まで点滅し続けます。システムのプリントには、マウスを動かすたびにクリックするたびに、マウスの入力とマウスの終了が有効になります。とにかくmouseExited()メソッドが私のマウスを動かしたりクリックするたびに呼び出されないようにするにはどうしますか?ここで

は、テストコードです:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Sandbox extends JPanel { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setSize(500, 500); 
     frame.add(new Sandbox()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 

    } 

    public Sandbox() { 
     super(new BorderLayout()); 

     final JPanel panelA = new JPanel(); 
     panelA.setBackground(Color.red); 
     panelA.setPreferredSize(new Dimension(155, 155)); 
     panelA.setVisible(false); 

     this.add(panelA, BorderLayout.WEST); 

     this.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseEntered(MouseEvent e) { 

       System.out.println(" - MOUSE ENTERED "); 
       panelA.setVisible(true); 
      } 

      @Override 
      public void mouseExited(MouseEvent e) { 

       System.out.println(" - MOUSE EXITED "); 
       panelA.setVisible(false); 
      } 

     }); 

     panelA.addMouseListener(new MouseAdapter() { 

      @Override 
      public void mouseEntered(MouseEvent e) { 

       System.out.println(" # MOUSE ENTERED "); 
       panelA.setBackground(Color.blue); 

      } 

      @Override 
      public void mouseExited(MouseEvent e) { 
       panelA.setBackground(Color.red); 
       System.out.println(" # MOUSE EXITED "); 
      } 

     }); 

    } 

} 
+2

今週の質問 – mKorbel

答えて

2

あなたは2人のリスナーを持っているので、あなたは、その振る舞いを持っています。 blueに色を変更しようとしたときに、それが変更されましたが、最初のリスナーからpanelA.setVisible(false);が実行され、それが表示されません。

あなたは次のようにそれを修正することができ:

@Override 
    public void mouseExited(MouseEvent e) { 
     if(!panelA.contains(e.getPoint())){ 
      panelA.setVisible(false); 
     } 
     System.out.println(" - MOUSE EXITED "); 
    } 

EDIT:第二のリスナーの変化mouseExited

フレームから panelAでたら、マウスを出るための1つの以上の修正最初のリスナーに mouseExited()方法の変更コードを
@Override 
public void mouseExited(MouseEvent e) { 
    panelA.setBackground(Color.red); 
     if (!Sandbox.this.contains(e.getPoint())) { 
      panelA.setVisible(false); 
     } 

     System.out.println(" # MOUSE EXITED "); 
    } 
+0

安全性は、JFrameからJPanelへのMouseListener、またはその逆、いくつかのコード行を追加/削除(実行時に1つだけMouseListenerを追加できます)以上 – mKorbel