Java 从另一个JFrame调用方法
我想从另一个JFrame(大型机)获取一个JFrame(createFrame)。我在大型机中创建了一个返回createFrame的方法,以便在单击createFrame中的按钮时可以处理createFrame。但是我不能从第二个JFrame(createFrame)调用这个方法(getCreateFrame) MainFrame.javaJava 从另一个JFrame调用方法,java,Java,我想从另一个JFrame(大型机)获取一个JFrame(createFrame)。我在大型机中创建了一个返回createFrame的方法,以便在单击createFrame中的按钮时可以处理createFrame。但是我不能从第二个JFrame(createFrame)调用这个方法(getCreateFrame) MainFrame.java import frames.SelectFrame; import javax.swing.*; import java.awt.event.Action
import frames.SelectFrame;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MainFrame extends JFrame{
private JPanel mainPanel;
private JComboBox cbOption;
private JButton btConfirm;
private JLabel lbCredit;
private JFrame createFrame;
public static void main(String[] args) {
JFrame mainFrame = new JFrame("");
mainFrame.setContentPane(new MainFrame().mainPanel);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.pack();
mainFrame.setVisible(true);
mainFrame.setBounds(500, 500, 400, 400);
}
public MainFrame() {
btConfirm.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int option = cbOption.getSelectedIndex();
System.out.println(option);
if(option == 0){
JFrame createFrame = new SelectFrame();
createFrame.setContentPane(new SelectFrame().mainPanel);
createFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
createFrame.pack();
createFrame.setVisible(true);
createFrame.setBounds(500, 500, 400, 400);
System.out.println("Frame created!");
} else if(option == 1){
} else{
}
}
});
}
public final JFrame getCreateFrame(){
return createFrame;
}
}
package frames;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Date;
public class SelectFrame extends JFrame{
public JPanel mainPanel;
private JLabel lbCredit;
private JComboBox cbxCurrency;
private JButton btConfirm;
private JButton btExit;
public SelectFrame() {
btConfirm.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
}
});
btExit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
}
});
}
}
CreateFrame.java
import frames.SelectFrame;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MainFrame extends JFrame{
private JPanel mainPanel;
private JComboBox cbOption;
private JButton btConfirm;
private JLabel lbCredit;
private JFrame createFrame;
public static void main(String[] args) {
JFrame mainFrame = new JFrame("");
mainFrame.setContentPane(new MainFrame().mainPanel);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.pack();
mainFrame.setVisible(true);
mainFrame.setBounds(500, 500, 400, 400);
}
public MainFrame() {
btConfirm.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int option = cbOption.getSelectedIndex();
System.out.println(option);
if(option == 0){
JFrame createFrame = new SelectFrame();
createFrame.setContentPane(new SelectFrame().mainPanel);
createFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
createFrame.pack();
createFrame.setVisible(true);
createFrame.setBounds(500, 500, 400, 400);
System.out.println("Frame created!");
} else if(option == 1){
} else{
}
}
});
}
public final JFrame getCreateFrame(){
return createFrame;
}
}
package frames;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Date;
public class SelectFrame extends JFrame{
public JPanel mainPanel;
private JLabel lbCredit;
private JComboBox cbxCurrency;
private JButton btConfirm;
private JButton btExit;
public SelectFrame() {
btConfirm.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
}
});
btExit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
}
});
}
}
返回的createFrame为空。这是因为您引入了JFrame createFrame=new SelectFrame()的本地实例;在MainFram构造函数中
public final JFrame getCreateFrame(){
return createFrame;
}
在构造函数中,您创建的是局部变量,而不是指定给您创建的实例变量
JFrame createFrame = new SelectFrame();
应该是:
createFrame = new SelectFrame();
不要创建新变量,将现有变量赋值。要回答您的问题,我认为您应该看一下 如果您想访问
SelectFrame
-类中的getCreateFrame()
方法,您需要能够以某种方式访问大型机
-类,因为它包含该方法
createFrame
是MainFrame
-类的私有变量,这意味着它只能在类中访问。这就是为什么(正如您所做的)您需要一个get方法来检索它。尽管如此,当调用get方法时,您希望知道您正试图访问哪个对象的createFrame
。问题是,SelectFrame
如何知道调用哪个方法
如果编辑选择frame
-类,则如下所示:
public class SelectFrame extends JFrame {
private MainFrame mFrame;
public SelectFrame(MainFrame frame) {
mFrame = frame;
}
}
现在,您可以从传递给SelectFrame
类中的SelectFrame
构造函数的MainFrame
调用getCreateFrame()
。(mFrame.getCreateFrame();
)
注意:在大型机
-类的构造函数中,在if
-语句中初始化createFrame
,这意味着除非选项==0,否则它将为您提供null
if(option == 0) {
JFrame createFrame = new SelectFrame();
}
您在哪里调用getCreateFrame(),当您尝试调用它时会收到什么样的错误消息?我想在btExit按钮的操作侦听器中的createClass中调用它。如果您是java新手,并且有类似的问题,可能“太容易了”对于stackoverflow,如果需要进一步的帮助,您可以查看我的discord;方法。如果要多次按下btConfirm
按钮,请检查createFrame
是否为null
,如果不是,请在为其指定新值之前调用createFrame.dispose()
。否则,您将创建更多窗口,而不会实际破坏以前的任何窗口。