2011-02-10 36 views
14

मेरे पास JFrame में कुछ घटक हैं जो मैं को किसी अन्य JFrame में संदर्भित करना चाहता हूं और मैं को नाम से प्राप्त करना चाहता हूं और प्रत्येक के लिए सार्वजनिक प्राप्त/सेट विधियां नहीं करता।नाम से एक स्विंग घटक प्राप्त करें

स्विंग से अपने नाम से घटक संदर्भ प्राप्त करने का कोई तरीका है जैसे C#?

उदा। form.Controls["text"]

धन्यवाद

+1

Window.getWindows() और फिर स्कैन करें जो आपको चाहिए – bestsss

+1

दुनिया में आप ऐसा क्यों करना चाहेंगे?ऐसा करके, आप दो महत्वपूर्ण स्थिर कंपाइलर चेक खो देते हैं: - सबसे पहले, फ़ील्ड मौजूद है। - दूसरा, यह सही प्रकार का है। इसके अलावा, गतिशील लुकअप क्षेत्र के संदर्भ के मुकाबले धीमी है। – fortran

+0

उदाहरण के लिए, डरावनी एपीआई की वजह से, जहां आपके पास कुछ घटकों तक प्रत्यक्ष पहुंच नहीं है, जिन्हें आप संशोधित करना चाहते हैं। –

उत्तर

27

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैंने खुद को अभी यह पूछ लिया। मैं नाम से घटक प्राप्त करने का एक आसान तरीका चाहता था इसलिए मुझे विभिन्न घटकों तक पहुंचने के लिए हर बार कुछ ठोस कोड लिखना नहीं था। उदाहरण के लिए, एक जेबटन को टेक्स्ट फ़ील्ड में टेक्स्ट या किसी सूची में चयन तक पहुंच प्राप्त होती है।

सबसे आसान समाधान सभी घटक चर वर्ग वर्ग चर बनाने के लिए है ताकि आप उन्हें कहीं भी एक्सेस कर सकें। हालांकि, हर कोई ऐसा नहीं करना चाहता, और कुछ (जैसे खुद) जीयूआई संपादकों का उपयोग कर रहे हैं जो घटकों को वर्ग चर के रूप में उत्पन्न नहीं करते हैं।

मेरा समाधान सरल है, मैं सोचना चाहता हूं, और वास्तव में किसी भी प्रोग्रामिंग मानकों का उल्लंघन नहीं करता, जहां तक ​​मुझे पता है (संदर्भ में फोर्ट्रान क्या हो रहा था)। यह नाम से घटकों तक पहुंचने के लिए एक आसान और सीधा तरीका प्रदान करता है।

  1. मानचित्र क्लास चर बनाएँ। आपको पर कम से कम हैश मैप आयात करने की आवश्यकता होगी। मैंने सादगी के लिए मेरा घटक मैप नाम दिया।

    private HashMap componentMap; 
    
  2. सामान्य रूप में फ्रेम करने के लिए अपने सभी घटकों को जोड़ें।

    initialize() { 
        //add your components and be sure 
        //to name them. 
        ... 
        //after adding all the components, 
        //call this method we're about to create. 
        createComponentMap(); 
    } 
    
  3. अपनी कक्षा में निम्नलिखित दो विधियों को परिभाषित करें।

    private void createComponentMap() { 
         componentMap = new HashMap<String,Component>(); 
         Component[] components = yourForm.getContentPane().getComponents(); 
         for (int i=0; i < components.length; i++) { 
           componentMap.put(components[i].getName(), components[i]); 
         } 
    } 
    
    public Component getComponentByName(String name) { 
         if (componentMap.containsKey(name)) { 
           return (Component) componentMap.get(name); 
         } 
         else return null; 
    } 
    
  4. अब आप एक HashMap कि अपने नाम करने के लिए अपने फ्रेम/सामग्री फलक/पैनल/आदि में सभी वर्तमान में मौजूदा घटकों के नक्शे मिल गया है: अगर आप पहले से ही नहीं है, तो आप घटक आयात करना होगा ।

  5. अब इन घटकों तक पहुंचने के लिए, यह कॉम्पोनेंटबीनाम (स्ट्रिंग नाम) प्राप्त करने के लिए कॉल के रूप में सरल है। यदि उस नाम वाला कोई घटक मौजूद है, तो वह उस घटक को वापस कर देगा। यदि नहीं, तो यह शून्य हो जाता है। घटक को उचित प्रकार में डालने की आपकी ज़िम्मेदारी है। मैं निश्चित रूप से सुनिश्चित करने के लिए उदाहरण का उपयोग करने का सुझाव देते हैं।

आप रनटाइम के दौरान किसी भी बिंदु पर जोड़कर, निकालकर, या नाम बदलने घटकों पर योजना है, मैं तरीकों अपने परिवर्तनों के अनुसार HashMap संशोधित कि जोड़ने पर विचार होगा।

+0

हाँ मुझे लगता है कि यह एक अच्छा समाधान है। कोड के लिए धन्यवाद :) – xdevel2000

+1

मुझे अपने रूप में जंजीर जेपीनेल के साथ समस्याएं थीं। ; \t निजी घटक getComponentByName (स्ट्रिंग नाम) { \t \t वापसी getComponentByName (। GetMainFrame() getRootPane(), नाम): तो एक से थोड़ा modivied संस्करण भी युक्त कंटेनर के माध्यम से चलता है \t} \t \t निजी घटक getComponentByName (कंटेनर जड़, स्ट्रिंग नाम) के लिए { \t \t (घटक सी: root.getComponents()) { \t \t \t अगर (name.equals (c.getName())) { \t \t \t \t वापसी सी; \t \t \t} \t \t \t (ग कंटेनर instanceof) यदि { \t \t \t \t घटक परिणाम = getComponentByName ((कंटेनर) ग, नाम); \t \t \t \t अगर (परिणाम = अशक्त!) { \t \t \t \t \t वापसी परिणाम; \t \t \t \t} \t \t \t} \t \t} \t \t वापसी अशक्त; \t} –

+0

सरल और सुरुचिपूर्ण – kazy

1

आप एक चर के रूप में एक सार्वजनिक एक तो पाठ या जो कुछ भी आपरेशन आप चाहते घोषणा कर सकते हैं और फिर आप अन्य फ्रेम में इसे का उपयोग कर सकते हैं (अगर एक ही पैकेज में अपनी) क्योंकि यह सार्वजनिक है।

2

आप दूसरे जेएफआरएम में पहले जेएफआरएएम का संदर्भ ले सकते हैं और केवल प्रत्येक तत्व के नाम की जांच कर JFrame.getComponents() के माध्यम से लूप कर सकते हैं।

6

प्रत्येक Component का नाम हो सकता है, getName() और setName() के माध्यम से उपयोग किया जा सकता है, लेकिन आपको अपना स्वयं का लुकअप फ़ंक्शन लिखना होगा।

4

getComponentByName (फ्रेम, नाम)

आप NetBeans या किसी अन्य आईडीई कि डिफ़ॉल्ट रूप से निजी चर (क्षेत्रों) बनाता है अपने AWT/स्विंग के सभी घटकों धारण करने के लिए उपयोग कर रहे हैं, उसके बाद निम्न कोड काम कर सकते हैं तुम्हारे लिए। इस प्रकार का उपयोग करें:

// get a button (or other component) by name 
JButton button = Awt1.getComponentByName(someOtherFrame, "jButton1"); 

// do something useful with it (like toggle it's enabled state) 
button.setEnabled(!button.isEnabled()); 

यहाँ ऊपर संभव बनाने के लिए कोड है ...

import java.awt.Component; 
import java.awt.Window; 
import java.lang.reflect.Field; 

/** 
* additional utilities for working with AWT/Swing. 
* this is a single method for demo purposes. 
* recommended to be combined into a single class 
* module with other similar methods, 
* e.g. MySwingUtilities 
* 
* @author http://javajon.blogspot.com/2013/07/java-awtswing-getcomponentbynamewindow.html 
*/ 
public class Awt1 { 

    /** 
    * attempts to retrieve a component from a JFrame or JDialog using the name 
    * of the private variable that NetBeans (or other IDE) created to refer to 
    * it in code. 
    * @param <T> Generics allow easier casting from the calling side. 
    * @param window JFrame or JDialog containing component 
    * @param name name of the private field variable, case sensitive 
    * @return null if no match, otherwise a component. 
    */ 
    @SuppressWarnings("unchecked") 
    static public <T extends Component> T getComponentByName(Window window, String name) { 

     // loop through all of the class fields on that form 
     for (Field field : window.getClass().getDeclaredFields()) { 

      try { 
       // let us look at private fields, please 
       field.setAccessible(true); 

       // compare the variable name to the name passed in 
       if (name.equals(field.getName())) { 

        // get a potential match (assuming correct &lt;T&gt;ype) 
        final Object potentialMatch = field.get(window); 

        // cast and return the component 
        return (T) potentialMatch; 
       } 

      } catch (SecurityException | IllegalArgumentException 
        | IllegalAccessException ex) { 

       // ignore exceptions 
      } 

     } 

     // no match found 
     return null; 
    } 

} 

यह प्रतिबिंब का उपयोग करता वर्ग क्षेत्रों के माध्यम से देखने के लिए यह एक घटक है कि कहा जाता है मिल सकता है देखने के लिए एक ही नाम के एक चर द्वारा।

नोट: उपरोक्त कोड जेनिक्स का उपयोग परिणामों को कास्ट करने के लिए करता है ताकि आप जो भी प्रकार की उम्मीद कर रहे हों, इसलिए कुछ मामलों में आपको टाइप कास्टिंग के बारे में स्पष्ट होना पड़ सकता है। उदाहरण के लिए यदि myOverloadedMethod दोनों JButton और JTextField, आप स्पष्ट रूप से अधिभार आप कॉल करना चाहते परिभाषित करने के लिए आवश्यकता हो सकती है ...

myOverloadedMethod((JButton) Awt1.getComponentByName(someOtherFrame, "jButton1")); 

स्वीकार करता है और अगर आप सुनिश्चित नहीं हैं, तो आप एक Component हो और instanceof साथ यह जाँच कर सकते हैं ...

// get a component and make sure it's a JButton before using it 
Component component = Awt1.getComponentByName(someOtherFrame, "jButton1"); 
if (component instanceof JButton) { 
    JButton button = (JButton) component; 
    // do more stuff here with button 
} 

आशा है कि इससे मदद मिलती है!

1

मुझे कई JPanel एस के अंदर तत्वों तक पहुंचने की आवश्यकता थी जो एक JFrame के अंदर थे।

@Jesse स्ट्रीकलैंड एक महान उत्तर पोस्ट है, लेकिन उपलब्ध कराई कोड किसी भी नेस्टेड तत्वों (, मेरे मामले में की तरह JPanel अंदर) उपयोग करने में सक्षम नहीं है।

अतिरिक्त Googling के बाद मुझे @aioobe here द्वारा प्रदान की गई यह रिकर्सिव विधि मिली। कोड की

private void createComponentMap() { 
    componentMap = new HashMap<String,Component>(); 
    List<Component> components = getAllComponents(this); 
    for (Component comp : components) { 
     componentMap.put(comp.getName(), comp); 
    } 
} 

private List<Component> getAllComponents(final Container c) { 
    Component[] comps = c.getComponents(); 
    List<Component> compList = new ArrayList<Component>(); 
    for (Component comp : comps) { 
     compList.add(comp); 
     if (comp instanceof Container) 
      compList.addAll(getAllComponents((Container) comp)); 
    } 
    return compList; 
} 

public Component getComponentByName(String name) { 
    if (componentMap.containsKey(name)) { 
     return (Component) componentMap.get(name); 
    } 
    else return null; 
} 

प्रयोग है:

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

0

यदि आपके घटकों को उसी कक्षा के अंदर घोषित किया गया है, तो आप उन्हें जोड़ रहे हैं, आप इन घटकों को वर्ग के नाम के गुणों के रूप में एक्सेस करते हैं।

public class TheDigitalClock { 

    private static ClockLabel timeLable = new ClockLabel("timeH"); 
    private static ClockLabel timeLable2 = new ClockLabel("timeM"); 
    private static ClockLabel timeLable3 = new ClockLabel("timeAP"); 


    ... 
    ... 
    ... 


      public void actionPerformed(ActionEvent e) 
      { 
       ... 
       ... 
       ... 
        //set all components transparent 
        TheDigitalClock.timeLable.setBorder(null); 
        TheDigitalClock.timeLable.setOpaque(false); 
        TheDigitalClock.timeLable.repaint(); 

        ... 
        ... 
        ... 

       } 
    ... 
    ... 
    ... 
} 

और, आप एक ही नाम स्थान भी में अन्य वर्गों से वर्ग के नाम की विशेषताओं के रूप में वर्ग घटकों उपयोग करने में सक्षम हो सकता है। मैं संरक्षित विशेषताओं (वर्ग सदस्य चर) तक पहुंच सकता हूं, शायद आप सार्वजनिक घटकों तक भी पहुंच सकते हैं। कोशिश करो!

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