2012-09-25 12 views
6

मैंने कुछ जेपीनल को किसी अन्य जेपीनल में रखा है जिसका 'लेआउट बॉक्स लेआउट और वाई-एक्सिस है। मैंने सभी पैनलों को रखने के बाद मुझे जेपीनेल कंटेनर पैनल से प्रत्येक जोड़ा जेपीनल की वाई स्थिति प्राप्त करने की आवश्यकता है। लेकिन, जब मैं इसे प्राप्त करने का प्रयास करता हूं तो मुझे हमेशा प्रत्येक जेपीनेल की वाई स्थिति के लिए शून्य मिलता है। कृपया मुझे बताएं कि जेपीनेल कंटेनर जेपीनल से प्रत्येक जेपीएलएल की वाई स्थिति कैसे प्राप्त करें।स्विंग घटक का स्थान प्राप्त करें

यह मैं क्या किया है,

JPanel panelHolder = new JPanel(new BoxLayout(this, BoxLayout.Y_AXIS)); 
for(int i = 0; i< 10; i++){ 
    JPanel p = new JPanel(); 
    panelHolder.add(p); 
} 

int componentCount = panelHolder.getComponentCount(); 

for (int j = 0; i < componentCount ; j++) { 

    Component c = pnlRowHolder.getComponent(i); 
    JPanel p = (JPanel)c; 
    System.out.println(p.getY());//I get zero for all 
} 
+9

_after_ देखने का प्रयास करें 'मान्य()' या 'पैक()'; साथ ही, [एसएससीई] (http://sscce.org/) शामिल करने के लिए अपना प्रश्न संपादित करें जो आपका दृष्टिकोण दिखाता है। – trashgod

उत्तर

3

इस प्रकार आप एक्स प्राप्त करने के लिए अनुमति देता है अपने JPanelJFrame रों contentPane में जोड़े और वाई getX() और get() का उपयोग कर हालांकि मैं सभी जोड़ने का सुझाव था सह तालमेल घटक पहले, क्योंकि अंक बदल सकते हैं क्योंकि अधिक घटकों को जोड़ा जाता है और फिर ट्रैशगोड ने कहा कि फ्रेम उदाहरण पर pack() पर कॉल करें।

import java.awt.BorderLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class Test { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new Test().createAndShowUI(); 
      } 
     }); 
    } 

    private void createAndShowUI() { 
     JFrame frame = new JFrame("Test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setResizable(false); 
     initComponents(frame); 

     frame.pack();//call pack 

     printPanelCompPoints(mainPanel);//produces correct coords 

     frame.setVisible(true); 
    } 

    private JPanel mainPanel; 

    private void initComponents(JFrame frame) { 
     mainPanel = new JPanel(new BorderLayout()); 
     JPanel centerPanel = new JPanel(); 
     JPanel northPanel = new JPanel(); 
     JPanel southPanel = new JPanel(); 
     JPanel westPanel = new JPanel(); 
     JPanel eastPanel = new JPanel(); 

     centerPanel.add(new JLabel("CENTER")); 
     northPanel.add(new JLabel("NORTH")); 
     eastPanel.add(new JLabel("EAST")); 
     southPanel.add(new JLabel("SOUTH")); 
     westPanel.add(new JLabel("WEST")); 

     mainPanel.add(centerPanel, BorderLayout.CENTER); 
     mainPanel.add(northPanel, BorderLayout.NORTH); 
     mainPanel.add(southPanel, BorderLayout.SOUTH); 
     mainPanel.add(eastPanel, BorderLayout.EAST); 
     mainPanel.add(westPanel, BorderLayout.WEST); 

     frame.getContentPane().add(mainPanel); 

     printPanelCompPoints(mainPanel);//produces all 0's 
    } 

    private void printPanelCompPoints(JPanel mainPanel) { 
     for (int i = 0; i < mainPanel.getComponentCount(); i++) { 
      System.out.println(mainPanel.getComponent(i).getX() + ", " + mainPanel.getComponent(i).getY()); 
     } 
    } 
} 

आपको बुला रहा initComponents(JFrame frame) में printPanelCompPoints(mainPanel); पैदा करता है सभी 0 की, (के रूप में वे फ्रेम में जोड़ा गया है लेकिन `पैक() कहा जाता है नहीं किया गया है) देख सकते हैं:

मैं प्रदर्शित करने के लिए एक छोटा नमूना किया ।

0, 0

0, 0

0, 0

0, 0

0, 0

createAndShowUI() में

तथापि pack() बुला के बाद JFrame एस इंस्टा पर nce printPanelCompPoints(mainPanel); बुला पैदा करता है सही सह odrinates:

44, 26

0, 0

0, 52

99, 26

0, 26

4

समन्वय उनके माता-पिता के सापेक्ष हैं। आपके उदाहरण में, सभी बाल घटकों को मूल कंटेनर के शीर्ष पर जोड़ा जा रहा है, जिससे y स्थिति 0 (उनके माता-पिता के सापेक्ष) बनती है।

पैरेंट कंटेनर में खाली सीमा जोड़ने का प्रयास करें, आपको वाई स्थिति परिवर्तन देखना चाहिए।

आप SwingUtilities.convertPoint उपयोग कर सकते हैं परिवर्तित करने के लिए के बीच सिस्टम

3

पैक स्थिति होने से पहले फ्रेम समन्वय। ऐसा लगता है कि जब तक आप पैक नहीं करते हैं, तब तक सबकुछ मूल (0,0) से शुरू होने पर एक-दूसरे को ओवरलैप करता है।

यहाँ एक काम कर कोड है:

import java.awt.Component; 
import java.awt.Dimension; 
import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class TestBoxLayout { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 

     JPanel panelHolder = new JPanel(); 
     panelHolder.setLayout(new BoxLayout(panelHolder, BoxLayout.Y_AXIS)); 

     for (int i = 0; i < 10; i++) { 
      JPanel p = new JPanel(); 
      p.setPreferredSize(new Dimension(100, 13)); //I set the height just to make sure. 
      panelHolder.add(p); 
     } 
     frame.add(panelHolder); 

     /** 
     * Pack before you get the position. 
     */ 
     frame.pack(); 

     int componentCount = panelHolder.getComponentCount(); 
     for (int j = 0; j < componentCount; j++) { 
      Component c = panelHolder.getComponent(j); 
      JPanel p = (JPanel) c; 
      System.out.println(p.getY());//I get 0, 13, 26, 39, ..... 
     } 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 

परिणाम:

0 
13 
26 
39 
52 
65 
78 
91 
104 
117 

नोट: BoxLayout के लिए हस्ताक्षर BoxLayout(Container target, int axis) है। target वह सामान है जिसे आप अपना लेआउट सेट कर रहे हैं। इस कारण से, यदि आप BoxLayout का उपयोग करना चाहते हैं, तो आपको हमेशा पहले पैनल बनाना चाहिए। फिर component.setLayout() का उपयोग करें ताकि लक्ष्य पहले से मौजूद हो। आपके जेपीनेल कन्स्ट्रक्टर में this कुछ और का जिक्र कर रहा था, panelHolder नहीं। मुझे लगता है कि जिस वर्ग में आपने यह फ़ंक्शन बनाया है वह Container का उप-वर्ग भी है और यही कारण है कि आपको कोई त्रुटि नहीं मिली।

+0

+1 सच के करीब है, [लेकिन डिफ़ॉल्ट रूप से XxxSize सेट करने का कारण नहीं है] (http://stackoverflow.com/questions/7229226/should-i-avoid-the-use-of-setpreferredmaximumminimumsize-methods- इन-जावा-स्विई) – mKorbel

+0

@mKorbel आमतौर पर, मैंने लेआउट मैनेजर को घटकों के पसंदीदा आकार को व्यवस्थित करने दिया। मैंने केवल एक अलग संख्या के साथ परीक्षण करने के लिए 'setPreferredSize' का उपयोग किया। इसके बिना, मुझे '0,10,20 मिल गया, ... जो अभी भी सही है। – davidXYZ

+0

हेहेहे ... कृपया प्रश्न दोबारा पढ़ें :-) – mKorbel

1

कृपया मुझे बताएं कि जेपीनेल कंटेनर जेपीनेल से प्रत्येक जेपनेल की वाई स्थिति कैसे प्राप्त करें।

  • BoxLayout (इस मामले में Preferred) XxxSize को स्वीकार है कि इसके बच्चे को देता है,

  • JPanel रिटर्न (0, 0) इस सही मान

  • इस या simlair परिणाम आप कर सकते हैं है LayoutManager से प्राप्त करें, उदाहरण के लिए JPanel (केवल PreferredSiz ई स्वीकार करते हुए) के लिए, समान निर्देशांक (0, 0)

  • वहाँ केवल मामले कि CENTER area कुछ JComponent

  • JPanel के लिए प्रयोग किया जाता है में उत्पन्न छोड़कर BorderLayout तो है 10pixels (डब्ल्यू, ई, एन, एस क्षेत्रों के लिए), और वैध Container और खाली JPanel कर रहा है डिफ़ॉल्ट रूप स्क्रीन पर शून्य आकार,

  • JPanel रिटर्न के लिए कर सकते हैं उचित निर्देशांक रिटर्न से अगर कोई JComponent है या आपमें XxxSize ओवरराइडकन्स्ट्रक्टर

0

समस्या यह अक्सर होती है कि लेआउट या ड्राइंग पूरी विधि लौटने के बाद ही की जाती है। उस मामले, getX और getY वापसी 0.

में यह JPanel आप पर काम कर रहे पर फ्रेम खिड़की पर pack(), या doLayout() या validate() कॉल करने के लिए मदद मिल सकती है। लेकिन अक्सर यह मदद नहीं करता है, क्योंकि आप आंतरिक शेड्यूलिंग पर थोड़ा प्रभाव है: http://www.oracle.com/technetwork/java/painting-140037.html

क्या मुझे इस मामले में मदद करता है हिस्सा है जहाँ मैं एक्स और एक कार्यकर्ता धागा में वाई स्थान की जरूरत है डाल करने के लिए है:

JPanel panelHolder = new JPanel(new BoxLayout(this, BoxLayout.Y_AXIS)); 
for(int i = 0; i< 10; i++){ 
    JPanel p = new JPanel(); 
    panelHolder.add(p); 
} 

int componentCount = panelHolder.getComponentCount(); 

SwingUtilities.invokeLater(new Runnable() {   
    @Override 
    public void run() { 
     for (int j = 0; i < componentCount; j++) {  
      Component c = pnlRowHolder.getComponent(i); 
      JPanel p = (JPanel) c; 
      System.out.println(p.getY()); 
     } 
    } 
}); 

इस तरह एक्स और वाई प्राप्त करने के लिए लेआउट पूरा होने तक स्थगित कर दिया जाएगा।

0

मान लीजिए कि आपके पास जेपीएलएल पिता है जिसमें एक जेपीनल बेटा है। यदि पिता और पिता के संबंध में सीएक्स पुत्र का समन्वय एक्स है, तो पिता के संबंध में बेटे का समन्वय वाई है, फिर:

सीएक्स = son.getLocationOnScreen()। GetX() - पिताजीज स्थानऑनस्क्रीन() .getX()

cy = son.getLocationOnScreen() Gety() -।। father.getLocationOnScreen() Gety()

मुझे लगता है कि सबसे आसान तरीका है ...

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