2011-11-26 4 views
5

मेरे पास JFrame है जिसमें CardLayout में JPanels का एक सेट है। प्रत्येक JPanel का एक अलग आकार है और मैं वर्तमान में प्रदर्शित JPanel (JPanelJFrame के आकार को अनुकूलित करने के लिए) के आकार के अनुकूल होने के लिए JFrame चाहता हूं।कार्डलेआउट को जेपीनेल प्रदर्शित करने के लिए जेएफआरएएम आकार कैसे सेट करें?

मैं इसे कैसे प्राप्त कर सकता हूं?

+2

* "मैं चाहता हूं कि जेएफआरएएम वर्तमान में प्रदर्शित जेपीनल के आकार के अनुकूल हो" * यह प्रदर्शित होगा कि प्रदर्शित सामग्री में बदलाव होने के कारण उपयोगकर्ता को फ्रेम परिवर्तन आकार होना चाहिए। –

+0

एक फिक्स आकार होने के बाद आंतरिक पैनल मेल नहीं खाता है जब JFrame बहुत बदसूरत है। मैं इसे करने की कोशिश की। – JVerstry

+0

मुझे यकीन नहीं है कि यह काम करेगा लेकिन आप इसे आजमा सकते हैं: 'frame.setSize (पैनल।getPreferredSize()); ' –

उत्तर

11

सामान्य है: यदि आप एक लेआउट समस्या है, तो, हमेशा यह एक उपयुक्त LayoutManager साथ हल। कभी भी अपने लक्ष्य तक पहुंचने के लिए एक घटक के आकार का संकेत ट्विक करें।

इस मामले में, कार्डलाउट को समायोजित करना विशेष रूप से आसान है। डिफ़ॉल्ट रूप से, यह सभी कार्डों के prefSizes के अधिकतम के लिए अपने prefSize की गणना करता है। सीधे शब्दों में उपवर्ग और वर्तमान में दृश्यमान कार्ड के prefSize (प्लस सन्निवेश वाली) वापस जाने के लिए लागू:

public static class MyCardLayout extends CardLayout { 

    @Override 
    public Dimension preferredLayoutSize(Container parent) { 

     Component current = findCurrentComponent(parent); 
     if (current != null) { 
      Insets insets = parent.getInsets(); 
      Dimension pref = current.getPreferredSize(); 
      pref.width += insets.left + insets.right; 
      pref.height += insets.top + insets.bottom; 
      return pref; 
     } 
     return super.preferredLayoutSize(parent); 
    } 

    public Component findCurrentComponent(Container parent) { 
     for (Component comp : parent.getComponents()) { 
      if (comp.isVisible()) { 
       return comp; 
      } 
     } 
     return null; 
    } 

} 

कि (उधार @ mKorbel के उदाहरण) का उपयोग करना, मुख्य विधि सफाई से नीचे सिकुड़ता है:

private static void createAndShowUI() { 
    final CardLayout cardLayout = new MyCardLayout(); 
    final JPanel cardHolder = new JPanel(cardLayout); 
    final JFrame frame = new JFrame("MultiSizedPanels"); 
    JLabel[] labels = { 
     new JLabel("Small Label", SwingConstants.CENTER), 
     new JLabel("Medium Label", SwingConstants.CENTER), 
     new JLabel("Large Label", SwingConstants.CENTER)}; 

    for (int i = 0; i < labels.length; i++) { 
     int padding = 50 * (i + 1); 
     Border lineBorder = BorderFactory.createCompoundBorder(
      BorderFactory.createLineBorder(Color.blue), 
      BorderFactory.createEmptyBorder(padding, padding, padding, padding)); 
     labels[i].setBorder(lineBorder); 
     JPanel containerPanel = new JPanel(); 
     containerPanel.add(labels[i]); 
     cardHolder.add(containerPanel, String.valueOf(i)); 
    } 
    JButton nextButton = new JButton("Next"); 
    nextButton.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      cardLayout.next(cardHolder); 
      frame.pack(); 
     } 
    }); 
    JPanel btnHolder = new JPanel(); 
    btnHolder.add(nextButton); 

    frame.add(cardHolder, BorderLayout.CENTER); 
    frame.add(btnHolder, BorderLayout.SOUTH); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setLocation(150, 150); 
    frame.setVisible(true); 
} 
+0

धन्यवाद। यह और अधिक साफ है और वास्तव में मैं क्या चाहता था। – JVerstry

+0

अब दुनिया एक और स्पष्ट और सुंदर +1 – mKorbel

+0

है इसलिए साफ करें कि मैं इसे विश्वास नहीं कर सकता। धन्यवाद! –

2

मुझे लगता है कि आप जो करना चाहते हैं उसके लिए गलत लेआउट प्रबंधक हो सकता है (इस समय के लिए, मुझे यकीन नहीं है कि आप जो करना चाहते हैं वह करना चाहते हैं)।

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

  * Each component in the <code>parent</code> container is reshaped 
     * to be the size of the container, minus space for surrounding 
     * insets, horizontal gaps, and vertical gaps. 

मुझे लगता है कि यह उचित व्यवहार है, क्योंकि यह एक उपयोगकर्ता पैनल आकार कूद के रूप चारों ओर पैनल आगे बढ़ते जाते हैं के लिए के लिए बहुत कष्टप्रद हो सकता है: मैं अपने 'layoutContainer "विधि के लिए निम्नलिखित टिप्पणी मिला।

यदि यह वास्तव में आप चाहते हैं कि व्यवहार है, तो मुझे लगता है कि आप एक अलग लेआउट प्रबंधक चाहते हैं। और चूंकि यह सामान्य रूप से यूआई के लिए असामान्य व्यवहार है, इसलिए आपको यह विशेष 'सुविधा' करने के लिए मानक नहीं मिल सकता है, इसलिए आपको अपना खुद का लिखना पड़ सकता है।

4

यहां SSCCE है।

1) आकार में निरंतर वृद्धि/कमी के लिए, आपको कुछ एनीमेशन एपीआई देखना चाहिए।

या

2) अगर कोई जीयूआई के लिए उत्पादन के साथ किसी भी पृष्ठभूमि कार्य नहीं है, तो आप जबकि JFrame आकार को रोकने के लिए कर सकते हैं। उस स्थिति में, Thread#sleep(int)Runnable थ्रेड में लपेटकर आप वृद्धि/कमी में देरी करेंगे।

3) ईडीटी के दौरान सीधे Thread#sleep(int) का उपयोग कर नोटिस (ओपी के लिए नहीं) देरी समाप्त होने तक जीयूआई को फ्रीज कर दिया जाएगा।

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.border.Border; 
//based on HFOE http://stackoverflow.com/questions/5414177/change-size-of-jpanel-using-cardlayout/5414770#5414770 
public class MultiSizedPanels { 

    private static void createAndShowUI() { 
     final CardLayout cardLayout = new CardLayout(); 
     final JPanel cardHolder = new JPanel(cardLayout); 
     final JFrame frame = new JFrame("MultiSizedPanels"); 
     JLabel[] labels = { 
      new JLabel("Small Label", SwingConstants.CENTER), 
      new JLabel("Medium Label", SwingConstants.CENTER), 
      new JLabel("Large Label", SwingConstants.CENTER)}; 

     for (int i = 0; i < labels.length; i++) { 
      int padding = 50; 
      Dimension size = labels[i].getPreferredSize(); 
      size = new Dimension(size.width + 2 * (i + 1) * padding, size.height + 2 * (i + 1) * padding); 
      labels[i].setPreferredSize(size); 
      Border lineBorder = BorderFactory.createLineBorder(Color.blue); 
      labels[i].setBorder(lineBorder); 
      JPanel containerPanel = new JPanel(); 
      if (i == 1) { 
       containerPanel.setPreferredSize(new Dimension(300, 200)); 
       containerPanel.add(labels[i], BorderLayout.CENTER); 
       cardHolder.add(containerPanel, String.valueOf(i)); 
      } else if (i == 2) { 
       containerPanel.setPreferredSize(new Dimension(600, 400)); 
       containerPanel.add(labels[i], BorderLayout.CENTER); 
       cardHolder.add(containerPanel, String.valueOf(i)); 
      } else { 
       containerPanel.setPreferredSize(new Dimension(800, 600)); 
       containerPanel.add(labels[i], BorderLayout.CENTER); 
       cardHolder.add(containerPanel, String.valueOf(i)); 
      } 
     } 
     JButton nextButton = new JButton("Next"); 
     nextButton.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       cardLayout.next(cardHolder); 
       Dimension dim = new Dimension(); 
       for (Component comp : cardHolder.getComponents()) { 
        if (comp.isVisible() == true) { 
         dim = comp.getPreferredSize(); 
        } 
       } 
       frame.setPreferredSize(dim); 
       java.awt.EventQueue.invokeLater(new Runnable() { 

        public void run() { 
         frame.pack(); 
        } 
       }); 
      } 
     }); 
     JPanel btnHolder = new JPanel(); 
     btnHolder.add(nextButton); 

     frame.add(cardHolder, BorderLayout.CENTER); 
     frame.add(btnHolder, BorderLayout.SOUTH); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocation(150, 150); 
     frame.setVisible(true); 
    } 

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

      public void run() { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 
+0

-1 को सेटप्रेफ़ाईज़ के अत्यधिक उपयोग के लिए प्राप्त करना चाहते हैं: सामान्य नियम है (जैसा कि आप अच्छी तरह से जानते हैं :-) उचित लेआउटमैनेजर का उपयोग करके हल करने वाली समस्याओं को हल करने के लिए। यदि आपको कोई ऐसा नहीं मिलता जो आप चाहते हैं, तो लेआउटमैनेजर लिखें/समायोजित करें जो ... – kleopatra

0
Try this code this may help you. 




protected void paintComponent(Graphics g) { 
if (getModel().isArmed()) { 
     g.setColor(Color.lightGray); 
} else { 
    g.setColor(getBackground()); 
} 
g.fillOval(0, 0, getSize().width-1, getSize().height-1); 
System.out.println("width is "+getSize().width+"height is "+getSize().height); 
super.paintComponent(g); 
} 
protected void paintBorder(Graphics g) { 
g.setColor(getForeground()); 
g.drawOval(0, 0, getSize().width-1, getSize().height-1); 
} 
Shape shape; 
public boolean contains(int x, int y) { 
if (shape == null || !shape.getBounds().equals(getBounds())) { 
    shape = new Ellipse2D.Float(0, 0, getWidth(), getHeight()); 
} 
return shape.contains(x, y); 
}} 
संबंधित मुद्दे