2010-10-27 13 views
10

एक स्कूल परियोजना के लिए साथ-साथ, मैं एक साधारण रंग अनुप्रयोग है कि लाइनों, अंडाकार, और आयतों आकर्षित कर सकते हैं बनाने की जरूरत है।घुमाओ: लिंक टॉगल एक बटन समूह के साथ बटन, इसी मेनू आइटम

असाइनमेंट निर्दिष्ट करता है कि मुझे प्रत्येक प्रकार के आकार के लिए टूलबार बटन और मेनू आइटम की आवश्यकता है।

टूलबार में बटन JToggleButtons बटन और मेनू आइटम JRadioButtonMenuItems बनाकर मैं थोड़ा ऊपर और परे जाना चाहता हूं। इसके अलावा, मुझे यह चाहिए कि जब आप टूलबार बटनों में से किसी एक को चुनते हैं, तो यह अन्य लोगों को अचयनित करता है, उचित मेनू आइटम का चयन करता है, और अन्य मेनू आइटम को अचयनित करता है। मेनू आइटमों में से किसी एक को चुनने के लिए वही।

मुझे पता है कि मैं किसी भी AbstractButton को ButtonGroup के साथ समूहित कर सकता हूं, लेकिन मुझे यकीन नहीं है कि यह जाने का सही तरीका है, क्योंकि यह बटनों के एक "समूह" को ठीक से संभालता है, मुझे यकीन नहीं है कि यह दो को संभाल सकता है समांतर समूह

ButtonGroup के बिना इसे करने का मतलब 6 ईवेंट श्रोताओं में से प्रत्येक में होगा, मुझे अन्य बटन मैन्युअल रूप से अचयनित करना होगा, और प्रत्येक जोड़ी आकार के प्रकार को सेट करने के लिए एक ही कोड को कॉल करेगी।

मैं भी दो ButtonGroup रों, मेनू के लिए एक, उपकरण पट्टी के लिए एक बना सकता है, लेकिन फिर मैं भी आकार प्रकार सेटिंग कोड नकल करने की है।

किसी भी स्थिति में, मैं मेनू को एक बटन सेट करने का जोखिम भी चलाता हूं जो एक मेनू आइटम सेट करता है जो एक बटन सेट करता है, विज्ञापन infintum।

सबसे अच्छा तरीका है इस समस्या से निपटने के लिए क्या है?

(Netbeans जीयूआई डिजाइनर के साथ समस्या को हल करने में सक्षम होने के लिए बोनस अंक, यह सिर्फ आसान है)

+5

जीयूआई डिजाइनर के बिना इसे करने के लिए बोनस अंक। आप अपना समय जावा सीखने में व्यतीत करते हैं जो पोर्टेबल है, बल्कि आईडीई जो नहीं है। – camickr

+0

@camickr - मैं वास्तव में एक आईडीई पर टेक्स्टमैट और टर्मिनल का उपयोग करना पसंद करता हूं, यह सिर्फ इतना है कि जीयूआई डिजाइनर चीजें * बहुत * तेज बनाता है। मेरा मुद्दा यह था कि मैं इसे डिजाइनर में हल कर दूंगा और देख सकता हूं कि ऑटो-जेनरेट कोड और संपादन घंटों को संपादित करने के माध्यम से संघर्ष करने के बजाय यह कैसे किया गया था कि छोटी चीजें क्यों काम नहीं करतीं। –

उत्तर

18

Action इंटरफ़ेस एक प्रभावी तरीका है "यदि आप दो या अधिक घटकों है कि एक ही समारोह में प्रदर्शन किया है," जैसा कि How to Use Actions में चर्चा की गई है। विशेष रूप से, Action आपके बटन और मेनू आइटम को एक ही कोड का उपयोग करने की अनुमति देगा।

अनुपूरक: नीचे दिया गया उदाहरण दिखाता है कि JMenu और JToolBar कई फ़ाइलों में से प्रत्येक के लिए Action साझा कर सकता है।

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.io.File; 
import javax.swing.AbstractAction; 
import javax.swing.Action; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JToolBar; 

/** @see http://stackoverflow.com/questions/4038605 */ 
public class FileMenu { 

    public static void main(String[] args) { 

     EventQueue.invokeLater(new Runnable() { 

      public void run() { 
       new FileMenu().create(); 
      } 
     }); 
    } 

    void create() { 
     File userDir = new File(System.getProperty("user.dir")); 
     File[] files = userDir.listFiles(); 

     JMenu menu = new JMenu("Recent Files"); 
     JToolBar toolBar = new JToolBar(JToolBar.VERTICAL); 
     JLabel label = new JLabel(" ", JLabel.CENTER); 
     for (File f : files) { 
      if (f.isFile() && !f.isHidden()) { 
       RecentFile rf = new RecentFile(f, label); 
       menu.add(new JMenuItem(rf.getAction())); 
       toolBar.add(rf.getAction()); 
      } 
     } 
     JMenuBar menuBar = new JMenuBar(); 
     menuBar.add(menu); 

     JFrame f = new JFrame("FileMenu"); 
     f.setJMenuBar(menuBar); 
     f.add(toolBar, BorderLayout.CENTER); 
     f.add(label, BorderLayout.SOUTH); 
     f.pack(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 
} 

class RecentFile extends AbstractAction { 

    private final File file; 
    private final JLabel label; 

    public RecentFile(final File file, final JLabel label) { 
     this.file = file; 
     this.label = label; 
     this.putValue(Action.NAME, file.getName()); 
     this.putValue(Action.SHORT_DESCRIPTION, file.getAbsolutePath()); 
    } 

    public void actionPerformed(ActionEvent e) { 
     label.setText(file.getName()); 

    } 

    public Action getAction() { 
     return this; 
    } 
} 
+3

+1, क्रियाएं एक्शनलिस्टर के रूप में लिखना उतनी आसान होती हैं लेकिन अधिक समग्र कार्यक्षमता प्रदान करती हैं। – camickr

+2

अगर आपके पास इस कोड में उपकरण पट्टी पर (rf.getAction()) और न सिर्फ (आरएफ) जोड़ने व्याख्या कर सकते हैं: 'toolBar.add (rf.getAction());', साथ ही ऊपर लाइन में? –

+2

@userunknown: अच्छा सवाल; ऐसा लगता है कि मैंने इसे एक और उदाहरण से अनुकूलित किया है जो विस्तार के बजाय संरचना का उपयोग करता है। – trashgod

संबंधित मुद्दे