JLabel 未显示在框架或面板上

JLabel not showing on frame or on a panel

我正在制作一个计算器作为 Java class 的期末,我 运行 遇到了一个问题,该问题已停止该项目的所有进展。我已经将面板上的所有按钮都放在一个框架上,但由于某种原因,我似乎无法让带有输入数字的 JLabel 出现在框架上。我知道我可能遗漏了一些愚蠢的东西,但我们将不胜感激。

包装class:

import javax.swing.*;
import java.awt.*;

public class CalculatorFrame
{
public static void main (String[] args)
{

    JFrame frame = new JFrame ("Calculator");
    JPanel primary = new JPanel();
    JPanel numPad = new JPanel();
    JPanel textPanel = new JPanel();

    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

    textPanel.add(new NumberText());

    //Grid layout for buttons
    numPad.setLayout(new GridLayout(4, 3));

    //Number Buttons
    numPad.add(new Button1());
    numPad.add(new Button2());
    numPad.add(new Button3());
    numPad.add(new Button4());
    numPad.add(new Button5());
    numPad.add(new Button6());
    numPad.add(new Button7());
    numPad.add(new Button8());
    numPad.add(new Button9());
    numPad.add(new ButtonNeg());
    numPad.add(new Button0());
    numPad.add(new ButtonDec());

    primary.add(textPanel,BorderLayout.NORTH);
    primary.add(numPad, BorderLayout.SOUTH);

    frame.getContentPane().add(primary);
    frame.pack();
    frame.setVisible(true);
}
}

JLabel Class:

import javax.swing.*;

public class NumberText extends JLabel
{
private JLabel opNumLabel;
private String opNum;
private double storeNum = 0;
private boolean firstOp = true;

public void NumberText()
{
    opNum = "ur mom lol";
    opNumLabel = new JLabel (" " + opNum);
}

您的代码中实际上有 两个 JLable,一个是 NumberText class 扩展的,您没有向其中添加文本,并且您正在添加到 GUI,一个 within 与您添加文本的 class 相同,但您没有添加到 GUI。

解决方案:不要创建 class 来覆盖 JLabel - 如果您不扩展其行为,则无需执行此操作。而是简单地使用一个 JLabel。

其他问题:

  • 您将希望将大部分代码从 main 方法中取出并放入它所属的 class 适当位置。
  • 使用数组或 ArrayLists 来简化编码,从而简化调试。
  • 你真的每个按钮都有一个新的 class 吗?这是您真正不想要的调试和维护噩梦。相反会想要使用 JButtons 并更改它们的文本和侦听器。
  • 这一切都表明您过度使用了继承,而在大多数情况下您更倾向于使用组合。

您扩展了一个 JLabel,但没有使用实例本身,而是创建了另一个 JLabel opNumLabel 并使用了它。试试这个方法:

public class NumberText extends JLabel
{
    private String opNum;
    private double storeNum = 0;
    private boolean firstOp = true;

    public void NumberText()
    {
        super();
        opNum = "ur mom lol";
        this.setText(opNum);
    }
}

此外,您可能想考虑是否真的需要这个 NumberText 而不是使用普通的 JLabel