java - "JPanel component is added to parent component more than once"Java CardLayout问题

标签 java swing cardlayout

我正在 swing 中编写一个大型 Java 桌面程序,并且在 CardLayout 中使用一个 JFrame 和大约 30 个 JPpanels

有多个面板共享同一个侧面菜单面板。

在程序的原型(prototype)中,我在每个 JPanel 中编写了这个 menuPanel。然而,我意识到代码非常冗余,因此尝试优化它,我创建了这个 MenuPanel 类作为 JPanel,并将其添加到所有其他 JPanel 中。然后我将这些 JPanel 添加到 CardLayout 中。

当我运行该程序时,侧面板不显示,因为在 Eclipse Design Parser 中它说 MenuPanel 已添加到多个父组件。

首先,您认为使用 CardLayout 是一个好的设计吗?或者您认为我应该使用一个 JFrame 和一个 JPanel,并在每次需要时不断更新 JPanel(删除组件,然后添加其他组件)?

其次,是否有解决方法可以解决我上面提出的问题?

菜单面板的代码在这里:

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

public class MenuPanel extends JPanel {
private static final long serialVersionUID = 1L;

public static JLabel lblPicture = new JLabel("New label");
public static JLabel lblName = new JLabel("Fname Lname");
public static JButton btnCourses = new JButton("Courses");
public static JButton btnChat = new JButton("Chat");
public static JButton btnSchedule = new JButton("Schedule");
public static JButton btnProfile = new JButton("Profile");
public static JButton btnAdvancedTools = new JButton("Advanced Tools");
public static JButton btnSignOut = new JButton("Sign Out");
public static JLabel lblWelcomeBack = new JLabel("Welcome Back");

public MenuPanel() {
    initializeComponents();
}

private void initializeComponents() {
    this.setLayout(null);
    this.setVisible(true);
    this.setBounds(0, 0, 129, 562);

    lblPicture
            .setIcon(new ImageIcon(getClass().getResource("Profile.png")));
    lblPicture.setBounds(0, 11, 124, 128);
    this.add(lblPicture);

    lblName.setHorizontalAlignment(SwingConstants.CENTER);
    lblName.setFont(new Font("Tahoma", Font.BOLD, 12));
    lblName.setBounds(10, 150, 115, 20);
    this.add(lblName);

    btnCourses.setBounds(10, 195, 110, 25);
    this.add(btnCourses);

    btnChat.setBounds(10, 240, 110, 25);
    this.add(btnChat);

    btnSchedule.setBounds(10, 285, 110, 25);
    this.add(btnSchedule);

    btnProfile.setBounds(10, 325, 110, 25);
    this.add(btnProfile);

    btnAdvancedTools.setBounds(10, 370, 110, 25);
    this.add(btnAdvancedTools);

    btnSignOut.setBounds(10, 515, 110, 25);
    this.add(btnSignOut);
}
}

下面是使用此 MenuPanel 的众多面板之一的代码:

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

public class MainPagePanel extends JPanel {
private static final long serialVersionUID = 1L;

protected static JPanel AppPanel = new JPanel();
protected static MenuPanel menuPanel = new MenuPanel();
protected static JLabel lblWelcomeBack = new JLabel("Welcome Back");

public MainPagePanel() {
    initializeComponents();
}

private void initializeComponents() {
    this.setLayout(null);
    AppPanel.setLayout(null);
    AppPanel.add(menuPanel, 0, 0);

    AppPanel.setBackground(new Color(173, 216, 230));
    AppPanel.setBounds(129, 0, 471, 562);

    lblWelcomeBack.setHorizontalAlignment(SwingConstants.CENTER);
    lblWelcomeBack.setFont(new Font("Tahoma", Font.BOLD, 55));
    lblWelcomeBack.setBounds(10, 215, 435, 140);
    AppPanel.add(lblWelcomeBack);

    this.add(AppPanel);
}
}

我不会包含包含 CardLayout 的类,因为它很大。不管怎样,任何帮助都是值得赞赏的。

最佳答案

浏览一下代码,我注意到您将布局设置为 null。这肯定会导致一些问题的发生。 A Visual Guide to Layout Managers在尝试设置 Swing 界面时非常有用。尝试修复空布局,然后查看是否可以解决问题。我还推荐 GroupLayoutGridBagLayout对于复杂的布局。它们一开始可能很难学习如何使用,但肯定会帮助您解决问题,而不会强制布局为空或使用 setMin/Pref/Max 随意调整组件大小。

关于java - "JPanel component is added to parent component more than once"Java CardLayout问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29154329/

相关文章:

java - 如何禁用 JTable 中的特定单元格?

java - Spring不加载自定义CSS

java - 需要使用矩阵平滑图像 - 计算单元格总和并计算平均值

java - 在保留箭头图标的同时动态设置 DisclosurePanel 的标题文本?

java - 混淆嵌入其他 Jar 文件的 Jar 文件

java - 如何在 CardLayout 中的 JPanel 之间切换?

java - 创建 JFileChooser 对话框时如何选择默认的 FileFilter?

java - 使用 JButton 将变量切换为 true/false

java - 如何动态更改 JFrame 内的 JPanel?

java - 使用 CardLayout 将自定义面板添加到 Applet