2009-09-30 21 views
2

J'ai préparé un petit boîtier de test ci-dessous. Mon problème est quand je fais un clic droit sur la fenêtre. JPopupMenu apparaît, mais si je clique n'importe où en dehors du menu JWindow ne disparaît pas. Je dois cliquer quelque part sur la fenêtre pour m'en débarrasser, ce qui n'est pas le comportement attendu. Après avoir lu la réponse d'Akf, je suis passé à JFrame, lorsque l'image est au point et que le menu contextuel affiche qu'elle disparaît lorsque vous cliquez sur une autre fenêtre. mais si la fenêtre n'a pas de focus et que vous cliquez quelque part, le menu ne disparaît pas.JPopupMenu Comportement


import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

class test { 

    static class window extends JWindow 
    implements MouseListener, MouseMotionListener{ 

    JPopupMenu popMenu; 
    JPanel panel = new JPanel(); 

    Point location; 
    MouseEvent pressed; 

    public window(){ 

     addMouseListener(this); 
     addMouseMotionListener(this); 

     JLabel label = new JLabel("JWindow", JLabel.CENTER); 

     initPopMenu(); 
     add(label); 
     setVisible(true); 
     setAlwaysOnTop(true); 
     setLocationRelativeTo(null); 
     pack(); 
    } 

    public void initPopMenu(){ 
     popMenu = new JPopupMenu(); 
     JMenuItem item; 

     item = new JMenuItem("Title"); 
     item.setEnabled(false); 
     popMenu.add(item); 
     popMenu.addSeparator(); 

     item = new JMenuItem("Item One"); 
     popMenu.add(item); 

     item = new JMenuItem("Item 2"); 
     popMenu.add(item); 

     item = new JMenuItem("Item 3"); 
     popMenu.add(item); 
    } 

    public void mousePressed(MouseEvent e) 
    { 
     pressed = e; 
     int nModifier = e.getModifiers(); 
     if (((nModifier & InputEvent.BUTTON2_MASK) != 0)|| 
     ((nModifier & InputEvent.BUTTON3_MASK) != 0)) 
     popMenu.show(this, e.getX(), e.getY()); 
    } 

    public void mouseClicked(MouseEvent e) { 
    } 


    public void mouseReleased(MouseEvent e) {} 

    public void mouseDragged(MouseEvent me){ 
    } 

    public void mouseMoved(MouseEvent e) {} 
    public void mouseEntered(MouseEvent e) {} 
    public void mouseExited(MouseEvent e) {} 
    } 
    public static void main(String[] args) { 
    window dw = new window(); 
    } 
} 
+0

quelle version OS et Java utilisez-vous? – akf

+0

J'ai testé cela sur WinXP avec Java 6, et après le passage à JFrame, si la fenêtre perd le focus, le menu contextuel disparaît. Je suis confus quant à la façon dont vous pouvez obtenir le menu contextuel pour afficher si la fenêtre n'a pas de focus ... –

+0

juste à droite cliquez dessus, il montre le menu même si elle n'a pas de focus, cela arrive sur windows et mac os x. –

Répondre

1

Jetez un coup d'œil au document Java pour JWindow.isFocusableWindow Un JWindow ne peut pas être la fenêtre de mise au point à moins d'avoir un propriétaire et que le propriétaire soit visible. Vous utilisez le constructeur par défaut, donc votre JWindow a le propriétaire partagé asn n'est pas focalisable. Quand il n'est pas focalisable, il ne peut pas détecter la perte de focus lorsque vous cliquez ailleurs.

j'ai changé JWindow à JFrame et a ajouté un appel à setUndecorated(true); avant l'appel à setVisible et il travaille pour moi. Si ces modifications ne vous conviennent pas, veuillez publier la version de Java que vous utilisez: java -fullversion

0

En Java 6 sous Windows, je n'arrive pas à afficher le popup avec le code que vous avez fourni. D'un autre côté, si je change votre super-classe en JFrame, cela fonctionne comme vous le souhaitez, avec la popup disparaissant lorsque je clique à l'extérieur de la fenêtre. Y at-il une raison pour laquelle vous utilisez JWindow comme superclasse et non JFrame? Si vous souhaitez avoir une bordure moins/title-less fenêtre, vous pouvez appeler setUndecorated(true) sur votre JFrame (avant VISIBLE et de l'emballage, bien sûr.)

+0

je suis passé à JFrame mais la même chose se passe j'ai mis à jour la question en l'expliquant. –

0

Qu'en est-il cacher le menu si elle est visible à partir du MouseExited méthode?

+0

lorsque d'autres fenêtres non java ont le focus, elles ne sont pas déclenchées. c'est un peu toujours sur la fenêtre supérieure où les gens peuvent glisser et déposer des choses. –