2011-03-24 115 views
2

使用Java CardLayout時可以更改Jpanel的大小嗎?使用CardLayout更改JPanel的大小

+0

是的,這是可能的。例如,您可以嵌套您的JPanel。如果你想在答案中提供更多的細節,你可能需要對你的問題做同樣的處理。 – 2011-03-24 03:19:09

+0

@Hovercraft全鰻魚,好吧,我加入了3個不同的JPanels到CardLayout,但我希望他們能夠顯示爲不同的大小,我一直在使用的setSize()嘗試,但它不工作,我不知道還有什麼嘗試。 – Neutralise 2011-03-24 03:43:06

+0

考慮嵌套它們與使用另一種佈局,諸如的FlowLayout其他面板的其它面板的內部,然後交換容器板。並且不要在大多數佈局管理器中使用setSize。而是使用setPreferredSize。 – 2011-03-24 03:54:07

回答

3

拍,像這樣在組件(這裏的JLabel,而不是一個JPanel)有它的首選大小設置,然後將其放置在使用適當的佈局,這裏的GridBagLayout與默認設置將圍繞組件另一個JPanel的,並使用JPanel添加GridBagLayout到CardLayout使用面板::

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.border.Border; 

public class MultiSizedPanels { 

    private static void createAndShowUI() { 
     final CardLayout cardLayout = new CardLayout(); 
     final JPanel cardHolder = new JPanel(cardLayout); 

     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(new GridBagLayout()); 
     containerPanel.add(labels[i]); 
     cardHolder.add(containerPanel, String.valueOf(i)); 
     } 

     JButton nextButton = new JButton("Next"); 
     nextButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      cardLayout.next(cardHolder); 
     } 
     }); 
     JPanel btnHolder = new JPanel(); 
     btnHolder.add(nextButton); 

     JFrame frame = new JFrame("MultiSizedPanels"); 
     frame.getContentPane().add(cardHolder, BorderLayout.CENTER); 
     frame.getContentPane().add(btnHolder, BorderLayout.SOUTH); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

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