2012-10-09 8 views
5

मैं जावा में GRIDBAG लेआउट का उपयोग करGridbag लेआउट

public static void addComponentsToPane(Container pane) { 
     if (RIGHT_TO_LEFT) { 
      pane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); 
     } 

     JLabel label1,label2,label3,result,title; 
     JButton calculate_btn; 
     JTextField side1,side2,side3; 

    pane.setLayout(new GridBagLayout()); 
    GridBagConstraints c = new GridBagConstraints(); 
    if (shouldFill) { 
    //natural height, maximum width 
    c.fill = GridBagConstraints.HORIZONTAL; 
    } 


     title = new JLabel("Area of Triangle"); 
    if (shouldWeightX) { 
    c.weightx = 0.5; 
    } 
    c.fill = GridBagConstraints.HORIZONTAL; 
    c.gridx = 2; 
    c.gridy = -1; 
    pane.add(title, c); 



    label1 = new JLabel("Side 1: "); 
    if (shouldWeightX) { 
    c.weightx = 0.5; 
    } 
    c.fill = GridBagConstraints.HORIZONTAL; 
     c.ipady = 20; 
    c.gridx = 1; 
    c.gridy = 1; 
    pane.add(label1, c); 

     label2 = new JLabel("Side 2: "); 
    if (shouldWeightX) { 
    c.weightx = 0.5; 
    } 
    c.fill = GridBagConstraints.HORIZONTAL; 
     c.ipady = 20; 
    c.gridx = 1; 
    c.gridy = 2; 
    pane.add(label2, c); 


     label3 = new JLabel("Side 3: "); 
    if (shouldWeightX) { 
    c.weightx = 0.5; 
    } 
    c.fill = GridBagConstraints.HORIZONTAL; 
     c.ipady = 20; 
    c.gridx = 1; 
    c.gridy = 3; 
    pane.add(label3, c); 

     side1 = new JTextField(" "); 
    if (shouldWeightX) { 
    c.weightx = 0.5; 
    } 
    c.fill = GridBagConstraints.HORIZONTAL; 
     c.ipady = 20; 
    c.gridx = 2; 
    c.gridy = 1; 
    pane.add(side1, c); 

     side2 = new JTextField("Side 3: "); 
    if (shouldWeightX) { 
    c.weightx = 0.5; 
    } 
    c.fill = GridBagConstraints.HORIZONTAL; 
     c.ipady = 20; 
    c.gridx = 2; 
    c.gridy = 2; 
    pane.add(side2, c); 

     side3 = new JTextField("Side 3: "); 
    if (shouldWeightX) { 
    c.weightx = 0.5; 
    } 
    c.fill = GridBagConstraints.HORIZONTAL; 
     c.ipady = 20; 
    c.gridx = 2; 
    c.gridy = 3; 
    pane.add(side3, c); 

    calculate_btn = new JButton("Calculate"); 
    //c.fill = GridBagConstraints.HORIZONTAL; 
    c.ipady = 30;  //make this component tall 
    c.weightx = 0.5; 
    c.gridwidth = 3; 
    c.gridx = 0; 
    c.gridy = 5; 
    pane.add(calculate_btn, c); 

     result = new JLabel("Result displayed here"); 
    if (shouldWeightX) { 
    c.weightx = 0.5; 
    } 
    c.fill = GridBagConstraints.HORIZONTAL; 
     c.ipady = 20; 
    c.gridx = 2; 
    c.gridy = 7; 
    pane.add(result, c); 


    } 

तो उपरोक्त कोड मूल रूप से सिर्फ घटक है कि एक जीयूआई में जोड़ दिया जाएगा है इस लेआउट को लागू करने की कोशिश कर रहा हूँ, लेकिन मैं काफी हो रही है नहीं कर रहा हूँ कि मैं क्या समायोजन चाहते हैं, यह मैं क्या

enter image description here

प्राप्त करने के लिए कोशिश कर रहा हूँ है लेकिन यह है कि मैं क्या उपरोक्त कोड

के साथ हो रही है है

तो जब मैं ऊपर संकलन है जो मैं endup साथ, यह भी संभव है कि अगर मैं खिड़की, मैं खिड़की संपत्ति में से एक के साथ कुछ बूलियन अनुमान लगा रहा हूँ आकार बदलने के लिए उपयोगकर्ता चाहते हैं ..

+0

'pane.setComponentOrientation (ComponentOrientation.RIGHT_TO_LEFT);' इस कोड को लाइन 'डैरिल Burke' या' camickr', विशेष रूप से उल्लेख किया स्विंग गुरुओं की दूसरी से कर रहा है मिल गया है इस मंच पर जीबीसी के बारे में कुछ उदाहरण, – mKorbel

+0

जीबीसी केवल तभी काम करता है जब सभी कॉलम भर जाते हैं (अदृश्य जेकंपोनेंट्स का उपयोग करें), फिर आप किसी भी पंक्ति के लिए कॉलम का उपयोग कर सकते हैं :-), – mKorbel

+0

+1 'ग्रिडबैगलाउट' – MadProgrammer

उत्तर

3

समस्या यह है कि आप ipady सेट कर रहे हैं जो आपके घटक को लंबवत रूप से "खींचता है"। आप शायद insets संपत्ति के लिए देख रहे हैं: http://docs.oracle.com/javase/7/docs/api/java/awt/GridBagConstraints.html#insets

कोशिश इस का उपयोग करते हुए:

c.insets = new Insets(10, 0, 10, 0); 
+0

हाँ, यही वह है। – Zarkonnen

+0

प्रोग्राम प्रारंभ होने पर डिफ़ॉल्ट आकार के बारे में क्या है? यह बहुत छोटा आ रहा है मैं इसे तय करना चाहता हूं। – noobprogrammer

+0

एप्लिकेशन के TITLE को इसे शीर्ष पर कैसे पहुंचाया जाए? – noobprogrammer

2

एक मुद्दा मैं मैं आपके कोड के साथ देख रहा हूं कि आप अपने द्वारा जोड़े गए सभी तत्वों के लिए एक ही ग्रिडबैग कॉन्स्ट्रेनेंट ऑब्जेक्ट का पुनः उपयोग कर रहे हैं, जिसकी अनुशंसा नहीं की जाती है।

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

वैकल्पिक रूप से, TableLayout जैसे कुछ का उपयोग करें - या GridBagConstraints की जटिलताओं पर बुलेट और read up काट लें।

+3

को हाथ में रखने के लिए एक ही जीबीसी का उपयोग करना कोई समस्या नहीं है। यह बदसूरत लग सकता है, लेकिन यह मुद्दा यहां नहीं है। –

3

यहाँ एक GridBagLayout जिसमें परिणाम एक और दृष्टिकोण का उपयोग है ...

enter image description here enter image description here

public class TestLayout { 

    public static void main(String[] args) { 

     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException ex) { 
       } catch (InstantiationException ex) { 
       } catch (IllegalAccessException ex) { 
       } catch (UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new FormPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 

     }); 
    } 

    protected static class FormPane extends JPanel { 

     JLabel label1, label2, label3, result, title; 
     JButton calculate_btn; 
     JTextField side1, side2, side3; 

     public FormPane() { 
      // You may not need this, I needed it because the window packed to 
      // small on my mac ;)    
      setBorder(new EmptyBorder(4, 4, 4, 4)); 

      setLayout(new GridBagLayout()); 
      GridBagConstraints c = new GridBagConstraints(); 

      title = new JLabel("Area of Triangle"); 
      label1 = new JLabel("Side 1: "); 
      label2 = new JLabel("Side 2: "); 
      label3 = new JLabel("Side 3: "); 
      side1 = new JTextField(4); 
      side2 = new JTextField(4); 
      side3 = new JTextField(4); 
      calculate_btn = new JButton("Calculate"); 

      result = new JLabel("Result displayed here"); 

      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      gbc.anchor = GridBagConstraints.NORTH; 
      gbc.gridwidth = 2; 
      gbc.weighty = 1; 
      add(title, gbc); 

      gbc.weighty = 0; 
      gbc.gridy = 1; 
      gbc.anchor = GridBagConstraints.WEST; 
      gbc.gridwidth = 1; 
      add(label1, gbc); 
      gbc.gridy++; 
      add(label2, gbc); 
      gbc.gridy++; 
      add(label3, gbc); 

      gbc.gridy = 1; 
      gbc.gridx = 1; 
      add(side1, gbc); 
      gbc.gridy++; 
      add(side2, gbc); 
      gbc.gridy++; 
      add(side3, gbc); 

      gbc.gridx = 0; 
      gbc.gridwidth = 2; 
      gbc.gridy++; 
      add(result, gbc); 

      gbc.gridy++; 
      gbc.weighty = 1; 
      gbc.anchor = GridBagConstraints.NORTH; 
      add(calculate_btn, gbc); 

     } 

    } 

} 

यदि आप शीर्षक और फ़ील्ड ए के बीच स्थान जोड़ना चाहते हैं घ कुछ Insets

gbc.insets = new Insets(0, 0, 8, 0); 
add(title, gbc); 

// Don't forget to reset them ;) 
gbc.insets = new Insets(0, 0, 0, 0); 

मैं सिर्फ महसूस किया कि परिणाम बटन के तहत प्रदर्शित किया जाना चाहिए। सरल स्वैप लाइनों add(result, gbc) और add(calculate_btn, gbc), सब कुछ एक ही रहना चाहिए

+0

उत्कृष्ट! क्या JFRAME के ​​लिए आकार सेट करने और इसे आकार के साथ लॉक करने का कोई तरीका है? – noobprogrammer

+0

JFrame.setSize, सावधान रहें, हालांकि, एक परिवर्तनीय वातावरण में आपका काम, जहां फ़ॉन्ट आकार, डीपीआई और रिज़ॉल्यूशन कभी भी समान नहीं होता है, फ्रेम का उपयोग करने के लिए बेहतर होता है ताकि फ्रेम को इसकी सामग्री के पसंदीदा आकार में समायोजित किया जा सके। सामग्री के चारों ओर कुछ जगह देने के लिए मेरे कई फ्रेमों में एक खाली बोर्डर। उपयोगकर्ता को फ्रेम का आकार बदलने से रोकने के लिए, JFrame.setResizable का उपयोग करें – MadProgrammer