在不同大小的JPanel之间切换

时间:2015-12-27 20:00:46

标签: java swing jpanel

为了简短起见,我知道如何使用JPanelsCardLayout之间切换,只使用一个JFrame,但我想知道如果可能的话,如何有所不同大小JPanels占据JFrameCardLayout使用了最大的面板,但我想知道是否有任何方法可以抑制或覆盖,以便我可以将不同的JPanels添加到不同大小的JFrame。这是我的代码:

import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class View {

    //Views 
    private JFrame frame;
    private JPanel container;
    private JPanel panel1;
    private JPanel panel2;
    private CardLayout layout;


    private final int WIDTH = 1280;
    private final int HEIGHT = 720;


    public View(){
        init();
        frame = new JFrame();
        frame.setResizable(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.add(container);
        frame.pack();
        frame.setVisible(true);

    }

    private void init(){
        JButton button = new JButton();
        layout = new CardLayout();
        container = new JPanel(layout);
        panel1 = new JPanel();
        panel2 = new JPanel();

        panel1.setBackground(Color.WHITE);
        panel1.setPreferredSize(new Dimension(500, 500));
        panel1.add(button);

        panel2.setBackground(Color.BLACK);
        panel2.setPreferredSize(new Dimension(500, 500));

        container.add(panel1, "panel1");
        container.add(panel2, "panel2");

        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                layout.show(container, "panel2");
            }
        });
    }

    public static void main(String [] args){
        View view = new View();

    }


}

我将JButton放在init方法中,因为我需要它以备将来使用,并希望现在确保它可以完成。

3 个答案:

答案 0 :(得分:2)

要快速解决方案,请尝试使用两个单独的JFrame,或者在按下按钮时将框架的大小调整为面板大小。

答案 1 :(得分:1)

您无法使用CardLayout。因此,您需要自己管理可见面板。

逻辑如下:

JPanel content = (JPanel)frame.getContentPane();
content.removeAll();
content.add( theOtherPanel );
frame.pack();

所以我的想法是你一次只有一个面板添加到内容窗格中,你需要在打包之前通过删除和添加来交换它,这样框架就会以每个面板的大小显示。 / p>

问题是你为什么要这样做?用户不希望看到框架的大小不断变化。

答案 2 :(得分:1)

使用cardLayout的唯一方法是在单击按钮后设置容器面板的首选大小。

button.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            layout.show(container, "panel2");
            container.setPreferredSize(new Dimension(100, 100));
            frame.pack();
        }
    });

这不是一个非常好的解决方案,但它非常简单。

如果您需要登录窗口,我肯定会建议使用2帧,这似乎更合乎逻辑。