Java Swing:将JLabel添加到JPanel

3

我只是想将一个JLabel添加到现有的JPanel中。这似乎非常简单,我已经搜索了所有相关内容。我认为我的代码没问题,但标签没有出现在面板上。有人看到我漏掉了什么吗?谢谢!

ResultsPanel myPanel = new ResultsPanel(pnlResults);  //pnlResults is an existing JPanel
myPanel.addLabel(pnlResults);

public class ResultsPanel extends JPanel {

    JPanel myPanel;

    public ResultsPanel(JPanel thisPanel) {
        myPanel = thisPanel;
    }

    public void addLabel(JPanel myResults) {
        JLabel myLabel = new JLabel("test", JLabel.LEFT);
        myPanel.setLayout(new FlowLayout());
        add(myLabel);        
    }

}

编辑:针对下面立即的回复,我同意这似乎是过度。我选择这条路线是因为以下代码也没有将JLabel添加到我的JPanel中:

JLabel myLabel = new JLabel("test"); 
pnlResults.add(myLabel);

如果您认为有必要进行一些修改,我更愿意使用这段代码,请随意发表评论。再次感谢!


1
请查看我的帖子上最后一条评论,以回应您的最新编辑。 - Alex Coleman
谢谢,Alex。我看了你的评论。我认为我在我的编辑中所做的与此相同,对吗?我的JPanel坐落在一个已经存在的JDialog上(由GUI构建器创建),所以我不需要在我的代码中加入那部分。这两行只是JDialog表单构造函数的一部分。我是否正确地遵循了你的建议? - AndroidDev
你能发一下更多的代码吗(可以删除与问题无关的部分,只保留swing相关的内容)?那应该会有所帮助。 - Alex Coleman
4个回答

7
这似乎是为了做一件基本的事情而费劲;只需调用 即可。
JLabel label = new JLabel("Test text");//initialize the label
//do some stuff with label here maybe...
panel.add(label);//now add it

不需要创建一个类来继承JPanel并包含一个JPanel;如果一个类继承了JPanel,只需使用this即可获取JPanel实例(因此addLabel将改为this.setLayout(blah))。但是对于像添加JLabel这样简单的事情,甚至没有必要子类化JPanel。

总的来说,以下是最简单的Swing应用程序:

    JFrame frame = new JFrame("Basic Swing");//Make a frame
    frame.setSize(300, 300);//Give it a size
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//Make it go away on close
    JPanel panel = new JPanel();//Make a panel
    frame.add(panel);//Add it to your frame

    JLabel label = new JLabel("Hello StackOverflow!");//Make a label
    panel.add(label);//Add it to the panel (which is on the frame)

    frame.setVisible(true);//Show the frame

1
完全同意。我尝试了这段精确的代码(并且刚刚再次尝试)。结果一样 - 没有标签。 - AndroidDev
1
@usr55410 请看我的修改,我添加了一个基本的Swing应用程序,您可以将其与您的应用程序进行比较并找到错误,或者只需在此处添加更多代码。 - Alex Coleman
我明白了。问题不在这段代码上。我的JPanel必须设置为FlowLayout。非常感谢您的帮助,我很感激! - AndroidDev
啊,好的,有点奇怪,那应该是一个JPanel的默认布局。不管怎样,很高兴知道问题已经解决了,也很高兴我能够帮上一点忙 :) - Alex Coleman
你真的帮了大忙。你的建议让我停止专注于编写不必要的类,并考虑其他可能的原因。否则我会浪费很长时间。谢谢! - AndroidDev

5

首先,你扩展了 JPanel

其次,你提供了自己的 JPanel

现在,从你的代码片段中,无法确定是否已将 ResultsPanemyPanel 添加到任何类型的 Container 中,但根据你所说,我建议这将是你面临的主要问题。


0

你真的想要/需要一个实际的JLabel对象吗?如果不需要,你可以按照以下方式为你的面板添加标签:

public void addLabel() {
    myPanel.setBorder(new TitledBorder("test"));
}

-1

试试这个

JLabel myLabel = new JLabel("test text");
myLabel.setSize(myLabel.getPreferredSize());
panel.add(myLabel);
panel.revalidate();
panel.repaint();

应该是 getPreferredSize - Marin Sagovac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接