2009-09-30 52 views
2

我準備了下面的一個小測試用例。我的問題是當我右鍵單擊窗口。 JPopupMenu出現,但如果我點擊JWindow菜單外的任何地方都不會消失。我必須點擊窗口上的某個地方纔能擺脫它,這不是預期的行爲。JPopupMenu行爲

編輯: 閱讀akf的答案後,我切換到JFrame,當框架在焦點和彈出菜單顯示它消失,當你點擊另一個窗口。但如果窗口沒有焦點,並且你點擊某處菜單不會消失。


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

您正在使用哪種操作系統和Java版本? – akf 2009-09-30 16:48:02

+0

我在使用Java 6的WinXP上測試了它,並且在切換到JFrame後,如果窗口失去焦點,彈出式菜單消失。如果窗口沒有焦點,我很困惑你如何獲得彈出菜單... – 2009-10-01 02:50:56

+0

只需右鍵點擊它即使沒有焦點,它也顯示菜單,這發生在Windows和Mac上os x。 – 2009-10-01 12:14:02

回答

1

查看Java文檔JWindow.isFocusableWindow JWindow不能成爲焦點窗口,除非它擁有所有者並且所有者可見。 您正在使用默認構造函數,因此您的JWindow擁有共享所有者,因此asn不可聚焦。當它不可聚焦時,當你點擊其他地方時,它無法檢測到焦點丟失。

我將JWindow更改爲JFrame,並在呼叫setVisible之前添加了對setUndecorated(true);的呼叫,並且它正在爲我工​​作。如果這些更改無法爲您工作,請發佈您正在使用的Java版本:java -fullversion

0

在Windows上的Java 6,我無法彈出甚至與您所提供的代碼顯示。另一方面,如果我將超類更改爲JFrame,它將按需要工作,當我在窗口外單擊時彈出消失。是否有理由將JWindow用作您的超類,而不是JFrame?如果你想有一個邊界少/標題少的窗口,您可以在JFrame致電setUndecorated(true)(你之前設置可見和包裝,當然)。

+0

我切換到JFrame,但同樣的事情發生我更新瞭解釋它的問題。 – 2009-09-30 16:32:01

0

有關隱藏菜單如果它是從MouseExited中可見方法?

+0

當其他非Java窗口有焦點時,它們不會被觸發。 這是有點總是在頂部窗口,人們可以拖放東西。 – 2009-09-30 17:01:51