访问由构造函数

时间:2015-06-14 01:07:16

标签: java swing jframe

我正在尝试用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但是如果我将帧更改为newFrame则会抛出错误)。

感谢任何指导。

1 个答案:

答案 0 :(得分:2)

了解您的BmrCalcv2类使用的是两个 JFrame,而不是一个。一个是扩展JFrame的BmrCalcv2类的实例,另一个是BmrCalcv2构造函数中的私有字段。你应该摆脱一个或另一个来理顺这一切。如果您决定使用该变量,则将其设为该类的字段,而不是构造函数的本地变量。或者如果你想使用你的类扩展的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。
  • 我的Swing GUI都没有扩展JFrame,而是大多数扩展Jarame或者扩展JPanel或者用于生成JPanel,这样我就可以获得很大的灵活性,因为我可以将这个JPanel放在我想要的任何地方,在JFrame,JDialog中,一个JOptionPane,另一个JPanel,在JTabbedPane,.....