在不同大小的 JPanel 之间切换
Switch between different sized JPanels
简而言之,我知道如何使用 CardLayout
和仅使用一个 JFrame
在不同的 JPanels
之间切换,但我想知道如何(如果可能的话)有不同大小的 JPanels
占据 JFrame
。 CardLayout
使用最大的面板,但我想知道是否有任何方法可以抑制或覆盖,以便我可以将不同的 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 方法中,因为我需要它以供将来使用,并且现在想确保它可以完成。
您不能使用 CardLayout。所以你需要自己管理可见面板。
逻辑是这样的:
JPanel content = (JPanel)frame.getContentPane();
content.removeAll();
content.add( theOtherPanel );
frame.pack();
所以您的想法是您一次只能将一个面板添加到内容窗格,您需要在打包框架之前通过删除和添加来交换它,以便框架以每个面板的大小显示.
问题是你为什么要这样做?用户不喜欢看到框架的大小不断变化。
要获得快速解决方案,请尝试使用两个单独的 JFrame,或在按下按钮时将框架调整为面板大小。
它似乎与 cardLayout 一起工作的唯一方法是在单击按钮后设置容器面板的首选大小。
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
layout.show(container, "panel2");
container.setPreferredSize(new Dimension(100, 100));
frame.pack();
}
});
这不是一个很好的解决方案,但它非常简单。
如果登录 window 是您所需要的,我肯定会推荐使用 2 个框架,看起来更合乎逻辑。
简而言之,我知道如何使用 CardLayout
和仅使用一个 JFrame
在不同的 JPanels
之间切换,但我想知道如何(如果可能的话)有不同大小的 JPanels
占据 JFrame
。 CardLayout
使用最大的面板,但我想知道是否有任何方法可以抑制或覆盖,以便我可以将不同的 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 方法中,因为我需要它以供将来使用,并且现在想确保它可以完成。
您不能使用 CardLayout。所以你需要自己管理可见面板。
逻辑是这样的:
JPanel content = (JPanel)frame.getContentPane();
content.removeAll();
content.add( theOtherPanel );
frame.pack();
所以您的想法是您一次只能将一个面板添加到内容窗格,您需要在打包框架之前通过删除和添加来交换它,以便框架以每个面板的大小显示.
问题是你为什么要这样做?用户不喜欢看到框架的大小不断变化。
要获得快速解决方案,请尝试使用两个单独的 JFrame,或在按下按钮时将框架调整为面板大小。
它似乎与 cardLayout 一起工作的唯一方法是在单击按钮后设置容器面板的首选大小。
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
layout.show(container, "panel2");
container.setPreferredSize(new Dimension(100, 100));
frame.pack();
}
});
这不是一个很好的解决方案,但它非常简单。
如果登录 window 是您所需要的,我肯定会推荐使用 2 个框架,看起来更合乎逻辑。