2009-11-07 49 views
32

我想在我的應用程序中創建一個工具欄。如果您單擊該工具欄上的按鈕,它將彈出一個菜單,就像在Eclipse的工具欄中一樣。我不知道如何在Swing中做到這一點。有人能幫助我嗎?我試過Google,但什麼都沒發現。如何用菜單創建JButton?

回答

30

這在Swing中比在需要時更困難。因此,我沒有將你指向教程,而是創建了一個完整的工作示例。

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

public class ToolbarDemo { 

    public static void main(String[] args) { 
     final JFrame frame = new JFrame(); 
     frame.setPreferredSize(new Dimension(600, 400)); 
     final JToolBar toolBar = new JToolBar(); 

     //Create the popup menu. 
     final JPopupMenu popup = new JPopupMenu(); 
     popup.add(new JMenuItem(new AbstractAction("Option 1") { 
      public void actionPerformed(ActionEvent e) { 
       JOptionPane.showMessageDialog(frame, "Option 1 selected"); 
      } 
     })); 
     popup.add(new JMenuItem(new AbstractAction("Option 2") { 
      public void actionPerformed(ActionEvent e) { 
       JOptionPane.showMessageDialog(frame, "Option 2 selected"); 
      } 
     })); 

     final JButton button = new JButton("Options"); 
     button.addMouseListener(new MouseAdapter() { 
      public void mousePressed(MouseEvent e) { 
       popup.show(e.getComponent(), e.getX(), e.getY()); 
      } 
     }); 
     toolBar.add(button); 

     frame.getContentPane().add(toolBar, BorderLayout.NORTH); 
     frame.pack(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
+0

我一直在做這樣的事情,但沒有JToolBar。您的解決方案是否存在這樣的行爲:如果您再次點擊該按鈕並重新打開菜單,它會再次彈出菜單,而不是忽略它? – 2009-11-07 15:08:17

+2

我也做了一些稍微不同的事情:popup.show(c,0,c.getHeight()); – 2009-11-07 15:09:33

+0

謝謝。這是我找到的最容易理解的解決方案,所以我會使用它,雖然它不完全是一個下拉JButton。其他解決方案太複雜,我不明白。我在下面列出了其中的一些。 Dikei 2009-11-07 16:15:26

2

我認爲這與AWT中的相同。

你應該在該按鈕上放一個ActionCommand,當它執行時根據鼠標座標顯示彈出菜單。

2

請參閱部分造就了彈出菜單How to Use Menus

+0

只是,這是更具體的鏈接:http://docs.oracle.com/javase/tutorial/uiswing/components/menu .html#popup – pratikabu 2013-06-07 15:15:53

14

我不明白爲什麼這比它需要更困難或爲什麼你應該使用MouseListener。史蒂夫麥克勞德的解決方案的工作,但菜單出現取決於鼠標點擊的地方。爲什麼不像通常用於JButton一樣使用ActionListener?看起來既不難也不難。

final JPopupMenu menu = new JPopupMenu(); 
menu.add(...whatever...); 

final JButton button = new JButton(); 
button.setText("My Menu"); 
button.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent ev) { 
     menu.show(button, button.getBounds().x, button.getBounds().y 
      + button.getBounds().height); 
    } 
}); 

這使菜單與我在JMenuBar中的菜單相同,位置一致。您可以通過修改menu.show()中的x和y來以不同的方式放置它。

+0

方法的問題是隻有在用戶釋放鼠標按鈕時纔會出現彈出式菜單。菜單應該出現在鼠標下方,而不是鼠標移動 – 2012-12-19 12:56:05

+0

你說得對。我沒有注意到。我仍然喜歡比其他方式更好,但都不完全令人滿意。我最終沒有實現我想要這樣做,所以也沒有使用它。我想你可以做你做的,並使用我的menu.show版本的按鈕座標,以避免位置不一致。 – 2012-12-20 19:11:08

+0

這是一個更好的答案,應該得到更多的選票。看起來比點擊鼠標位置好。 – rsman 2013-08-17 08:26:16

0

下面是一個簡單而漂亮的類

enter image description here

import javax.swing.JPopupMenu; 
import javax.swing.JToggleButton; 
import javax.swing.event.PopupMenuEvent; 
import javax.swing.event.PopupMenuListener; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 

public class MenuButton extends JToggleButton { 

    JPopupMenu popup; 

    public MenuButton(String name, JPopupMenu menu) { 
     super(name); 
     this.popup = menu; 
     addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent ev) { 
       JToggleButton b = MenuButton.this; 
       if (b.isSelected()) { 
        popup.show(b, 0, b.getBounds().height); 
       } else { 
        popup.setVisible(false); 
       } 
      } 
     }); 
     popup.addPopupMenuListener(new PopupMenuListener() { 
      @Override 
      public void popupMenuWillBecomeVisible(PopupMenuEvent e) {} 
      @Override 
      public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { 
       MenuButton.this.setSelected(false); 
      } 
      @Override 
      public void popupMenuCanceled(PopupMenuEvent e) {} 
     }); 
    } 
}