java - JPanel 不显示组件

标签 java swing jpanel

让我们从一些背景开始,这是第一年的拼贴项目。 GUI 构建为一个类,接口(interface)处理程序调用所有 JPanel 并将它们放在正确的位置。这是为了结构,因此易于维护。

问题是包含菜单的面板在添加后不显示它的组件。我会附上一些图片,这样更容易理解。

有问题的面板称为 MenuPanel。

这里是登录按钮,目前只清除内容面板,然后添加菜单面板。

Login page where the button is located

这里是空的菜单面板

here is the menu panel all empty

代码 接口(interface)处理程序 你可以看到我已经在菜单方法中弄乱了 .repaint() 方法。 公共(public)类 InterfaceHandler {

private static InterfaceHandler singleton;

/**
 * Checks if there is already a instance running of InterfaceHandler if so
 * return the instance if not create a instance.
 *
 * @return Instance
 */
public static InterfaceHandler instance() {
    if (singleton == null) {
        singleton = new InterfaceHandler();
    }

    return singleton;
}

private ContentPanel contentPanel;
private LoginPanel loginPanel;
private MainFrame mainFrame;
private MainPanel mainPanel;
private MenuPanel menuPanel;

/**
 * Initializes default Interface
 */
public InterfaceHandler() {
    initComponents();

}

/**
 * Initializes GUI Components that will be needed now or in the future.
 */
public void initComponents() {
    mainFrame = new MainFrame();
    mainPanel = new MainPanel();
    contentPanel = new ContentPanel();
    loginPanel = new LoginPanel();
    menuPanel = new MenuPanel();

    contentPanel.setBounds(100, 100, 860, 700);
    menuPanel.setBounds(10, 10, 80, 400);
    loginPanel.setBounds(280, 250, 300, 200);

    mainFrame.add(mainPanel);
    mainPanel.add(contentPanel);

    mainFrame.setVisible(true);
    contentPanel.add(loginPanel);
}

/**
 * Clears the ContentPanel of all components
 */
public void clear() {
    System.out.println("Clear Ran");
    contentPanel.removeAll();
    contentPanel.repaint();
}

/**
 * Adds the Login Screen.
 */
public void login() {
    System.out.println("Login Ran");
    contentPanel.add(loginPanel);
    contentPanel.repaint();
}

/**
 * Adds the menu.
 */
public void menu() {
    System.out.println("Menu Ran");
    mainPanel.sidePanel.add(menuPanel);
    menuPanel.repaint();
    mainPanel.repaint();
    mainPanel.sidePanel.repaint();
}

}

这是面板的代码,其中大部分是由 netbeans 设计编辑器自动生成的。 所以它很难看(对不起)

公共(public)类 MenuPanel 扩展了 javax.swing.JPanel {

/**
 * Creates new form MenuPanel
 */
public MenuPanel() {
    initComponents();
}

/**
 * This method is called from within the constructor to initialize the form.
 * WARNING: Do NOT modify this code. The content of this method is always
 * regenerated by the Form Editor.
 */
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    jLabel1 = new javax.swing.JLabel();
    jSeparator1 = new javax.swing.JSeparator();
    jLabel2 = new javax.swing.JLabel();
    baggageButton = new javax.swing.JLabel();

    jLabel1.setBackground(new java.awt.Color(204, 204, 204));
    jLabel1.setFont(new java.awt.Font("Tahoma", 0, 13)); // NOI18N
    jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
    jLabel1.setText("Menu");

    jSeparator1.setBackground(new java.awt.Color(204, 204, 204));

    baggageButton.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
    baggageButton.setText("Baggage");

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
    this.setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(jSeparator1)
                .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(baggageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(jLabel2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            .addContainerGap())
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGap(0, 0, 0)
            .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 4, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
            .addComponent(baggageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 53, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGap(18, 18, 18)
            .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 53, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
    );
}// </editor-fold>                        

// Variables declaration - do not modify                     
private javax.swing.JLabel baggageButton;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JSeparator jSeparator1;
// End of variables declaration                   
}

澄清一下,方法菜单是从不同的类调用的。

最佳答案

如果要将组件添加到已经可见的面板,则需要调用 validate()

public void menu() {
    System.out.println("Menu Ran");
    mainPanel.sidePanel.add(menuPanel);

    mainPanel.sidePanel.validate();  // try this

    menuPanel.repaint();
    mainPanel.repaint();
    mainPanel.sidePanel.repaint();
}

关于java - JPanel 不显示组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26853598/

相关文章:

java - 我收到变量 isOperator 的编译错误是什么?

java - 从另一个单独的类访问公共(public)非静态对象

java - 错误 : getText must be called from the UI thread

java - 如何将复选框 [组合框] 列表添加到 Java Netbeans Swing 应用程序中的 JScrollPane

java - 为什么图像不显示?

java - 什么 Java JPanel 布局允许中心、侧面和角元素?

java - 通用公共(public)集合

java - 如何自动更改 Jlabel

java - 如何检查 JTabbedPane 中的选项卡是否处于 Activity 状态?

java - 如何2 : Add a JPanel to a Document then export to PDF