访问由构造函数创建的对象
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 中,.....
我正在尝试学习 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 中,.....