【问题标题】:JPanel not showing ComponentsJPanel 不显示组件
【发布时间】:2014-11-10 21:47:47
【问题描述】:

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

问题是保存菜单的面板在添加后不显示它的组件。我将包含一些图像,以便更容易理解。

有问题的面板称为 MenuPanel。

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

Login page where the button is located

这里的菜单面板是空的

here is the menu panel all empty

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

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 设计编辑器自动生成的。 所以很丑(对不起)

公共类 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                   
}

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

【问题讨论】:

  • 如需尽快获得更好的帮助,请提供MCVE。虽然我可以说你似乎想要做的事情是用CardLayout 做的更合适。您这样做的方式(手动交换面板)是粗略的,并且容易出现异常的布局/绘画问题。
  • @Radiodef 我来看看!

标签: java swing jpanel


【解决方案1】:

如果要向已经可见的面板添加组件,则需要调用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();
}

【讨论】:

【解决方案2】:

(这个答案是错误的,但随后的 cmets 确实有助于理解为什么 @whiskeyspider 的答案是正确的)

在这段代码中:

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

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

您不会在任何地方添加menuPanel。它在menu() 方法中添加(为时已晚),但未被调用。

【讨论】:

  • 对不起,也许我应该更清楚一点,当在登录面板中按下登录按钮时,它会运行此代码(它位于 InterfaceHandler 的底部)。 public void menu() { System.out.println("Menu Ran"); mainPanel.sidePanel.add(menuPanel); menuPanel.repaint(); mainPanel.repaint(); mainPanel.sidePanel.repaint(); }
  • 你确定吗?我可以看到定义了menu() 方法,但我看不到它在任何地方被调用。
  • 它是从不同的类中调用的。一旦按下按钮,它就会调用 InterfaceHandler.instance.menu()
  • 啊。那个类也pack() JFrame 吗?
  • 不,我从来没有使用过 pack(),因为这似乎把一些东西搞砸了。我应该有吗?
猜你喜欢
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
相关资源
最近更新 更多