2010-09-06 12 views
7

के साथ निश्चित चौड़ाई, परिवर्तनीय ऊंचाई मुझे जावा के लेआउट प्रबंधकों के साथ एक परेशानी की समस्या है। मेरे पास निम्न स्थिति है: एक पैनल में दो अन्य पैनल बी एक पूर्ण लेआउट और सी फ़्लोलाउट के साथ हैं। बी अत्यधिक अनुकूलित है और setPreferredSize के माध्यम से एक निश्चित आकार सेट है। सी में निश्चित चौड़ाई बी होना चाहिए, लेकिन अन्यथा प्रवाह में कितने घटक जोड़े गए हैं, इस पर निर्भर करते हुए अन्यथा एक चरणीय ऊंचाई का होना चाहिए। परिणामी के बाद निश्चित चौड़ाई और A.height + B.height ऊंचाई के रूप में होना चाहिए - कम से कम यही वही है जो मैं चाहता हूं।जेपीनेल में प्रवाह

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

इसे ठीक करने के लिए मैं क्या कर सकता हूं? क्या कोई बेहतर लेआउट है, या क्या मुझे अनुकरण करना है कि सभी एक पूर्ण लेआउट का उपयोग कर रहे हैं?

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 

import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JPanel; 

public class Test extends JPanel 
{ 
    public Test() 
    { 
     this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 

     JPanel top = new JPanel(null); 
     top.setBackground(Color.GREEN); 
     top.setPreferredSize(new Dimension(200, 20)); 
     JPanel flowPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 2, 2)); 

     this.add(top); 
     this.add(flowPanel); 

     flowPanel.add(new JButton("x")); 
     flowPanel.add(new JButton("x")); 
     flowPanel.add(new JButton("x")); 
     flowPanel.add(new JButton("x")); 
     flowPanel.add(new JButton("x")); 
     flowPanel.add(new JButton("x")); 
     flowPanel.add(new JButton("x")); 
     flowPanel.add(new JButton("x")); 
     flowPanel.add(new JButton("x")); 
     flowPanel.add(new JButton("x")); 
     flowPanel.add(new JButton("x")); 
     flowPanel.add(new JButton("x")); 
    } 
} 

उत्तर

9

Wrap Layout सहायता चाहिए।

+0

वह वास्तव में बहुत अच्छी तरह से काम करता है! यदि कोई मूल समाधान के साथ नहीं आता है, तो यही वह है जिसके साथ मैं जा रहा हूं। धन्यवाद! बस इतना बुरा है कि मानक लेआउट प्रबंधक ऐसी आम (कम से कम मेरे लिए) स्थितियों में असफल रहते हैं, और आप हमेशा एक नए कस्टम के साथ समाप्त होते हैं ..:/ – poke

+0

@poke: मेरे लिए, यह एक प्रकार का चयन पूर्वाग्रह का प्रतिनिधित्व करता है- मैं भूल जाता हूं कि मानक लेआउट आमतौर पर काम करते हैं! 'WrapLayout' भी अपने स्वयं के प्रबंधक लिखने का एक अच्छा उदाहरण है। – trashgod

0

उन्नत दृश्य विन्यास की तरह आप की इच्छा प्रदान करने के लिए सबसे अच्छा तरीका है शक्तिशाली GridBagLayoutManager द्वारा आप FlowLayout की जगह है। यह ध्यान देने योग्य है कि आमतौर पर GridBagConstraints द्वारा व्यक्त की गई बाधाओं को GBC जैसे धाराप्रवाह उप-वर्गों का उपयोग करते समय समझना बहुत आसान होता है।

अंत में, हमेशा की तरह, आपको Swing tutorial पर एक नज़र डालने पर विचार करना चाहिए।

+0

हम्म, लिंक के लिए धन्यवाद (विशेष रूप से जीबीसी ^^), हालांकि मुझे यकीन नहीं है कि प्रभाव को पुन: पेश करने के लिए फ्लोलाउट ने मुझे ग्रिडबैगआउट के साथ दिया था। मैं वास्तव में उन घटकों को लपेटना चाहता हूं (यहां: बटन) अगली पंक्ति में, जिसमें माता-पिता जेननेल की निश्चित चौड़ाई के कारण पर्याप्त कक्ष नहीं है। – poke

0
  1. आपको सीधे फ्रेम में बच्चों को नहीं जोड़ना चाहिए। हमेशा contentPane के लिए जोड़ ->this.getContentPage().add(...)

  2. अपने लेआउट काम करते हैं, सामग्री पृष्ठ में एक GridBagLayout के साथ एक JPanel रख दिया और उस पैनल सामग्री पृष्ठ को भरने बनाने के लिए।

  3. ग्रिडबैगआउट 2 कॉलम दें।

अब आप विंडो के क्षैतिज आकार को अक्षम नहीं कर सकते हैं, इसलिए आपको अतिरिक्त स्थान को संभालने के लिए एक अलग तरीका खोजना होगा। मेरा सुझाव है कि पहला कॉलम एक निश्चित चौड़ाई (सेट fill=NONE) दें और पैनल सी शेष स्थान भरें।

यदि आप पसंदीदा आकार में पैनल B के सभी आकार (न्यूनतम, अधिकतम, पसंदीदा) सेट करते हैं, तो इसे अब इसके आकार को नहीं बदला जाना चाहिए।

युक्ति: यदि एक स्विंग लेआउट काम नहीं करता है, तो इसे किसी अन्य लेआउट में घोंसला दें।

+1

बिंदु 1 के संबंध में: "एक सुविधा के रूप में, 'add' और इसके रूपों,' निकालें 'और' setLayout' को 'ContentPane' को आवश्यकतानुसार अग्रेषित करने के लिए ओवरराइड कर दिया गया है।" http://download.oracle.com/javase/6/docs/api/javax/swing/JFrame.html – trashgod

+0

ध्यान दें कि मैं फ़्रेम/विंडो के अंदर काम नहीं कर रहा हूं, लेकिन ऊपर मेरी वास्तविक कक्षा एक जेपीनेल है । यह मेरे विवरण से पैनल * ए * है और इसका उपयोग एक अलग लेआउट में किया जाता है जो लेआउट इसके आकार को नहीं बदलेगा। – poke

+0

@trashgod: यह जावा 6 के बाद से है। –

0

सब कुछ आप एक BorderLayout का एक LINE_END या LINE_START भाग में डाल इसकी चौड़ाई लगातार रखेंगे: केवल ऊंचाई अगर कंटेनर का आकार बदलने पर

उत्तर और दक्षिण हैं चौड़ाई चर

केन्द्र चौड़ाई & ऊंचाई है बदल दिया जाएगा चर

LINE_START & LINE_END हैं केवल ऊंचाई चर

तो, मैं आप BorderL इस तरह का में अपने 'सी' कंटेनर डाल सुझाव है Ayout क्षेत्र