2016-07-16 4 views
1

私は、複数のJFramesの代わりにCardLayoutを使用する方法を学びたいと思っています。私はyoutubeで見つけたこのコードを使いこなしています。私はすべてのJPanes上でsetSize()を呼び出そうとしましたが、サイズを変更せず、最小ウィンドウサイズのままです。私はこのコード行のためにサイズを設定できないのですか? "panelCont.setLayout(cl);" ?JFrameのサイズを最小ウィンドウサイズから変更するにはどうすればよいですか?

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

public class CLayout { 
    JFrame frame = new JFrame("CardLayout"); 
    JPanel panelCont = new JPanel(); 
    JPanel panelFirst = new JPanel(); 
    JPanel panelSecond = new JPanel(); 
    JButton buttonOne = new JButton("Switch to second panel"); 
    JButton buttonSecond = new JButton("Switch to first panel"); 
    CardLayout cl = new CardLayout(); 

    public CLayout() { 
     panelCont.setLayout(cl); 

     panelFirst.add(buttonOne); 
     panelSecond.add(buttonSecond); 
     panelFirst.setBackground(Color.BLUE); 
     panelSecond.setBackground(Color.GREEN); 

     panelCont.add(panelFirst, "1"); 
     panelCont.add(panelSecond, "2"); 
     cl.show(panelCont, "1"); 

     buttonOne.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       cl.show(panelCont, "2"); 
      } 
     }); 

     buttonSecond.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       cl.show(panelCont, "1"); 
      } 
     }); 
     frame.add(panelCont); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 

    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new CLayout(); 
      } 
     }); 
    } 
} 
+1

パネルにコンポーネントを追加する(有効な優先サイズを与える)か、パネルのgetPreferredSize()メソッドをオーバーライドします。 –

答えて

1

はい、これはCardLayout用ですが、サイズ変更も可能です。たとえば、JPanelをネストすることができます。

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

どこ部品(ここではJLabelのではなく、JPanelのは)それがpreferredSizeがセットのしている、その後、別のJPanelに入れ コード:または、このようなものを使用。

私はこれがあなたを助けてくれることを願っています。

+0

これを書いてくれてありがとう! – symmetry96

+0

あなたの問題を解決した場合は、緑色のチェックをクリックして回答を受け入れてください。ありがとうございました –

関連する問題