Java 在不同大小的JPanel之间切换

Java 在不同大小的JPanel之间切换,java,swing,jpanel,Java,Swing,Jpanel,简而言之,我知道如何使用CardLayout和只使用一个JFrame在不同的JPanel之间切换,但是如果可能的话,我想知道如何让不同大小的JPanel占据JFrame。CardLayout使用了最大的面板,但我想知道是否有任何方法可以抑制或覆盖这些面板,以便我可以向不同大小的JFrame添加不同的JPanel。这是我的密码: import java.awt.CardLayout; import java.awt.Color; import java.awt.Dimension; import

简而言之,我知道如何使用CardLayout和只使用一个JFrame在不同的JPanel之间切换,但是如果可能的话,我想知道如何让不同大小的JPanel占据JFrame。CardLayout使用了最大的面板,但我想知道是否有任何方法可以抑制或覆盖这些面板,以便我可以向不同大小的JFrame添加不同的JPanel。这是我的密码:

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方法中,因为我需要它以备将来使用,并希望现在确保它可以完成。

您不能使用CardLayout。因此,您需要自己管理可视面板

逻辑应该是这样的:

JPanel content = (JPanel)frame.getContentPane();
content.removeAll();
content.add( theOtherPanel );
frame.pack();
因此,您一次只能将一个面板添加到内容窗格中,您需要在打包框架之前通过执行“删除”和“添加”来交换它,以便以每个面板的大小显示框架


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

您不能使用CardLayout。因此,您需要自己管理可视面板

逻辑应该是这样的:

JPanel content = (JPanel)frame.getContentPane();
content.removeAll();
content.add( theOtherPanel );
frame.pack();
因此,您一次只能将一个面板添加到内容窗格中,您需要在打包框架之前通过执行“删除”和“添加”来交换它,以便以每个面板的大小显示框架


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

要快速解决问题,请尝试使用两个单独的JFrames,或按按钮将框架调整为面板大小。

要快速解决问题,请使用两个单独的JFrames,或者将框架调整为按钮按下时面板的大小。

它似乎与cardLayout一起工作的唯一方法是在单击按钮后设置容器面板的首选大小

button.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            layout.show(container, "panel2");
            container.setPreferredSize(new Dimension(100, 100));
            frame.pack();
        }
    });
这不是一个很好的解决方案,但非常简单


如果您需要一个登录窗口,我绝对建议您使用两个框架,这似乎更符合逻辑。

它似乎与cardLayout一起工作的唯一方法是在单击按钮后设置容器面板的首选大小

button.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            layout.show(container, "panel2");
            container.setPreferredSize(new Dimension(100, 100));
            frame.pack();
        }
    });
这不是一个很好的解决方案,但非常简单



如果您需要一个登录窗口,我绝对建议您使用两个框架,这似乎更符合逻辑。

您是否尝试过在面板上设置最小大小,并在切换后调用frame.pack?我现在会,因此,我要做的不是设置首选大小,而是使用我的值来设置JPanel的最小大小,在我完成layout.showcontainer,panel2之后;我应该打电话给frame.packI设置了最小尺寸,但那只是一个非常小的框架…嗯。。然后,只需让首选的尺寸和包装:DIMHO-从用户的角度来看,更改窗口的大小很烦人,特别是当我可能已经将窗口大小调整到我想要使用的大小,并且知道您已经完成并完成了这一操作时,您是否尝试在面板上设置最小大小并在切换后调用frame.pack?我现在会,因此,我要做的不是设置首选大小,而是使用我的值来设置JPanel的最小大小,在我完成layout.showcontainer,panel2之后;我应该打电话给frame.packI设置了最小尺寸,但那只是一个非常小的框架…嗯。。然后,只需让首选的尺寸和包装:DIMHO-从用户的角度来看,更改窗口的大小是很烦人的,特别是我可能已经将窗口大小调整到了我想要使用的大小,并且知道你已经搞糟了,我需要一个小的登录框,然后让它为我的应用程序设置更大的登录框,不确定我是否想要超大的登录框。谢谢你的回答,我会尝试它摆脱卡片布局,两个面板同时出现,当我按下按钮时,面板1消失,两个面板同时出现-好的,你是否阅读了建议,一次只在框架中添加一个面板。我需要一个小的登录框架,然后让它进入我的应用程序更大的部分,我不确定我是否想要超大的登录框。谢谢你的回答,我会试试。去掉卡片布局,两个面板同时出现,当我按下按钮时,面板1消失,两个面板同时出现。你读过建议一次只在框架中添加一个面板吗?我本来会使用两个单独的框架,但老师说不可以,是的,绝望时间导致绝望措施XDI会使用两个单独的帧,但老师说不会,是的,绝望时间导致绝望措施XD@programmer,如果使用CardLayout,则面板的大小应相同。您不应该硬编码容器的首选大小。使用布局管理器的全部目的是让每个组件确定其自己的首选大小。如果您不希望面板大小相同,则可以按照我的建议更换面板,并给出简单的步骤。@programmer,如果您使用汽车 D布局-然后面板应具有相同的尺寸。您不应该硬编码容器的首选大小。使用布局管理器的全部目的是让每个组件确定其自己的首选大小。如果您不希望面板的大小相同,那么您可以按照我的建议交换面板,并给出简单的步骤。