我正在用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);
}
}
我不打算包括有卡片布局的类,因为它很大。无论如何,任何帮助都是非常感谢的。
在我的例子中,之所以会发生这种情况,是因为我在方法内部创建了新的JLabel,然后多次调用该方法并将组件添加到面板中。
所以WindowBuilder插件认为我添加了几次相同的组件,这是不正确的。
作为解决方案,我最终在方法外部创建了JLabel,方法只是修改它。
浏览一下代码,我注意到你将布局设置为空。这肯定会导致一些问题发生。布局管理器可视化指南在尝试设置Swing界面时非常有用。尝试修复空布局,然后看看这是否解决了问题。对于复杂的布局,我还建议使用GroupLayout或GridBagLayout。他们可能很难学习如何使用第一,但肯定会帮助您解决您的问题,而不会强制布局为空或大小组件随意与setMin/Pref/Max。
问题内容: 我有一个和上。 在运行时添加到单击时。 我使用以下代码: 但没有显示任何在。 问题答案: 我看到您创建了一个名为: 但您永远不会将其添加到面板中。相反,您将没有文本的新内容添加到面板中: 当然,这将构造一个不可见的空标签。 添加类似后,还尝试在您的实例上调用和,如下所示: 这样,您可能还需要调用您的框架实例,以便调整大小以适合新组件。 另外,请不要使用/ 布局,这是非常糟糕的做法(除非
问题内容: 如何在jpanel中动态添加组件?当我单击按钮时,我应该有添加按钮,组件应该添加到JPanel。 我的问题是,当我单击添加按钮时,将文本字段和按钮添加到jpanel时,用户可以根据需要将它们添加到jpanel中的任意次数单击添加按钮。我已将scrollerpane添加到我的jpanel,并且jpanel布局管理器设置为null。 问题答案: 像往常一样,除了必须调用: 完成后,因为容器
我是个新手,所以不要用任何非技术性的词语。我有一个父组件,它在单击按钮时有一个按钮元素,调用一个函数来创建一个新对象。我想要的是,当用户单击这个按钮时,子组件应该呈现在父按钮元素下面,每次单击按钮时,新对象应该作为道具传递给子组件,以便它可以在屏幕上显示它,但以前调用的子组件应该保留在屏幕上。 从React导入; 类父母组件扩展反应。PureComponent{ }
在运行时添加到当单击时。 我使用以下代码: 但是在中没有显示任何。
是在切换时需要添加和删除的类。 如果使用状态来处理类名,那么内容重新发送器…示例:在子组件中有一个ajax调用,当单击menubutton时,它会重新编辑页面并返回其主页。
我有一个在父组件中生成的事件,子组件必须对此作出反应。我知道在中不建议使用这种方法,我必须执行emit,这非常糟糕。所以我的代码是这个。 正如您所看到的,在无限滚动上被触发,事件被发送到子组件搜索。不仅仅是搜索,因为它是根,所以它正在向每个人广播。 什么是更好的方法。我知道我应该使用道具,但我不知道在这种情况下我该怎么做。