2012-03-22 7 views
10

में जेएलएबल को केंद्रित करना मेरे पास JPanel से निकाला गया एक पैनल है। मेरे पास JLabel से व्युत्पन्न कस्टम नियंत्रण है। मैं अपने पैनल पर इस कस्टम JLabel को केंद्रित करने का प्रयास कर रहा हूं।एक जेनबेल

एकमात्र तरीका यह है कि मैं ऐसा करने के लिए जानता हूं जो काम करेगा, एक शून्य लेआउट (setLayout(null)) का उपयोग करना है और फिर कस्टम जेलाबेल के setLocation() बिंदु की गणना करना ताकि यह सही जगह पर हो।

कस्टम JLabel इस ऐप में एक पैनल से भौतिक रूप से इस पैनल में स्थानांतरित हो गया है और मेरा मानना ​​है कि पहले setLocation में सेट किया गया स्थान चीजों को प्रभावित कर रहा है। हालांकि जब मैं इसे (0,0) पर सेट करता हूं तो घटक ऊपरी बाएं कोने में जाता है।

BorderLayout काम नहीं करता है क्योंकि जब केवल 1 घटक प्रदान किया जाता है और BorderLayout.CENTER में रखा जाता है, तो केंद्रीय अनुभाग सभी जगहों को भरने के लिए फैलता है।

एक उदाहरण मैंने BoxLayout और component.setAlignmentX(Component.CENTER_ALIGNMENT) का उपयोग दूसरी साइट से काटा और चिपकाया। यह या तो काम नहीं किया।

पैनल का getInset() फ़ंक्शन (मुझे लगता है कि यह वही कहा जाता है) को ओवरराइड करने का एक और उत्तर है, लेकिन यह एक मृत अंत साबित हुआ।

अब तक मैं GridBagLayout लेआउट वाले पैनल के साथ काम कर रहा हूं और जब मैं कस्टम JLabel को अपने पैनल में सम्मिलित करता हूं तो मैं GridBagConstraints ऑब्जेक्ट शामिल करता हूं। हालांकि यह अक्षम है। में JLabel को केन्द्रित करने का कोई बेहतर तरीका है?

+8

ranting से वास्तविक प्रश्न खनन पर विचार करें। –

+0

ओह, और जब मैं ग्रिडबैगलाउट और ग्रिडबैग कॉन्स्ट्रेनेंट्स विधि का उपयोग करता हूं तो चीजें ठीक दिखती हैं यदि मैं छोटा करता हूं और फिर मुख्य विंडो को पुनर्स्थापित करता हूं। – Shackleford

+2

इस पूरे रेंट को लिखने का समय Google 'स्विंग्स के साथ काम कर रहे स्विंग' में टाइप करने के लिए पर्याप्त था, आधिकारिक स्विंग ट्यूटोरियल्स की पहली हिट पर क्लिक करके, विज़ुअल गाइड को देखें, बॉक्सलायआउट का वादा करने का फैसला करें, और एक उदाहरण देखकर जो अधिक करता है या जो भी आप चाहते हैं (इसमें दो घटक आईएसओ एक हैं) – Robin

उत्तर

8

BoxLayout जाने का रास्ता है। यदि आप एक X_AXIS BoxLayout सेट करते हैं, पहले और घटक के बाद क्षैतिज गोंद जोड़ने का प्रयास करें:

panel.add(Box.createHorizontalGlue()); 
panel.add(label); 
panel.add(Box.createHorizontalGlue()); 
7

जावा मानक लाइब्रेरी में सभी LayoutManagers भूल जाओ और MigLayout का उपयोग करें। मेरे अनुभव में आमतौर पर काम करना बहुत आसान होता है जो आप अपेक्षा करते हैं कि आप क्या करना चाहते हैं।

यहां बताया गया है कि आप MigLayout का उपयोग करने के बाद क्या कर रहे हैं।

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

import net.miginfocom.swing.MigLayout; 

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

     // use MigLayout 
     panel.setLayout(new MigLayout()); 

     // add the panel to the frame 
     frame.add(panel); 

     // create the label 
     JLabel label = new JLabel("Text"); 

     // give the label MigLayout constraints 
     panel.add(label, "push, align center"); 

     // show the frame 
     frame.setSize(400, 400); 
     frame.setVisible(true); 
    } 
} 

इनमें से अधिकांश बॉयलरप्लेट है। कुंजी लेआउट बाधा है: "push, align center":

align center मिगलाउट को जेलाबेल को अपने ग्रिड सेल के केंद्र में रखने के लिए कहता है।

push मिगलाउट को उपलब्ध स्थान भरने के लिए ग्रिड सेल का विस्तार करने के लिए कहता है।

+0

यहां एक महान मिगलाउट चीट शीट उपलब्ध है: http://migcalendar.com/miglayout/mavensite/docs/cheatsheet.html – ulmangt

+0

आप यहां से मिगलाउट का नवीनतम संस्करण डाउनलोड कर सकते हैं: http://www.migcalendar.com/miglayout /versions/4.0/miglayout-4.0-swing.jar – ulmangt

+0

दिलचस्प! टिप के लिए धन्यवाद मुझे इसे भविष्य में ध्यान में रखना होगा, लेकिन अभी के लिए मैं चीजों के लिए जावा पुस्तकालयों में रहने की उम्मीद कर रहा हूं। मैं अभी भी बहुत नया हूं और सीखने की कोशिश कर रहा हूं। – Shackleford

23

सेट GridBagLayoutJPanel के लिए, JPanel के लिए किसी भी GridBagConstraints बिना JLabel शब्दों में कहें, JLabel

enter image description here

उदाहरण

import java.awt.*; 
import javax.swing.*; 

public class CenteredJLabel { 

    private JFrame frame = new JFrame("Test"); 
    private JPanel panel = new JPanel(); 
    private JLabel label = new JLabel("CenteredJLabel"); 

    public CenteredJLabel() { 
     panel.setLayout(new GridBagLayout()); 
     panel.add(label); 
     panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.add(panel); 
     frame.setSize(400, 300); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

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

      @Override 
      public void run() { 
       CenteredJLabel centeredJLabel = new CenteredJLabel(); 
      } 
     }); 
    } 
} 
+0

धन्यवाद, mkorbel, न केवल उपयोगी जानकारी पोस्ट करने के लिए बल्कि इसे बहुत अच्छी तरह से कर रहा है। दुर्भाग्य से यह मुझे उसी स्थिति में फंस गया जहां मेरे पास अप्रत्याशित व्यवहार है (मेरे जेएलएबल को रखने के बाद मेरे पैनल में कुछ नहीं दिखता है)। जब मैंने आपके वास्तविक कोड में अपना उदाहरण भर दिया और एक डमी जेबटन का उपयोग किया तो जेबटन का प्लेसमेंट सही था। मैंने अपने कस्टम जेएलएबल की नकल करने के लिए जेबटन को कुछ सेटिंग्स भी जोड़ दीं और यह अभी भी काम करती है, लेकिन जब मैंने अपना जेलाबेल इस्तेमाल किया? वह तब होता है जब चीजें काम नहीं करती हैं। मुझे यह नहीं मिला। मेरे जेलाबेल को ऐसा करने से रोकने के लिए कुछ है जो इन डमी जेबटन करते हैं। – Shackleford

13

केंद्रित किया जाएगा Supose अपने JLabellabel कहा जाता है, तो का उपयोग करें:

label.setHorizontalAlignment(JLabel.CENTER); 
+0

यह निश्चित रूप से एक पुरानी पोस्ट है, लेकिन एक नई परियोजना के लिए स्विंग की समीक्षा करते समय यह निश्चित रूप से उत्तर पर सबसे सरल और स्थान था। यह चिह्नित नहीं है कि जवाब मेरे बाहर है। – Maxs728

+0

यह गलत है। यह लेबल की सामग्री की स्थिति को प्रभावित करता है, न कि कंटेनर के भीतर लेबल की स्थिति। – Kroky