从起始方法获取 JFrame 到另一个方法
Getting a JFrame from the starting method into another method
我有一个问题,我试图在开始时从另一个方法(addAButton) 在同一个 class 内,但不起作用。我试过在 public 菜单 中调用 addAButton 但我不能,因为我不能在那个 class.代码:
public class Menu {
public Menu(Component component) {
JFrame frame = new JFrame("...");
frame.setSize(new Dimension(1050, 700));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(component);
// Set up the content pane.
try {
frame.setContentPane(new JLabel(new ImageIcon(ImageIO
.read(new File("res/menuBackground.png")))));
} catch (IOException e) {
e.printStackTrace();
}
addComponentsToPane(frame.getContentPane());
// Display the window.
frame.pack();
frame.setVisible(true);
}
public static void addComponentsToPane(Container pane) {
//some code...
pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS));
addAButton("SP", "res/Singleplayer.png",
"res/Singleplayer_pressed.png", pane, true);
//other buttons...
}
public static void addAButton(final String text, String BtnIcon,
String PressBtnIcon, Container container, Boolean isEnabled) {
//stuff for buttons...
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (button.getText().equals("Q")) {
System.exit(0);
} else if (button.getText().equals("SP")) {
Component component = new Component();
//here I want to put frame.dispose to close this window for when the game window opens.
component.start();
} else if(button.getText().equals("O")) {
//here I want to put frame.dispose to close this window for when the options window opens.
Component.Options();
}
}
});
}
}
首先,public Menu
代码块不是方法。它是一个构造函数。它的作用是初始化和准备这个class.
的一个新对象的字段
frame
变量是一个局部变量。如果在代码块内声明一个变量,它只能在该代码块内使用。一旦声明局部变量的代码块结束,局部变量就会被丢弃。
如果您希望能够从不同的方法访问数据项,则意味着该项是对象状态的一部分。也就是说,该对象应该在其整个生命周期内将该项目保存在其中,以便调用它的下一个方法可以使该项目可用。
当数据项是对象状态的一部分时,应将其声明为字段。也就是说,它不应该在任何方法或构造函数内部声明,而是应该在所有方法和构造函数之前声明。
声明字段后,可以在构造函数中对其进行初始化。然后您可以从同一 class.
中的任何方法访问该字段
public class Menu {
private JFrame frame; // This is the field declaration
public Menu( Component component ) {
frame = new JFrame("..."); // Here you just initialize, not declare.
... // Do the rest of your initializations
}
... // Other methods
}
现在您可以在任何方法中使用字段 frame
。
我有一个问题,我试图在开始时从另一个方法(addAButton) 在同一个 class 内,但不起作用。我试过在 public 菜单 中调用 addAButton 但我不能,因为我不能在那个 class.代码:
public class Menu {
public Menu(Component component) {
JFrame frame = new JFrame("...");
frame.setSize(new Dimension(1050, 700));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(component);
// Set up the content pane.
try {
frame.setContentPane(new JLabel(new ImageIcon(ImageIO
.read(new File("res/menuBackground.png")))));
} catch (IOException e) {
e.printStackTrace();
}
addComponentsToPane(frame.getContentPane());
// Display the window.
frame.pack();
frame.setVisible(true);
}
public static void addComponentsToPane(Container pane) {
//some code...
pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS));
addAButton("SP", "res/Singleplayer.png",
"res/Singleplayer_pressed.png", pane, true);
//other buttons...
}
public static void addAButton(final String text, String BtnIcon,
String PressBtnIcon, Container container, Boolean isEnabled) {
//stuff for buttons...
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (button.getText().equals("Q")) {
System.exit(0);
} else if (button.getText().equals("SP")) {
Component component = new Component();
//here I want to put frame.dispose to close this window for when the game window opens.
component.start();
} else if(button.getText().equals("O")) {
//here I want to put frame.dispose to close this window for when the options window opens.
Component.Options();
}
}
});
}
}
首先,public Menu
代码块不是方法。它是一个构造函数。它的作用是初始化和准备这个class.
frame
变量是一个局部变量。如果在代码块内声明一个变量,它只能在该代码块内使用。一旦声明局部变量的代码块结束,局部变量就会被丢弃。
如果您希望能够从不同的方法访问数据项,则意味着该项是对象状态的一部分。也就是说,该对象应该在其整个生命周期内将该项目保存在其中,以便调用它的下一个方法可以使该项目可用。
当数据项是对象状态的一部分时,应将其声明为字段。也就是说,它不应该在任何方法或构造函数内部声明,而是应该在所有方法和构造函数之前声明。
声明字段后,可以在构造函数中对其进行初始化。然后您可以从同一 class.
中的任何方法访问该字段public class Menu {
private JFrame frame; // This is the field declaration
public Menu( Component component ) {
frame = new JFrame("..."); // Here you just initialize, not declare.
... // Do the rest of your initializations
}
... // Other methods
}
现在您可以在任何方法中使用字段 frame
。