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

Java 访问构造函数创建的对象,java,swing,jframe,Java,Swing,Jframe,我试图学习一些基本的Java GUI实现 我有两个类,一个包含构造函数。此构造函数创建一个新的JFrame对象 我在使用这个JFrame构造函数时遇到了问题-我想更改它的大小和其他操作,但在调用构造函数后,我不知道如何更改 以下是两个类,BmrCalcMain: import javax.swing.*; public class BmrCalcMain { public static void main(String[] args) { BmrCalcv2 fra

我试图学习一些基本的Java GUI实现

我有两个类,一个包含构造函数。此构造函数创建一个新的JFrame对象

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

以下是两个类,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
类中的JLabel和图像不会出现。我相信这是因为在主类中,frame的使用是错误的(我需要以某种方式使用newFrame,但是如果我将frame更改为newFrame,它会抛出错误)


非常感谢您的指导。

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

i、 e

其他方面的建议:

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

这些是相同的类,我认为你剪切和粘贴错误。你发布了两次
BmrCalcMain
。为什么我得到-1?可能是因为你在发布问题时没有很好地校对。我删除了“extends JFrame”,所以我在构造函数内只有一个,并在构造函数外设置了一个变量“static JFrame newFrame”,然后用构造函数“newFrame=newjframe(“BMR/TDEE计算器”)”实例化。这似乎使它在离开主类的同时起到了作用。然而,它说变量框架没有被使用(因为它没有),但这很好,对吗?无论如何实例化新的JFrame对象/添加组件,我都需要这一行。@Ftahir192:请参见编辑以回答,--我做的与您相反,但两者都可以。如果你去掉<代码>扩展了jFrase>代码,那么你需要NeXFrand变量,但是,再次考虑把它变成类的一个字段。谢谢你的额外信息。我最初是自己设置对象的位置,但后来知道这不是一个好方法。我同意目前FlowLayout组织组件的方式并不理想。您会推荐哪个布局管理器来实现与此站点上的计算器类似的功能:@Ftahir192:a JPanel是一个Swing GUI容器,通常包含其他Swing组件。例如,如果您想在GUI中对一组单选按钮进行分组,您可能会创建一个JPanel,给它一个GridLayout,将JRadioButtons添加到JPanel,然后将JPanel添加到另一个组件,通常是另一个JPanel。JFrame是桌面GUI的最顶层窗口,是一个复杂的复合组件,由许多子组件组成,包括一个称为其contentPane的JPanel,它包含JFrame的全部内容。您可以将JPanel分层到其他JPanel中,允许…@Ftahir192:。。。使用相对简单的布局管理器的复杂布局。
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);
    }
}