2011-03-24 1 views
2

Java CardLayout을 사용할 때 Jpanels의 크기를 변경할 수 있습니까?CardLayout을 사용하여 JPanel의 크기를 변경하십시오.

+0

예, 가능합니다. 예를 들어 JPanel을 중첩 할 수 있습니다. 그래도 답을 더 자세히 보려면 ​​질문과 마찬가지로해야 할 수도 있습니다. –

+0

@Hovercraft 전체 뱀장어, 글쎄, 내가 CardLayout에 3 개의 다른 JPanels를 추가했지만 다른 크기로 표시하려면, 나는 setSize()를 사용하여 시도했지만 작동하지 않으며 다른 무엇을 해야할지 잘 모르겠다. 시험. – Neutralise

+0

FlowLayout과 같은 다른 레이아웃을 사용하여 다른 패널의 내부에 다른 패널을 중첩시키고 컨테이너 패널을 교체하십시오. 대부분의 레이아웃 매니저에서는 setSize를 사용하지 말아주세요. 대신 setPreferredSize를 사용하십시오. –

답변

3

슛 (이 경우 JPanel이 아닌 JLabel)은 preferredSize가 설정된 다음 적절한 레이아웃을 사용하는 다른 JPanel에 배치합니다. 여기서 기본 설정으로 구성 요소가 가운데에 배치되는 GridBagLayout 및 JPanel을 사용하여 CardLayout에 GridBagLayout을 추가하십시오 ::

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(); 
     } 
     }); 
    } 
}