2011-10-10 12 views
6

मैं एक जेबटन (एक "ओके" बटन) डिजाइन करने की कोशिश कर रहा हूं जो कि अच्छे दिखने के लिए क्षैतिज रूप से युक्त जेएफआरएएम में केंद्रित होना है।
मैं फ्री फॉर्म लेआउट (ग्रुपलाउट) के साथ जीयूआई बिल्डर का उपयोग कर रहा हूं।
नेटबीन, जीयूआई बिल्डर (समूह लेआउट) एक घटक को केंद्रित करने वाला

मैंने कई जीयूआई बिल्डर ट्यूटोरियल (http://netbeans.org/kb/docs/java/quickstart-gui.html) ले लिए हैं लेकिन इस विषय को नहीं मिला है। अन्य गुई बिल्डर्स (डेल्फी) में यह दोनों किनारों से एंकरों को हटाकर किया जा सकता है।

उत्तर

5

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

+1

मामले (मुझे लगता है कि यह बहुत अक्सर होता है) आप कई नियंत्रण के साथ एक रूप होता है। नियंत्रण का लेआउट GroupLayout को एक आदर्श विकल्प बनाता है। अंत में बटन को छोड़कर, यह केंद्रित होना चाहिए। निस्संदेह मैं पृष्ठ के अंत में एक जेपीनल डाल सकता हूं, इसे क्षैतिज रूप से आकार देने योग्य बना सकता हूं और JButton को अपने (डिफ़ॉल्ट) केंद्रित फ्लोलाउट में डाल सकता हूं। लेकिन सवाल इस तथ्य से उत्पन्न होता है कि अन्य जीयूआई बिल्डरों (इतनी परिष्कृत नहीं) में डेल्फी के समान, केंद्र केंद्रित तर्क का एक बिड़ौड़ा विस्तार है। कहीं भी नियंत्रण को लंगरने का मतलब यह नहीं है कि इसे केंद्र में "फ्लोट" दें। – AgostinoX

+0

@AgostinoX आपको इस 'लेआउटमैनेजर' पीट +1 – mKorbel

+0

@mKorbel के साथ बहुत आश्चर्य होगा, मुझे यह सुनकर बहुत खुशी नहीं हुई :-)। क्या आप कुछ नमूने प्रदान कर सकते हैं? – AgostinoX

2

एक और LayoutManager प्रयास करें कोशिश करो! नेटबीन द्वारा उत्पन्न कोड को देखते समय ग्रुपलाउट बहुत अस्पष्ट है।

यदि आप इस्तेमाल किया DesignGridLayout तो आपको क्या चाहिए के रूप में सरल है:

DesignGridLayout layout = new DesignGridLayout(container); 
layout.row().center().add(okButton); 
+0

@ jfpoilpret: क्या यह एक गुई बिल्डर प्रदान करता है? – AgostinoX

+0

DesignGridLayout का उपयोग करते समय एक जीयूआई निर्माता की कोई आवश्यकता नहीं है, यह उसकी ताकत है! जो कोड आप सीधे लिखते हैं वह वह लेआउट व्यक्त करता है जो आप चाहते हैं। और बस कोड पढ़ने से आपको प्राप्त लेआउट का तत्काल दृष्टि मिलती है। कोई जीयूआई बिल्डर, कोई बदसूरत या जटिल कोड पीढ़ी, जो रखरखाव को आसान बनाता है, प्रारंभिक कोडिंग को आसान बनाने के अलावा। DesignGridLayout API बहुत आसान है, आप समझ सकते हैं कि इसका उपयोग कैसे करें और केवल एक या दो घंटे के बाद परिचय और वेब साइट पर उदाहरण पढ़ने के बाद अपना खुद का लेआउट बनाएं। – jfpoilpret

1

javax.swing.Box.Filler एक GroupLayout अंदर एक घटक के आसपास पैड अंतरिक्ष के लिए इस्तेमाल किया जा सकता है। नेटबीन्स मैटिस (जीयूआई बिल्डर) में उन्हें पैलेट के 'स्विंग फिलर्स' अनुभाग के तहत 'क्षैतिज स्ट्रूट' कहा जाता है। बस अपने बटन के दोनों ओर एक रखें, उन्हें बटन और कंटेनर के किनारे के बीच सभी रिक्त स्थान भरने के लिए आकार दें, और सुनिश्चित करें कि वे क्षैतिज रूप से स्वत: आकार बदलने के लिए फ़्लैग किए गए हैं।

एक और लेआउटमैनेजर का उपयोग करने के लिए, मुझे पता है कि लोगों को GroupLayout पसंद नहीं है क्योंकि यह मैन्युअल कोडिंग के लिए अनुकूल नहीं है। यह डिजाइन द्वारा है। चूंकि docs कहता है, ग्रुपलायआउट का उद्देश्य जीयूआई बिल्डर्स द्वारा उपयोग किया जाना है। तो जब तक आप अपने जीयूआई के जीवन के लिए NetBeans & Matisse का उपयोग करने के लिए खुद को बांधने के ठीक हैं, ग्रुपलाउट वास्तव में सबसे अच्छा विकल्प है।

3

GroupLayout घटकों के केंद्र का समर्थन करता है। यह एक बहुत सक्षम लेआउट प्रबंधक है। मैंने व्यक्तिगत रूप से इसे MigLayout प्रबंधक के बाद और FormLayout प्रबंधक के बाद रखा है।

निम्नलिखित तीन उदाहरणों में, हमारे पास एक पैनल और एक बटन है। बटन क्षैतिज केंद्रित है।

NetBeans बिल्डर

साथ केंद्रित एक Netbeans निर्माता का उपयोग करके एक घटक केंद्र के लिए, हम बटन के दोनों ओर से क्षैतिज आकार बदलने योग्य अंतराल बनाने की जरूरत है।

स्क्रीनशॉट का हरा क्षेत्र वर्तमान में चयनित अंतराल है। अंतराल के अंदर तार बताते हैं कि यह एक आकार बदलने योग्य अंतर है। जब हम फार्म पर घटक जगह

NetBeans screenshot

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

NetBeans screenshot

एक आकार बदलने योग्य अंतराल पाने के लिए, हम आकार बदलने योग्य चेक बॉक्स की जाँच करें: हम निम्नलिखित संवाद मिलता है।

एक समानांतर समूह

अवयव का उपयोग करके स्वयं केंद्रित GroupLayout.Alignment.CENTER पैरामीटर पारित करके समानांतर समूह में केंद्रित किया जा सकता है।

package com.zetcode; 

import java.awt.Container; 
import java.awt.EventQueue; 
import javax.swing.BorderFactory; 
import javax.swing.GroupLayout; 
import static javax.swing.GroupLayout.Alignment.CENTER; 
import static javax.swing.GroupLayout.DEFAULT_SIZE; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class GroupLayoutCenter extends JFrame { 

    public GroupLayoutCenter() { 

     initUI(); 

     setTitle("Centered button"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null);   
    } 

    private void initUI() { 

     Container pane = getContentPane(); 
     GroupLayout gl = new GroupLayout(pane); 
     pane.setLayout(gl);  

     gl.setAutoCreateGaps(true); 
     gl.setAutoCreateContainerGaps(true); 

     JPanel pnl = new JPanel(); 
     pnl.setBorder(BorderFactory.createEtchedBorder()); 

     JButton btn = new JButton("Button"); 

     gl.setHorizontalGroup(gl.createParallelGroup(CENTER) 
      .addComponent(pnl, DEFAULT_SIZE, 200, DEFAULT_SIZE) 
      .addComponent(btn) 
     ); 

     gl.setVerticalGroup(gl.createSequentialGroup() 
      .addComponent(pnl, DEFAULT_SIZE, 200, DEFAULT_SIZE) 
      .addComponent(btn)    
     );   

     pack(); 
    } 


    public static void main(String[] args) { 

     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       GroupLayoutCenter ex = new GroupLayoutCenter(); 
       ex.setVisible(true); 
      } 
     }); 
    } 
} 

अंतराल का उपयोग करके स्वयं केंद्रित

यह समाधान क्या NetBeans उत्पन्न कोड करता है। हम बटन के बाएं और दाएं किनारे पर दो आकार बदलने योग्य अंतराल रखते हैं।

package com.zetcode; 

import java.awt.Container; 
import java.awt.EventQueue; 
import javax.swing.BorderFactory; 
import javax.swing.GroupLayout; 
import static javax.swing.GroupLayout.DEFAULT_SIZE; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class GroupLayoutCenter2 extends JFrame { 

    public GroupLayoutCenter2() { 

     initUI(); 

     setTitle("Centered button"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null);   
    } 

    private void initUI() { 

     Container pane = getContentPane(); 
     GroupLayout gl = new GroupLayout(pane); 
     pane.setLayout(gl);  

     gl.setAutoCreateGaps(true); 
     gl.setAutoCreateContainerGaps(true); 

     JPanel pnl = new JPanel(); 
     pnl.setBorder(BorderFactory.createEtchedBorder()); 

     JButton btn = new JButton("Button"); 

     gl.setHorizontalGroup(gl.createParallelGroup() 
       .addComponent(pnl, DEFAULT_SIZE, 200, DEFAULT_SIZE) 
       .addGroup(gl.createSequentialGroup() 
         .addGap(5, 100, Short.MAX_VALUE) 
         .addComponent(btn) 
         .addGap(5, 100, Short.MAX_VALUE)) 
     ); 

     gl.setVerticalGroup(gl.createSequentialGroup() 
       .addComponent(pnl, DEFAULT_SIZE, 200, DEFAULT_SIZE) 
       .addComponent(btn) 
     );  

     pack(); 
    } 


    public static void main(String[] args) { 

     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       GroupLayoutCenter2 ex = new GroupLayoutCenter2(); 
       ex.setVisible(true); 
      } 
     }); 
    } 
} 

enter image description here

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