2009-11-07 7 views
32

私のアプリケーションにツールバーを作成したいと思います。そのツールバーのボタンをクリックすると、Eclipseのツールバーのようにメニューがポップアップ表示されます。私はSwingでこれを行う方法を知らない。誰かが私を助けることができますか?私はGoogleを試しましたが、何も見つかりませんでした。メニューを使用してJButtonを作成する方法は?

答えて

30

これは、スイングで必要以上に難しいことです。だからチュートリアルを指すのではなく、私は完全に実用的な例を作りました。

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はありません。あなたのソリューションには、メニューを上にしてもう一度ボタンをクリックすると、それを解除するのではなくメニューを再びポップアップさせるという動作がありますか? –

+2

私もやや違ったことをしました:popup.show(c、0、c.getHeight()); –

+0

ありがとうございます。これは私が見つけた解決策を理解するのが一番簡単なので、それを使ってみましょうが、それはまさにDropdown JButtonではありません。他の解決策は私が理解するには複雑すぎます。私はそれらのいくつかを以下に挙げます。 Dikei

2

AWTと同じだと思います。

ボタンにActionCommandを配置し、実行時にマウスの座標に応じてポップアップメニューを表示する必要があります。

2

はセクションが育て参照してください。ポップアップメニューHow to Use Menus

+0

シンプルで素敵なクラスであります.html#popup – pratikabu

14

これはなぜ必要以上に難しいのか、なぜMouseListenerを使用するのかわかりません。 Steve McLeodのソリューションは機能しますが、メニューが表示される場所はマウスがクリックされた場所によって異なります。 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を変更することによって、別の場所に配置することができます。 http://docs.oracle.com/javase/tutorial/uiswing/components/menu:ここ

+0

アプローチの問題は、ポップアップメニューがユーザーがマウスボタンを離したときにのみ表示されることです。メニューがマウスダウン時に表示され、マウスアップ時には表示されません。 –

+0

あなたが正しいです。私は気付かなかった。私はまだそれを他の方法よりも好きですが、どちらも完全に満足です。私はそのようにしようとしていたものを実装しなかったので、とにかくそれを使用しませんでした。私は、あなたがやったことをやって、位置の不一致を避けるためにボタン座標でmenu.showの私のバージョンを使うことができると思います。 –

+0

これははるかに良い答えであり、より多くの票を得るべきです。マウスのクリック位置よりもよく見えます。 – rsman

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) {} 
     }); 
    } 
}