2010-03-29 34 views
23

मैंने अपने बटन को ग्रिडलाउट के साथ जेपीन में रखा। तब मैंने जेपीनेल को BoxLayout.Y_AXIS के साथ एक और जेपीनेल में रखा। मैं ग्रिडलाउट में बटन स्क्वायर होना चाहता हूं। मैं tmp.setSize (30,30) का उपयोग करता हूं और यह काम नहीं करता है। मैं new GridLayout(X, Y, 4, 4) का उपयोग करने का भी प्रयास करता हूं लेकिन मैं यह नहीं समझ सकता कि एक्स और वाई क्या हैं। तो, इस सामान को करने का सही तरीका क्या है?मैं एक बटन का आकार कैसे सेट कर सकता हूं?

जोड़ा:

मैं अभी भी समस्या का समाधान नहीं कर सकते हैं। यहाँ मैं क्या करना है कोशिश कर रहा हूँ के कोड है:

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

public class PanelModel { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame("Colored Trails"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel mainPanel = new JPanel(); 
     mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 

     JPanel firstPanel = new JPanel(); 
     firstPanel.setLayout(new GridLayout(4, 4)); 
     JButton btn; 
     for (int i=1; i<=4; i++) { 
      for (int j=1; j<=4; j++) { 
       btn = new JButton(); 
       btn.setPreferredSize(new Dimension(100, 100)); 
       firstPanel.add(btn); 
      } 
     } 

     JPanel secondPanel = new JPanel(); 
     secondPanel.setLayout(new GridLayout(5, 13)); 
     for (int i=1; i<=5; i++) { 
      for (int j=1; j<=13; j++) { 
       btn = new JButton(); 
       btn.setPreferredSize(new Dimension(40, 40)); 
       secondPanel.add(btn); 
      } 
     } 

     mainPanel.add(firstPanel); 
     mainPanel.add(secondPanel); 
     frame.add(mainPanel); 

     frame.setSize(400,600); 
     frame.setVisible(true); 
    } 
} 

समस्या यह है कि जावा firstPanel और secondPanel बराबर की चौड़ाई बनाने की कोशिश करता है! इसके अलावा, जावा खिड़की की सभी ऊंचाई को भरने की कोशिश करता है। मैं इस व्यवहार को कैसे हटा सकता हूं?

उत्तर

28

कोड के निम्न बिट जो आप पूछते हैं वह करता है। बस सुनिश्चित करें कि आप पर्याप्त जगह आवंटित ताकि बटन पर पाठ दिखाई देने लगता है बनाने के

JFrame frame = new JFrame("test"); 
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
JPanel panel = new JPanel(new GridLayout(4,4,4,4)); 

for(int i=0 ; i<16 ; i++){ 
    JButton btn = new JButton(String.valueOf(i)); 
    btn.setPreferredSize(new Dimension(40, 40)); 
    panel.add(btn); 
} 
frame.setContentPane(panel); 
frame.pack(); 
frame.setVisible(true); 

एक्स और वाई (GridLayout निर्माता के दो पहले पैरामीटर) ग्रिड में (क्रमशः) पंक्तियों और स्तंभों की संख्या निर्दिष्ट । यदि आप उस मूल्य को असंबद्ध करना चाहते हैं तो आप उनमें से एक को 0 के रूप में छोड़ सकते हैं।

संपादित

मैं प्रदत्त कोड में संशोधन किया है और मेरा मानना ​​है कि यह अब क्या वांछित है के अनुरूप है:

JFrame frame = new JFrame("Colored Trails"); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

JPanel mainPanel = new JPanel(); 
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 

JPanel firstPanel = new JPanel(); 
firstPanel.setLayout(new GridLayout(4, 4)); 
firstPanel.setMaximumSize(new Dimension(400, 400)); 
JButton btn; 
for (int i=1; i<=4; i++) { 
    for (int j=1; j<=4; j++) { 
     btn = new JButton(); 
     btn.setPreferredSize(new Dimension(100, 100)); 
     firstPanel.add(btn); 
    } 
} 

JPanel secondPanel = new JPanel(); 
secondPanel.setLayout(new GridLayout(5, 13)); 
secondPanel.setMaximumSize(new Dimension(520, 200)); 
for (int i=1; i<=5; i++) { 
    for (int j=1; j<=13; j++) { 
     btn = new JButton(); 
     btn.setPreferredSize(new Dimension(40, 40)); 
     secondPanel.add(btn); 
    } 
} 

mainPanel.add(firstPanel); 
mainPanel.add(secondPanel); 
frame.setContentPane(mainPanel); 

frame.setSize(520,600); 
frame.setMinimumSize(new Dimension(520,600)); 
frame.setVisible(true); 

मूल रूप से मैं अब पैनल के वांछित आकार और एक न्यूनतम आकार सेट फ्रेम के लिए।

+0

मैंने इस कोड को आजमाया। यह काम करता हैं। लेकिन अगर मैं अपने कार्यक्रम में एक ही विचार को लागू करने की कोशिश करता हूं, तो यह काम नहीं करता है। मुझे लगता है कि कारण यह है कि मैं अपने जेपीनल (ग्रिडलाउट के साथ) को अन्य जेपीनल (BoxLayout.Y_AXIS के साथ) में शामिल करता हूं। – Roman

+0

@Roman यदि आप अधिक विशिष्ट सहायता चाहते हैं तो आपको कुछ नमूना कोड पोस्ट करने की आवश्यकता होगी! अनुरोध के अनुसार – Kris

+0

, मैंने कोड पोस्ट किया। – Roman

5

setSize के बजाय setPreferredSize के साथ प्रयास करें।

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

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

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

public class PanelModel { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame("Colored Trails"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel mainPanel = new JPanel(); 
     mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 

     JPanel firstPanel = new JPanel(new GridLayout(4, 4)); 
     firstPanel.setPreferredSize(new Dimension(4*100, 4*100)); 
     for (int i=1; i<=4; i++) { 
      for (int j=1; j<=4; j++) { 
       firstPanel.add(new JButton()); 
      } 
     } 

     JPanel firstGluePanel = new JPanel(new BorderLayout()); 
     firstGluePanel.add(firstPanel, BorderLayout.WEST); 
     firstGluePanel.add(Box.createHorizontalGlue(), BorderLayout.CENTER); 
     firstGluePanel.add(Box.createVerticalGlue(), BorderLayout.SOUTH); 

     JPanel secondPanel = new JPanel(new GridLayout(13, 5)); 
     secondPanel.setPreferredSize(new Dimension(5*40, 13*40)); 
     for (int i=1; i<=5; i++) { 
      for (int j=1; j<=13; j++) { 
       secondPanel.add(new JButton()); 
      } 
     } 

     JPanel secondGluePanel = new JPanel(new BorderLayout()); 
     secondGluePanel.add(secondPanel, BorderLayout.WEST); 
     secondGluePanel.add(Box.createHorizontalGlue(), BorderLayout.CENTER); 
     secondGluePanel.add(Box.createVerticalGlue(), BorderLayout.SOUTH); 

     mainPanel.add(firstGluePanel); 
     mainPanel.add(secondGluePanel); 
     frame.getContentPane().add(mainPanel); 

     //frame.setSize(400,600); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
+0

कंपाइलर लिखता है कि इसे 'setPreferredSize' नामक विधि नहीं मिल सकती है। – Roman

2

ग्रिडलाउट अक्सर बटन के लिए सबसे अच्छा विकल्प नहीं है, हालांकि यह आपके आवेदन के लिए हो सकता है। एक अच्छा संदर्भ tutorial on using Layout Managers है। यदि आप ग्रिडलाउट उदाहरण को देखते हैं, तो आप बटन को थोड़ा मूर्ख दिखेंगे - रास्ता बहुत बड़ा है।

आपके बटन के लिए फ़्लोलाउट का उपयोग करने के लिए एक बेहतर विचार हो सकता है, या यदि आप वास्तव में जानते हैं कि आप क्या चाहते हैं, तो शायद एक समूहलाउट। (सन/ओरेकल recommend कि ग्रुपलाइट या ग्रिडबैग लेआउट ग्रिडलायआउट से बेहतर है जब हाथ-कोडिंग।)

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

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