我正在编写一个大型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的类,因为它很大。无论如何,任何帮助都表示赞赏。
答案 0 :(得分:2)
浏览代码,我注意到你将布局设置为null。这肯定会导致一些问题发生。 A Visual Guide to Layout Managers在尝试设置Swing界面时非常有用。尝试修复空布局,然后查看是否可以解决问题。我还建议GroupLayout或GridBagLayout用于复杂的布局。他们最初可能很难学会如何使用,但肯定会帮助您解决问题,而不会强制布局为null或使用setMin / Pref / Max随意调整组件大小。
答案 1 :(得分:0)
就我而言,这是因为我在方法内部创建了新的JLabel 然后多次调用该方法,并将组件添加到面板中。
所以WindowBuilder插件认为我几次添加了相同的组件,这是不正确的。
作为解决方案,我终于在方法外部创建了JLabel,而方法只是对其进行了修改。