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
。
我正在制作一个计算器作为 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
。