当前位置: 首页 > 知识库问答 >
问题:

"JPanel组件被多次添加到父组件"JavaCardLayout问题

哈翔
2023-03-14

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

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

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

当我运行程序时,侧面板不会显示,因为在Eclipse设计解析器中,它表示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);
}
}

我不打算包括有卡片布局的类,因为它很大。无论如何,任何帮助都是非常感谢的。

共有2个答案

向俊贤
2023-03-14

在我的例子中,之所以会发生这种情况,是因为我在方法内部创建了新的JLabel,然后多次调用该方法并将组件添加到面板中。

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

作为解决方案,我最终在方法外部创建了JLabel,方法只是修改它。

弓玉书
2023-03-14

浏览一下代码,我注意到你将布局设置为空。这肯定会导致一些问题发生。布局管理器可视化指南在尝试设置Swing界面时非常有用。尝试修复空布局,然后看看这是否解决了问题。对于复杂的布局,我还建议使用GroupLayout或GridBagLayout。他们可能很难学习如何使用第一,但肯定会帮助您解决您的问题,而不会强制布局为空或大小组件随意与setMin/Pref/Max。

 类似资料:
  • 问题内容: 我有一个和上。 在运行时添加到单击时。 我使用以下代码: 但没有显示任何在。 问题答案: 我看到您创建了一个名为: 但您永远不会将其添加到面板中。相反,您将没有文本的新内容添加到面板中: 当然,这将构造一个不可见的空标签。 添加类似后,还尝试在您的实例上调用和,如下所示: 这样,您可能还需要调用您的框架实例,以便调整大小以适合新组件。 另外,请不要使用/ 布局,这是非常糟糕的做法(除非

  • 问题内容: 如何在jpanel中动态添加组件?当我单击按钮时,我应该有添加按钮,组件应该添加到JPanel。 我的问题是,当我单击添加按钮时,将文本字段和按钮添加到jpanel时,用户可以根据需要将它们添加到jpanel中的任意次数单击添加按钮。我已将scrollerpane添加到我的jpanel,并且jpanel布局管理器设置为null。 问题答案: 像往常一样,除了必须调用: 完成后,因为容器

  • 我是个新手,所以不要用任何非技术性的词语。我有一个父组件,它在单击按钮时有一个按钮元素,调用一个函数来创建一个新对象。我想要的是,当用户单击这个按钮时,子组件应该呈现在父按钮元素下面,每次单击按钮时,新对象应该作为道具传递给子组件,以便它可以在屏幕上显示它,但以前调用的子组件应该保留在屏幕上。 从React导入; 类父母组件扩展反应。PureComponent{ }

  • 在运行时添加到当单击时。 我使用以下代码: 但是在中没有显示任何。

  • 是在切换时需要添加和删除的类。 如果使用状态来处理类名,那么内容重新发送器…示例:在子组件中有一个ajax调用,当单击menubutton时,它会重新编辑页面并返回其主页。

  • 我有一个在父组件中生成的事件,子组件必须对此作出反应。我知道在中不建议使用这种方法,我必须执行emit,这非常糟糕。所以我的代码是这个。 正如您所看到的,在无限滚动上被触发,事件被发送到子组件搜索。不仅仅是搜索,因为它是根,所以它正在向每个人广播。 什么是更好的方法。我知道我应该使用道具,但我不知道在这种情况下我该怎么做。