2012-06-02 26 views
1

我正在嘗試爲文件瀏覽器製作一組導航按鈕。我想要它,這樣如果用戶點擊專用的歷史記錄按鈕,就會出現一個JPopupMenu。但是,我還希望在用戶右鍵單擊或拖動光標後退或前進按鈕時顯示完全相同的菜單。 如何爲不同手勢的多個GUI組件顯示完全相同的JPopupMenu(不是副本,但確切的一個副本)?如何在單擊,右鍵單擊或拖動3個JButton中的任何一個時出現JPopupMenu?

到目前爲止,我已經試過如下:

histButton.addMouseListener(new MouseAdapter() 
{ 
    @Override public void mouseClicked(MouseEvent e) 
    { 
    showPopup(e); 
    } 

    @Override public void mouseDragged(MouseEvent e) 
    { 
    showPopup(e); 
    } 

    private void showPopup(MouseEvent e) 
    { 
    histPopupMenu.show(e.getComponent(), e.getX(), e.getY()); 
    } 
}); 
forwardButton.addMouseListener(new MouseAdapter() 
{ 
    @Override public void mouseClicked(MouseEvent e) 
    { 
    if (e.isPopupTrigger()) 
     showPopup(e); 
    } 

    @Override public void mouseDragged(MouseEvent e) 
    { 
    showPopup(e); 
    } 

    private void showPopup(MouseEvent e) 
    { 
    histPopupMenu.show(e.getComponent(), e.getX(), e.getY()); 
    } 
}); 
backButton.addMouseListener(new MouseAdapter() 
{ 
    @Override public void mouseClicked(MouseEvent e) 
    { 
    if (e.isPopupTrigger()) 
     showPopup(e); 
    } 

    @Override public void mouseDragged(MouseEvent e) 
    { 
    showPopup(e); 
    } 

    private void showPopup(MouseEvent e) 
    { 
    histPopupMenu.show(e.getComponent(), e.getX(), e.getY()); 
    } 
}); 

所有組件都添加並正確顯示和調試表明我說,他們註冊的事件,但沒有出現菜單。

+1

[你嘗試過什麼?](http://www.whathaveyoutried.com/) –

+0

我已經固定我的問題 – Supuhstar

+0

好,但更好的幫助越早,張貼[SSCCE(HTTP:/ /sscce.org/)。 –

回答

2

Bringing Up a Popup Menu顯示了使用mousePressed(),mouseReleased()isPopupTrigger()的傳統實現。請注意,「應該彈出一個彈出式菜單的確切手勢因外觀和感覺而異。」您可以比較使用mousePressed()的實施所顯示的內容。

附錄:作爲參考,@ mKorbel回憶這可能證明有用的client property

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

/** @author mKorbel */ 
public class ComboBoxAction extends JFrame implements ActionListener { 

    private static final long serialVersionUID = 1L; 
    private JComboBox comboBox; 
    private JFrame frame; 

    public ComboBoxAction() { 
     comboBox = new JComboBox(); 
     comboBox.addActionListener(this); 
     comboBox.addItem("Item 1"); 
     comboBox.addItem("Item 2"); 
     comboBox.addItem("Item 3"); 
     comboBox.addItem("Item 4"); 
     for (Component component : comboBox.getComponents()) { 
      if (component instanceof AbstractButton) { 
       if (component.isVisible()) { 
        comboBox.remove(component); 
       } 
      } 
     } 
     //This prevents action events from being fired when the 
     //up/down arrow keys are used on the dropdown menu 
     comboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE); 
     comboBox.firePopupMenuWillBecomeVisible(); 
     frame = new JFrame(); 
     frame.add(comboBox); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.out.println(comboBox.getSelectedItem()); 
     //make sure popup is closed when 'isTableCellEditor' is used 
     comboBox.hidePopup(); 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new ComboBoxAction(); 
      } 
     }); 
    } 
} 
+0

+1爲什麼不把JComboBox從BasicComboBoxUI中刪除Button,基本上可以將派生Popup的setLocation設置爲BasicComboBoxUI,只是想法 – mKorbel

+0

@mKorbel:有趣。我正確地推斷這與您的評論[此處](http://stackoverflow.com/a/3008587/230513)和您的+1建議[此處]類似(http://stackoverflow.com/a/10861923/230513)? – trashgod

+0

基本上你是對的,我會在我的個人電腦 – mKorbel

相關問題