Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从另一个JFrame调用方法_Java - Fatal编程技术网

Java 从另一个JFrame调用方法

Java 从另一个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

我想从另一个JFrame(大型机)获取一个JFrame(createFrame)。我在大型机中创建了一个返回createFrame的方法,以便在单击createFrame中的按钮时可以处理createFrame。但是我不能从第二个JFrame(createFrame)调用这个方法(getCreateFrame)

MainFrame.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.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()
。否则,您将创建更多窗口,而不会实际破坏以前的任何窗口。