当添加第二个 JPanel 时,Java CardLayout JPanel 向上移动

标签 java swing cardlayout

我是 Java 新手,主要是 CardLayout。我想简单地切换 JPanel 代表的“窗口”。我在某处读到了 CardLayout 的工作。但我的问题是,当 add chatPanelmainPanel (这是 CardLayout 的)时,它会将 connectPanel 的内容移动到顶部几个像素,远离其中心位置。我是否跳过代码 createChatPanel(), 它应该在的位置。

我有这个代码:

package App;

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

import javax.swing.*;
import Validators.*;



public class GUI {

private JFrame mainFrame = null;
private JPanel mainPanel = null;
private CardLayout cl = new CardLayout();

public GUI(){


    try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
         } 
         catch (UnsupportedLookAndFeelException e) {
         }
         catch (ClassNotFoundException e) {
         }
         catch (InstantiationException e) {
         }
         catch (IllegalAccessException e) {
         }

    mainFrame = new JFrame("MainChat");
    mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    mainFrame.setSize(640,480);
    mainFrame.setLocationRelativeTo(null);
    mainFrame.setResizable(false);
    mainFrame.setLayout(new GridBagLayout());

    JMenuBar menuBar = new JMenuBar();

    JMenu menuFile = new JMenu("Soubor");
    JMenu menuHelp = new JMenu("Nápověda");

    menuBar.add(menuFile);
    menuBar.add(menuHelp);

    menuFile.add(new JMenuItem("Nové Připojení"));
    menuFile.add(new JSeparator());
    menuFile.add(new JMenuItem("Konec"));
    menuHelp.add(new JMenuItem("O programu"));
    mainFrame.setJMenuBar(menuBar);


    createMainPanel();
    createConnectPanel();
    createChatPanel();

    mainFrame.setVisible(true);
}

public void createMainPanel() {

    mainPanel = new JPanel(cl);
    mainFrame.add(mainPanel);

}

public void createConnectPanel() {

    JPanel connectPanel = new JPanel();
    mainPanel.add(connectPanel,"connectPanel");

    JTextField ip = new JTextField();
    ip.setDocument(new JTextFieldLimit(15));
    ip.setColumns(11);

    JLabel iplabel = new JLabel("IP:");
    connectPanel.add(iplabel);
    connectPanel.add(ip);

    JButton connect = new JButton("Connect");
    connect.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {

            cl.show(mainPanel,"chatPanel");

        }
    });
    connectPanel.add(connect);

}

public void createChatPanel(){

    JPanel chatPanel = new JPanel();
    mainPanel.add(chatPanel,"chatPanel");

    JTextArea chatbox = new JTextArea();
    chatbox.setPreferredSize(new Dimension(200,200));
    chatPanel.add(chatbox);

}
}

请问我搞砸了什么?谢谢。

最佳答案

由于您要向主 JPanel 添加两个 JPanel, 这两个面板都需要适合主面板。

如果其中一个内面板比另一个大得多, 主面板将进行调整以适应较大的面板。

例如评论这一行:

chatbox.setPreferredSize(new Dimension(200,200));

会导致您的文本字段保持不变。这是因为 聊天框不会导致容器调整大小。

另请注意,主面板最初的大小与您的大小不同 主框架,因为您还没有设置主面板的大小。

如果您将 connectPanel 的大小设置为相同的大小 作为您的主框架, connectPanel 不会 添加 chatPanel 时自动调整大小(作为 调整 mainPanel 大小的结果)

所以你可以做的就是添加中间线:

JPanel connectPanel = new JPanel();
connectPanel.setSize(640, 480);
mainPanel.add(connectPanel, "connectPanel");

,这可能会解决您的问题。

虽然这可行,但我绝对推荐使用 MIG Layout为了 您所有的 GUI 设计。它将为您节省大量时间,如果 你需要一个小时来学习它。它还将使您免于 必须手动设置尺寸(从而使您免于 每次设计更改都必须重写一半的 GUI 代码)。

关于当添加第二个 JPanel 时,Java CardLayout JPanel 向上移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5695387/

相关文章:

java - JTable监听器问题

java - 如何使用卡片布局?

java - 如何重新加载 JPanel?

java - 将 build.gradle 放在 pom.xml 旁边

java - 为什么我不能用这段代码画一个椭圆?

java - 正确使用 MVC 模式在 Swing 中使用数据填充 Jlist

java - 将 keylistener 添加到 CardLayout 中的面板

java - 对数组进行排序并查找重复的数字

java - 使用函数隐藏所有相对布局,我们选择的除外

安装jdk 7u9后无法识别javafx