访问由构造函数创建的对象

Accessing an object created by a constructor

我正在尝试学习 Java 中的一些基本 GUI 实现。

我有 2 个 classes,其中一个包含构造函数。此构造函数创建一个新的 JFrame 对象。

我在使用此 JFrame 构造函数时遇到问题 - 我想更改其大小和其他操作,但在调用构造函数后不知道如何操作。

这里有两个 classes,BmrCalcMain:

import javax.swing.*;

public class BmrCalcMain {

    public static void main(String[] args) {

        BmrCalcv2 frame = new BmrCalcv2();

        BmrCalcv2.newFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        BmrCalcv2.newFrame.setVisible(true);
        BmrCalcv2.newFrame.setSize(650, 475);
        BmrCalcv2.newFrame.setResizable(false);
    }
}

BmrCalcv2:

package v2;
import javax.swing.*;
import java.awt.FlowLayout;

public class BmrCalcv2  {

    private JLabel ageLabel;
    private JLabel genderLabel;
    private JLabel img1;
    static JFrame newFrame;

    public BmrCalcv2() {

        newFrame = new JFrame("BMR/TDEE Calculator");
        newFrame.setLayout(new FlowLayout());

        ageLabel = new JLabel("Age:");
        genderLabel = new JLabel("Gender:");
        img1 = new JLabel(new ImageIcon("filesrc/Bodybuilding-icon.png"));

        newFrame.add(ageLabel);
        newFrame.add(genderLabel);
        newFrame.add(img1);
    }
}

当我 运行 应用程序时,BmrCalcv2 class 中的 JLabel 和图像不会出现。我相信这是因为在主要 class 中,frame 的使用是错误的(我需要以某种方式使用 newFrame 但如果我将 frame 更改为 newFrame 它会抛出错误)。

感谢任何指导。

了解您的 BmrCalcv2 class 使用 两个 JFrame,而不是一个。一个是带有扩展 JFrame 的 BmrCalcv2 class 的实例,另一个是 BmrCalcv2 构造函数中的私有字段。你应该摆脱一个或另一个来理顺这一切。如果您决定使用该变量,则将其设为 class 的字段,而不是构造函数的局部变量。或者,如果您想使用 class 扩展自的 JFrame,则删除 newFrame 字段:

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

public class BmrCalcv2 extends JFrame {
    private JLabel ageLabel;
    private JLabel genderLabel;
    private JLabel img1;

    public BmrCalcv2() {
        super("BMR/TDEE Calculator");
        setLayout(new FlowLayout());

        ageLabel = new JLabel("Age:");
        genderLabel = new JLabel("Gender:");
        img1 = new JLabel(new ImageIcon("filesrc/Bodybuilding-icon.png"));

        add(ageLabel);
        add(genderLabel);
        add(img1);
    }
}

其他方面推荐:

  • 通常不要设置组件的大小,而是让组件和布局管理器自行调整大小。
  • 了解随着布局管理器的发展,FlowLayout 并不是包中最亮的,并且随着您的 GUI 变得越来越复杂(这个可能很快就会出现),您可能希望使用更健壮的布局来嵌套 JPanel。
  • None 我的 Swing GUI 扩展了 JFrame,但它们中的大多数要么扩展了 JPanel,要么用于生成 JPanel,这样我就获得了很大的灵活性,因为我可以将这个 JPanel 放在我希望的任何地方,在一个 JFrame,一个 JDialog,一个 JOptionPane,另一个 JPanel,在一个 JTabbedPane 中,.....