【问题标题】:JLabels (And other things) wont show up inside a JPanel in a JFrame (multiple JFrames)JLabels(和其他东西)不会出现在 JFrame(多个 IFrame)中的 JPanel 内
【发布时间】:2012-12-09 19:33:30
【问题描述】:

我创建了一个应用程序,但我的 JLabel 无法正常显示。该应用目前看起来像这样:

这些是使用以下代码创建的 JFrame 中的 2 个 JPanel:

public JFrame window = new JFrame();
public JPanel top = new JPanel();
public static JPanel main = new JPanel();
public JPanel login = new JPanel();

// ...

主类内部:

window.setSize(1000, 700);
login.setSize(250, 200);
//   main.setSize(500,500);
main.setLocation(500,100);

window.add(login);
window.add(main);

login.add(new view.LoginPanel());

main.setLayout(new BorderLayout());
main.add(new view.CategoryList(), BorderLayout.CENTER);
main.validate();
main.repaint();

window.validate();
window.setVisible(true);

这将显示我现在拥有的框架。但在黑线上方应该有一个由此创建的标题:

public class CategoryList extends JPanel implements MouseListener {
    public CategoryList() {
        super();
        setLayout(null);
        initComponents();
        revalidate();
        repaint();
        addTitle();
    }
}

标题是这样创建的:

private void addTitle() {
    JLabel lblTitle = new JLabel();
    lblTitle.setText("Winkelapplicatie");
    lblTitle.setBounds(20, 20, 150, 20);
    lblTitle.setFont(WinkelApplication.FONT_16_BOLD);
    this.add(lblTitle);
    System.out.println("addTitle");
}

但它没有显示出来。我知道这段代码中有很多方法没有显示,但我已经包含了我认为所有必要的代码。

希望有人能帮助我,在此先感谢!

编辑:

我已经剥离了我的代码,以便它可以在线: 主包: WinkelApplication.java:

package main;


import java.awt.BorderLayout;
import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;



public final class WinkelApplication {

public static final String NAME = "hi";
public static final String CURRENCY = "\u20AC";
public JFrame window = new JFrame();
public JPanel top = new JPanel();
public static JPanel main = new JPanel();
public JPanel login = new JPanel();

public static final Font FONT_10_PLAIN = new Font("Verdana", Font.PLAIN, 10);
public static final Font FONT_10_BOLD = new Font("Verdana", Font.BOLD, 10);
public static final Font FONT_12_BOLD = new Font("Verdana", Font.BOLD, 12);
public static final Font FONT_16_BOLD = new Font("Verdana", Font.BOLD, 16);

private static WinkelApplication instance = new WinkelApplication();

private WinkelApplication() {
}

public void initialize() {
    try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (Exception e) {
        System.err.println("Error setting LookAndFeelClassName: " + e);
    }

}

public void startup() {
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setSize(1000, 700);
    login.setSize(250, 200);
     main.setLocation(500,100);
    window.add(login);
    window.add(main);
    login.add(new main.LoginPanel());  
     main.setLayout(new BorderLayout());
    main.add(new main.CategoryList(), BorderLayout.CENTER);
    main.validate();
    main.repaint();
    window.validate();
    window.setVisible(true);


}

public static WinkelApplication getInstance() {
    return instance;
}

public static void main(String args[]) {
    final WinkelApplication applicatie = WinkelApplication.getInstance();
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            try {
                applicatie.initialize();
                applicatie.startup();
            } catch (Exception e) {
                System.out.println("Application" + applicatie.getClass().getName() + "failed to launch");
            }
        }
    });
}
}

LoginPanel 类:(只是使用 Netbeans 中的 GUI 设计器创建的文本字段)

  /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package main;

import main.WinkelApplication;

public class LoginPanel extends javax.swing.JPanel {

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

private Boolean loggedIn = null;

@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    javax.swing.JLabel jLabel1 = new javax.swing.JLabel();

    jLabel1.setText("TextField in JPanel 1");

    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()
            .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 124, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addContainerGap(114, Short.MAX_VALUE))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jLabel1)
            .addContainerGap(98, Short.MAX_VALUE))
    );
}// </editor-fold>                        

public Boolean isLoggedIn(){
    return loggedIn;
}
// Variables declaration - do not modify                     
// End of variables declaration                   
}

CategoryList 类(这里的文本应该在行的上方,但不会显示出来)

package main;

import main.WinkelApplication;
import java.awt.Graphics;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class CategoryList extends JPanel {

public CategoryList() {
    super();
    setLayout(null);
    initComponents();
}

/** create the gui for this page */
private void initComponents() {
    addTitle();
}

/** add the page's title */
private void addTitle() {
    JLabel lblTitle = new JLabel();
    lblTitle.setText("Winkelapplicatie");
    lblTitle.setBounds(20, 20, 150, 20);
    lblTitle.setFont(WinkelApplication.FONT_16_BOLD);
    this.add(lblTitle);
    System.out.println("addTitle");
}

@Override
public void paint(Graphics graphics) {
    super.paint(graphics);
    graphics.drawLine(20, 45, 540, 45);
}
}

希望现在有人可以帮助我。再次提前感谢。

【问题讨论】:

  • 您的代码有点碎片化和不完整,我们很难完全理解。我们不想看到你所有的代码,只是显示你的问题,足够完整可以编译和运行,并且没有与问题无关的代码。最好创建并发布一个sscce,我们可以运行它并显示您的问题。另外,要改掉使用空布局的习惯。你几乎从不想要使用它。
  • @Hovercraft Full Of Eels 好的,感谢您的回答。我得到了代码,我必须让它变得更好更大,我上传了源代码(只是任何人需要的部分)就在这里:link。因此,您可以尝试并查看代码,将其粘贴到此处,这将是很多课程要做和阅读...这就是我上传它的原因。我希望有人可以帮助我。
  • Marc:没有人愿意上传源代码。请重新阅读我的帖子并检查我上面评论中的链接。它会准确地告诉您我们需要什么。了解这将需要您的努力。因此,如果您没有很快得到一个像样的答案,请考虑付出努力,因为它可能非常值得。运气。
  • 其实它是画出来的,但似乎被登录面板隐藏了。删除window.add(login); 进行验证。你真的应该考虑不使用空布局 - 因为你的问题表明它比任何合理的布局管理器都更复杂。
  • 我还查看了 setLayout(null) 的作用,即我不必设置标签的每个位置等等,但这已经由其他人完成了我必须在哪个代码上继续,所以我必须使用它。

标签: java swing jframe jpanel null-layout-manager


【解决方案1】:

一个可能的简单解决方案:

您的主应用程序 JPanel 应该使用 BorderLayout。将标题 JLabel 放在 BorderLayout.PAGE_STATE(也称为 BorderLayout.NORTH)中,并将 GUI 的其余部分放在 BorderLayout.CENTER 位置。

【讨论】:

  • 这就是问题所在,我已经得到了那个代码,我必须将它用作 JPanel,我必须在 JPanel 中显示它并在屏幕上显示多个 JPanel...我希望有一个解决方案...
  • @Marc:然后使用布局放置 JPanel。 JLabels、JPanels 等都源自 JComponent,并且几乎可以互换放置到任何容器中。有一个解决方案,实际上是您学习布局管理器教程并使用它包含的信息。从这里开始:Laying out components in containers
  • 我知道了,我在这里提交了它作为答案,但我只能在 24 小时后将它设置为好......无论如何,谢谢! :)
【解决方案2】:

我通过将主布局也设置为 setLayout(null) 来解决此问题,我只需将其用于此项目...

下次我必须从头开始编写它时,我不会使用它! 无论如何,感谢您的帮助,我永远不会发现问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多