2009-11-07 17 views
32

मैं अपने आवेदन में एक टूलबार बनाना चाहता हूं। यदि आप उस टूलबार पर एक बटन पर क्लिक करते हैं, तो यह एक मेनू पॉप अप करेगा, जैसे एक्लिप्स के टूलबार में। मुझे नहीं पता कि स्विंग में ऐसा कैसे करें। कृपया क्या कोई मेरी मदद कर सकता है? मैंने Google की कोशिश की है लेकिन कुछ भी नहीं मिला।मेनू के साथ जेबटन कैसे बनाएं?

उत्तर

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

धन्यवाद। मुझे जो समाधान मिला है, उसे समझना सबसे आसान है, इसलिए मैं इसका उपयोग करूंगा हालांकि यह वास्तव में ड्रॉपडाउन जेबटन नहीं है। अन्य समाधान मुझे समझने के लिए बहुत जटिल हैं। मैंने उनमें से कुछ को नीचे सूचीबद्ध किया है। Dikei

2

मुझे लगता है कि यह एडब्ल्यूटी में जैसा ही है।

आपको उस बटन पर एक्शनकॉमैंड रखना चाहिए और जब इसे निष्पादित किया जाता है तो माउस निर्देशांक के अनुसार पॉप-अप मेनू दिखाएं।

1

मुझे यकीन है कि मैं तुम्हें सही ढंग से समझ, लेकिन अगर आप जानना चाहते हैं कि स्विंग जाँच में टूलबार बनाना चाहते नहीं कर रहा हूँ इस

Java Tutorials: How to Use Tool Bars और इस

Java Tutorials: How to Use Actions

2

अनुभाग परवरिश एक पॉपअप मेनू, How to Use Menus में।

+0

सिर्फ इतना है कि इस अधिक विशिष्ट लिंक है: http://docs.oracle.com/javase/tutorial/uiswing/components/menu .html # पॉपअप – pratikabu

14

मुझे नहीं लगता कि यह क्यों कठिन है या आपको माउसलिस्टर का उपयोग क्यों करना चाहिए। स्टीव मैकिलोड द्वारा समाधान काम करता है, लेकिन जहां मेनू प्रकट होता है उस पर निर्भर करता है कि माउस कहां क्लिक किया गया था। सामान्य रूप से जेबटन के लिए उपयोग किए जाने वाले एक्शनलिस्टर का उपयोग क्यों न करें। ऐसा लगता है कि न तो कठिन और न ही कम कठिन है।

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 में एक मेनू के रूप में ही बारे में मेनू की स्थिति और स्थिति अनुरूप है। आप मेनू और x में x और y को संशोधित करके इसे अलग-अलग रख सकते हैं।

+0

दृष्टिकोण के साथ समस्या यह है कि पॉपअप मेनू केवल तब प्रकट होता है जब उपयोगकर्ता माउस बटन जारी करता है। मेनू माउस पर दिखाई देना चाहिए, माउस नहीं –

+0

आप सही हैं। मैंने ध्यान नहीं दिया। मुझे अभी भी इसे दूसरी तरह से बेहतर पसंद है, लेकिन न तो पूरी तरह से संतोषजनक है। मैं उस तरीके को लागू नहीं कर रहा था जिसे मैं इस तरह से करने की कोशिश कर रहा था और इसलिए इसे किसी भी तरह से उपयोग नहीं किया। मुझे लगता है कि आप जो भी कर चुके थे वह कर सकते थे और स्थिति के असंगतता से बचने के लिए बटन निर्देशांक के साथ मेनू के मेरे संस्करण का उपयोग कर सकते हैं। –

+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) {} 
     }); 
    } 
} 
संबंधित मुद्दे