2012-09-26 24 views
5

हाय सब मेरे पास एक जेएफआरएएम है जिसमें तीन घटक हैं।जावा स्विंग: मैं ग्रिड लेआउट में एक पंक्ति का आकार कैसे बदल सकता हूं और इसे गतिशील रूप से केवल क्षैतिज रूप से आकार देने की अनुमति देता हूं और लंबवत नहीं?

  1. एक मेनू
  2. एक टैब वाले फलक
  3. एक पैनल कुछ बटन

शुरू में मेरा लक्ष्य निम्नलिखित की तरह एक डिजाइन बनाने के लिए है: enter image description here

जब उपयोगकर्ता आवेदन का आकार बदल जाएगा, सब कुछ भी आकार बदल जाएगा। तो मुझे लगा कि अगर मैं एक साधारण ग्रिड लेआउट मेरी समस्या हल किया जाएगा इस्तेमाल किया, तो मैं निम्न कार्य करने का निर्णय लिया:

  1. टैब वाले फलक के अंदर कुछ पैनल होगा और उन पैनलों ग्रिड लेआउट का पालन करेंगे।

  2. नीचे पैनल नीचे ग्रिड लेआउट का पालन करेगा।

  3. जेएफआरएम ग्रिड लेआउट का भी पालन करेगा।

परिणाम:

enter image description here

आप देख सकते हैं यह नहीं है कि मैं क्या चाहता था, बटन बहुत बड़े हैं और हालांकि आवेदन बहुत अच्छी तरह से आकार बदलता है:

enter image description here

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

enter image description here

अच्छा लगता है, लेकिन जब मैं आकार बदलने के इस मैं क्या मिलता है: पहले से

enter image description here

धन्यवाद।

उत्तर

10

मैं सामग्री फलक के लिए BorderLayout का उपयोग करूंगा। BorderLayout.CENTER का उपयोग करके टैबबेड फलक को इसमें रखें और BorderLayout.SOUTH का उपयोग करके इसमें बटन का पैनल रखें।

+0

+1 मुझे लगता है कि यह भी काम करेगा। फिर निचले पैनल के लिए 'setPreferredSize' सेट करें। इससे इसकी ऊंचाई स्थिर हो जाएगी। केंद्र पैनल के लिए आकार निर्धारित न करें। इस तरह सबकुछ एक आकार को बनाए रखता है जबकि खिड़की का विस्तार करते समय केवल केंद्र फैलता है। इसके अलावा, निचले पैनल को 'फ़्लोलाउट' का उपयोग करना चाहिए। – davidXYZ

+1

@davidXYZ निचले पैनल पर पसंदीदा आकार सेट करने की आवश्यकता नहीं है। पसंदीदा आकार सेटिंग अपवाद है! –

+0

@davidXYZ आप शायद [इस] (http://stackoverflow.com/questions/7229226/should-i-avoid-the-use-of-setpreferredmaximumminimumsize-methods-in-java-swi) को पढ़ना पसंद कर सकते हैं आप pref/max/min आकार – MadProgrammer

7

जेएफआरएम ग्रिड लेआउट का भी पालन करेगा।

यह आपकी समस्या है।इसके बजाय, डिफ़ॉल्ट BorderLayout का उपयोग करें और

  1. (तो अपने कॉल है कि एक GridLayout को JFrame का लेआउट सेट निकालने के लिए) बाधा BorderLayout.SOUTH
  2. के साथ अपने बटन पैनल जोड़े किसी भी बाधाओं के बिना अपने टैब्ड फलक जोड़े (जिसका अर्थ है बाधा BorderLayout.CENTER)

Swing LayoutManager tutorial में और विशेष रूप से एक नज़र, उदाहरण है कि BorderLayout चिंताओं लो।

छोटे उदाहरण:

import java.awt.BorderLayout; 
import java.awt.GridLayout; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JPanel; 
import javax.swing.JTabbedPane; 
import javax.swing.SwingUtilities; 

public class TestLayout { 

    protected void initUI() { 
     final JFrame frame = new JFrame(TestLayout.class.getSimpleName()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JMenuBar menuBar = new JMenuBar(); 
     JMenu fileMenu = new JMenu("File"); 
     JMenuItem newItem = new JMenuItem("New..."); 
     JMenuItem open = new JMenuItem("Open..."); 
     fileMenu.add(newItem); 
     fileMenu.add(open); 
     menuBar.add(fileMenu); 
     JTabbedPane tabs = new JTabbedPane(); 
     tabs.addTab("Tab 1", new JPanel()); 
     tabs.addTab("Tab 2", new JPanel()); 
     tabs.addTab("Tab 3", new JPanel()); 
     JPanel buttonPanel = new JPanel(new GridLayout()); 
     buttonPanel.add(new JButton("Button-1")); 
     buttonPanel.add(new JButton("Button-2")); 
     buttonPanel.add(new JButton("Button-3")); 
     frame.add(tabs); 
     frame.add(buttonPanel, BorderLayout.SOUTH); 
     frame.setJMenuBar(menuBar); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

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

      @Override 
      public void run() { 
       new TestLayout().initUI(); 
      } 
     }); 
    } 
}