2013-04-03 3 views
0

Voici mon problème: j'ai un jpanel qui a trois panneaux en elle. un panneau verticalseperator, un panneau chatouput et un panneau chatinput. la principale JPanel, chatpanel, met en œuvre MouseMotionListener, et a le code suivant:jtextarea événement de souris écrasant les conteneurs événement souris

public void mouseMoved(MouseEvent e) { 
    int y = e.getY(); 

    //change cursor look if hovering over vertical spacer 
    if(y >= (int)(verticalPanelSeperator.getLocation().getY()) && y <= (int)(verticalPanelSeperator.getLocation().getY() + verticalPanelSeperator.getHeight())) { 
     setCursor(Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR)); 
    } 
    else { 
     setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); 
    } 
} 

public void mouseDragged(MouseEvent e) { 
//vertical spacer can be draged up/down to change height of input/output areas 
    if(getCursor().getType() == Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR).getType()) { 
     int edge = (int)this.getLocation().getY(); 
     int cur = e.getY(); 
     int height = this.getHeight(); 
     output.setHeightPercent((((double)(cur-edge))/height)); 
     output.componentResized(new ComponentEvent(this, 1)); 
     input.setHeightPercent((((double)(height-cur-edge))/height)); 
     input.componentResized(new ComponentEvent(this, 2)); 
     e.consume(); 
    } 
} 

le problème est que, pour une raison quelconque, lorsque vous déplacez la souris sur l'verticalpanelseperator, il se transforme en un curseur de redimensionnement, mais que vous vous déplacez vers le haut, sans faire glisser, il reste comme le curseur de redimensionnement. De plus, à partir de l'instruction print, lorsque la souris monte dans le chatoutput, la valeur de e.getY() ne s'incrémente pas, elle reste dans les limites du verticalseperatorpanel. C'est comme le mouselistener par défaut de chatoutput qui substitue celui sur le chatpanel et ne fait rien. Quelqu'un peut-il me dire ce qui se passe ici et comment résoudre ce problème?

Répondre

1

Un MouseListener répondra uniquement aux événements de souris pour son conteneur, tant qu'aucun autre conteneur ne surveille les événements de souris au-dessus. Pensez à un événement de souris comme une goutte de pluie. Si vous mettez un parapluie entre vous et la pluie, la pluie ne vous atteindra pas.

Je vous suggère que vous devriez utiliser mouseEnter et mouseExit de la place l'interface MouseListener et l'enregistrer directement sur le verticalPanelSeperator

Questions connexes