" JPanel组件不止一次添加到父组件中#34; Java CardLayout问题

时间:2015-03-19 20:26:47

标签: java swing cardlayout

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

有几个面板共享相同的侧面菜单面板。

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

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

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

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

MenuPanel的代码在这里:

  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的类,因为它很大。无论如何,任何帮助都表示赞赏。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

就我而言,这是因为我在方法内部创建了新的JLabel 然后多次调用该方法,并将组件添加到面板中。

所以WindowBuilder插件认为我几次添加了相同的组件,这是不正确的。

作为解决方案,我终于在方法外部创建了JLabel,而方法只是对其进行了修改。