2009-05-22 13 views
9

मेरे पास पैनल है जो कुछ लेबल व्यवस्थित करने के लिए समूह लेआउट का उपयोग कर रहा है। मैं आकार के समय स्क्रीन के इस पैनल केंद्र को रखना चाहता हूं। यदि मैं फ्लो लेआउट का उपयोग करके पैनल को किसी अन्य पैनल के अंदर रखता हूं तो मैं क्षैतिज रूप से केंद्रित लेबल रख सकता हूं लेकिन लंबवत नहीं। कौन सा लेआउट मैनेजर मुझे स्क्रीन के बीच में केंद्रित पैनल रखने की अनुमति देगा?जावा लेआउट प्रबंधक लंबवत केंद्र

मैंने सीमा लेआउट का भी प्रयास किया और इसे केंद्र में रखा लेकिन यह विंडो आकार में बदल गया।

उत्तर

20

एक GridBagLayout का उपयोग कर और एक खाली GridBagConstrants वस्तु के साथ पैनल जोड़ने का प्रयास करें।
उदाहरण के लिए:

public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    frame.setLayout(new GridBagLayout()); 
    JPanel panel = new JPanel(); 
    panel.add(new JLabel("This is a label")); 
    panel.setBorder(new LineBorder(Color.BLACK)); // make it easy to see 
    frame.add(panel, new GridBagConstraints()); 
    frame.setSize(400, 400); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
} 
+2

मैं हमेशा सोचा है कि इसे कैसे किया, अंत में मैं छोड़ दिया और बजाय MigLayout इस्तेमाल किया। http://madbean.com/anim/totallygridbag/ :) – gencoreoperative

+4

यह मैं क्या gridbag के बारे में सोच रहा है। – qben

+0

GridBagLayout मुश्किल में विफल रहता है जब कंटेनर पसंदीदा आकार से छोटा (लेकिन न्यूनतम आकार से बड़ा) बच्चे की है: –

9

पहले, मैं उल्लेख करना चाहिए, लेआउट पर मेरे लेख पढ़ें: http://web.archive.org/web/20120420154931/http://java.sun.com/developer/onlineTraining/GUI/AWTLayoutMgr/। यह पुराने लेकिन बहुत उपयोगी है (दुर्भाग्य से उस लेख पूर्व दिनांकों BoxLayout जब मैं JavaOne पर कि बात करते हैं, जो http://javadude.com/articles/javaone पर BoxLayout शामिल दे दी है मैं कुछ स्लाइडों की है।)

प्रयास करें BoxLayout:

Box verticalBox = Box.createVerticalBox(); 
verticalBox.add(Box.createVerticalGlue()); 
verticalBox.add(stuffToCenterVertically); 
verticalBox.add(Box.createVerticalGlue()); 

और अगर आप चाहते हैं सामान केंद्रित करने के लिए, stuffToCenterVertically के रूप में एक HorizontalBox का उपयोग करें:

Box horizontalBox = Box.createHorizontalBox(); 
horizontalBox.add(Box.createHorizontalGlue()); 
horizontalBox.add(stuffToCenter); 
horizontalBox.add(Box.createHorizontalGlue()); 

रास्ता आसान करने के लिए gridbag से कोड में "देख"

+1

मैं मानता हूं कि ग्रिडबैगलाउट आमतौर पर अधिक जटिल है, लेकिन एक पैनल को केंद्रित करने के लिए, यह केवल दो पंक्तियां हैं। –

+0

समस्या यह है कि आप कोड को पढ़ने के दौरान "देख" नहीं सकते हैं ... (मैंने "आसान" के बजाय "उत्तर" स्थिति में अपना जवाब संपादित कर दिया है ...) –

+0

मैं "देखता हूं" ... लेकिन दूसरी ओर "createVerticalGlue()" का अर्थ दस्तावेज़ों को पढ़ने के बिना, मेरे लिए कुछ भी नहीं है। –

0

पैनल को आकार बदलने के लिए पैनल को सेट करने के लिए, लंबवत और क्षैतिज दोनों के लिए GroupLayout.Alignment.CENTER, और setPreferredSize(new Dimension(yourChosenWidth,yourChosenHeight)) के साथ पैनल पर समूह स्तर।

आप पैनल पर setMinimumSize और setMaximum आकार कर सकते हैं, सुरक्षा के लिए।

यदि आप स्नैज़ी महसूस कर रहे हैं, तो आप पूरी तरह से समांतर/अनुक्रमिक समूहों को चुनकर और लेबल को उचित रूप से समूहीकृत करके पूरी चीज़ के लिए एक एकल समूहलाइट का उपयोग कर सकते हैं।

0

आप LayoutManager ही एक भी घटक (दोनों अक्ष या सिर्फ एक) केंद्र के लिए बना सकते हैं। यह वह है जो धुरी दोनों पर करता है, आप आसानी से इसे लंबवत या क्षैतिज केंद्रित करने के लिए बदल सकते हैं।

वर्तमान कार्यान्वयन लेआउट पहला दृश्य बच्चे, आप बदल सकते हैं और वह भी ...

public class CentreLayout implements LayoutManager, java.io.Serializable { 

public void addLayoutComponent(String name, Component comp) { 
} 

public void removeLayoutComponent(Component comp) { 
} 

public Dimension preferredLayoutSize(Container target) { 
    return target.getPreferredSize(); 
} 

public Dimension minimumLayoutSize(Container target) { 
    return target.getMinimumSize(); 
} 

public void layoutContainer(Container target) { 
    synchronized (target.getTreeLock()) { 
     Insets insets = target.getInsets(); 
     Dimension size = target.getSize(); 
     int w = size.width - (insets.left + insets.right); 
     int h = size.height - (insets.top + insets.bottom); 
     int count = target.getComponentCount(); 

     for (int i = 0; i < count; i++) { 
      Component m = target.getComponent(i); 
      if (m.isVisible()) { 
       Dimension d = m.getPreferredSize(); 
       m.setBounds((w - d.width)/2, (h - d.height)/2, d.width, d.height); 
       break; 
      } 
     } 
    } 
} 

} 
+0

, यह मेरे लिए काम नहीं करता है। मुझे 'पसंदीदा LayoutSize' विधि में एक स्टैक ओवरफ़्लो (हाहा) मिलता है। – Atmocreations

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