2010-08-12 8 views
5

मेरे एप्लिकेशन में एक मॉड्यूल है जो उपयोगकर्ता को रनटाइम के दौरान jLayeredpane पर jbuttons जोड़ने की अनुमति देता है। मैं इस गतिशील रूप से जोड़े गए सामग्रियों में एक्शन श्रोताओं को जोड़ना चाहता हूं और मुझे रनटाइम के दौरान गतिशील रूप से जोड़े गए बटन को हटाने के लिए भी पहुंच प्रदान करना है। क्या इसे करने का कोई तरीका है ?जावा स्विंग रनटाइम पर jButtons को जोड़ें/हटाएं

private Map<String, JButton> dynamicButtons; 

public void addButton(String name) { 
    JButton b = new JButton(name); 
    b.addActionListener(new java.awt.event.ActionListener() { 

     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      jButton1ActionPerformed(evt); 
     } 
    }); 

    jLayeredPane2.add(b); 
    dynamicButtons.put(name, b); 
    jLayeredPane2.invalidate(); 
} 

public void removeButton(String name) { 
    JButton b = dynamicButtons.remove(name); 
    jLayeredPane2.remove(b); 
    jLayeredPane2.invalidate(); 
} 
+0

पुन: स्वरूपित कोड; अगर गलत है तो कृपया वापस करें। – trashgod

+0

मेरे नवीनतम संपादन में कोड है जो आप क्लिक करते बटन जोड़ देंगे। और हटाएं पर क्लिक करने के बाद यदि आप उन पर क्लिक करते हैं तो बटन हटा दें। – jjnguy

उत्तर

10

मूल उत्तरसामान्य रूप में अच्छा है, लेकिन इस मामले

में अलग तरीके से आदेश में JButtons जोड़ा की एक मनमाना संख्या का ट्रैक रखने के लिए, आप उन्हें एक सूची में रखने के लिए की आवश्यकता होगी।

तो, एक नया बटन बनाने के बाद, श्रोताओं को इसमें जोड़ें, और इसे फलक में जोड़ें, फिर आपको उस सूची में उस नए बटन को सहेजने की आवश्यकता है।

इस तरह आप अपने द्वारा जोड़े गए सभी बटनों का ट्रैक रख सकते हैं।

आप Map<String, JButton> का भी उपयोग कर सकते हैं जो बटन पर बटन का नाम मानचित्र करता है।

उदाहरण:

private Map<String, JButton> dynamicButtons; 

public void addButton(String name) { 
    JButton b = new JButton(name); 
    b.addActionListener(someAction); 
    yourPanel.add(b); 
    dynamicButtons.put(name, b); 
    yourPanel.invalidate(); 
} 

public void removeButton(String name) { 
    Button b = dynamicButtons.remove(name); 
    yourPanel.remove(b); 
    yourPanel.invalidate(); 
} 

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

कोड:

import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.Point; 
import java.awt.Rectangle; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 

public class ExampleFrame extends JFrame { 

    private JButton add, remove; 
    private JPanel dynamicButtonPane, addRemovePane; 

    private boolean waitingForLocationClick; 

    public ExampleFrame() { 
     super("Dynamic button example"); 
     waitingForLocationClick = false; 
     add = new JButton("Add Button"); 
     add.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       addButton(JOptionPane 
         .showInputDialog("Name of the new button:")); 
      } 
     }); 
     remove = new JButton("Remove Button"); 
     remove.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       lookingToRemove = true; 
      } 
     }); 
     JPanel mainPane = new JPanel(new BorderLayout()); 
     dynamicButtonPane = new JPanel(); 
     dynamicButtonPane.setLayout(null); 
     dynamicButtonPane.setPreferredSize(new Dimension(300, 300)); 
     addRemovePane = new JPanel(); 
     addRemovePane.add(add); 
     addRemovePane.add(remove); 
     mainPane.add(dynamicButtonPane, BorderLayout.NORTH); 
     mainPane.add(addRemovePane, BorderLayout.SOUTH); 
     add(mainPane); 
     pack(); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setVisible(true); 
     dynamicButtonPane.addMouseListener(pointSelectorListener); 
    } 

    private JButton buttonToPlace; 

    public void addButton(String name) { 
     JButton b = new JButton(name); 
     b.setActionCommand(name); 
     b.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (lookingToRemove) { 
        if (e.getSource() instanceof JButton) { 
         dynamicButtonPane.remove((Component) e.getSource()); 
         dynamicButtonPane.validate(); 
         dynamicButtonPane.repaint(); 
        } 
       } else 
        JOptionPane.showMessageDialog(ExampleFrame.this, "This is " + e.getActionCommand()); 
      } 
     }); 
     waitingForLocationClick = true; 
     lookingToRemove = false; 
     buttonToPlace = b; 
    } 

    public void putButtonAtPoint(Point p) { 
     System.out.println("Placing a button at: " + p.toString()); 
     dynamicButtonPane.add(buttonToPlace); 
     buttonToPlace.setBounds(new Rectangle(p, buttonToPlace 
       .getPreferredSize())); 
     dynamicButtonPane.validate(); 
     buttonToPlace = null; 
     waitingForLocationClick = false; 
    } 

    private boolean lookingToRemove = false; 

    private final MouseListener pointSelectorListener = new MouseAdapter() { 
     @Override 
     public void mouseClicked(MouseEvent e) { 
      if (waitingForLocationClick) { 
       putButtonAtPoint(e.getPoint()); 
      } else { 
       System.out.println("Not in waiting state"); 
      } 
     } 
    }; 

    public static void main(String[] args) { 
     new ExampleFrame(); 
    } 
} 
+0

मैं स्विंग करने के लिए नया हूँ तो क्या आप थोड़ा सा विस्तार कर सकते हैं? यदि आप कोड नमूना के साथ समझाते हैं तो मैं सराहना करूंगा .. – Deepak

+0

@ दीपक, आपको अपने फ्रेम में 2 स्थिर बटन चाहिए। एक बटन जोड़ने के लिए एक, और एक बटन को हटाने के लिए एक। फिर आप उन दोनों बटनों पर एक एक्शन श्रोता जोड़ देंगे।ऐड बटन के लिए कार्रवाई 'एडबटन (स्ट्रिंग)' विधि होगी, और निकालें बटन के लिए कार्रवाई 'हटाएं बटन (स्ट्रिंग)' होगी। – jjnguy

+0

कोड स्पष्टीकरण के लिए धन्यवाद, बस मुझे बताएं कि मुझे यह कोड कहां जोड़ना चाहिए? क्या यह एक अलग वर्ग फ़ाइल में है या jframe फ़ाइल के साथ है? – Deepak

6

बिल्कुल। इन सभी चीजों को किसी भी समय प्रोग्रामेटिक रूप से किया जा सकता है।

  • आप किसी भी पैनल के लिए घटकों को जोड़ते हैं, इस SwingUtilities.invokeLater(Runnable) के माध्यम से घटना डिस्पैच थ्रेड पर किया जाता है सुनिश्चित करें: यहाँ संकेत के एक जोड़े की समस्याओं और नुकसान से बचने के लिए कर रहे हैं। रननेबल के अंदर, आप पैनल में घटक जोड़ना चाहते हैं, श्रोताओं को हुक अप करना चाहते हैं, और पैनल को फिर से लेआउट करना चाहते हैं।
  • यह देखने के लिए कि आप पहले से ही ईवेंट प्रेषण धागे पर हैं, SwingUtilities.isEventDispatchThread() का उपयोग करें। यदि आप हैं, तो आप invokeLater पर कॉल करने के बजाय तुरंत रननेबल चला सकते हैं।
  • एक बार जब आप किसी पैनल के लेआउट को संशोधित कर लेते हैं, तो यह सुनिश्चित करने के लिए पैनल पर Component.invalidate() पर कॉल करना सुनिश्चित करें कि यह फिर से बाहर हो जाता है।
  • श्रोताओं की अपनी सूची बनाए रखें। अपनी सूची से और सभी मौजूदा बटनों से उन्हें जोड़ने या हटाने के लिए पैनल पर विधियों को जोड़ें और हटाएं। जब आप नए बटन जोड़ते हैं, तो सूची में सभी श्रोताओं को जोड़ें।

यह एक बहुत ही आम कार्य है, और यह जावा द्वारा पूरी तरह से समर्थित है। आपको बिना किसी परेशानी के इसे पूरा करने में सक्षम होना चाहिए।

+0

मुझे पता है कि हम यह कर सकते हैं लेकिन मैं अवधारणाओं को स्विंग करने के लिए नया हूं इसलिए मुझे बहुत कुछ पता नहीं चला। मेरे पास एक और मुद्दा है जो मुझे अलग-अलग नाम देने की ज़रूरत है बटन बनाए गए हैं। क्या आप इसे कोड नमूना में समझा सकते हैं? या सिर्फ अनुसरण करने के लिए एक लिंक दें। मुझे अपने मूल प्रश्न के लिए भी कोड नमूना चाहिए। – Deepak

+0

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

+3

असल में, वहां हैं बहुत सी चीजें चल रही हैं। आपने उत्तर में कई चलने वाले हिस्सों के साथ एक बहुत ही उच्च स्तरीय प्रश्न पूछा है। यह सिर्फ एक प्रश्न के लिए लिखने के लिए बहुत अधिक कोड है। मैं अत्यधिक अनुशंसा करता हूं कि आप इसे स्वयं आज़माएं और पूछें अगर आप कुछ के साथ अटक जाते हैं तो सवाल नहीं। –