सामान्य है: यदि आप एक लेआउट समस्या है, तो, हमेशा यह एक उपयुक्त 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);
}
* "मैं चाहता हूं कि जेएफआरएएम वर्तमान में प्रदर्शित जेपीनल के आकार के अनुकूल हो" * यह प्रदर्शित होगा कि प्रदर्शित सामग्री में बदलाव होने के कारण उपयोगकर्ता को फ्रेम परिवर्तन आकार होना चाहिए। –
एक फिक्स आकार होने के बाद आंतरिक पैनल मेल नहीं खाता है जब JFrame बहुत बदसूरत है। मैं इसे करने की कोशिश की। – JVerstry
मुझे यकीन नहीं है कि यह काम करेगा लेकिन आप इसे आजमा सकते हैं: 'frame.setSize (पैनल।getPreferredSize()); ' –