使用 JFrame 的原始实例

Using the original instance of a JFrame

我有两个Java类; mcveF1mcveF2。当 运行 打开带有单数 JButtonJFrame 时,下面的代码将禁用。此按钮打开第二个 JFrame 并禁用第一个。类似地,这个框架上有一个单数 JButton。此按钮应关闭第二帧并重新启用第一帧。但是抛出异常,java.lang.NullPointerException。我相信这是因为我正在创建 mcveF1 的新实例而不是使用当前实例。我不知道如何解决这个问题,如果能帮我解决这个问题,我将不胜感激。

mcveF1

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import net.miginfocom.swing.MigLayout;

public class mcveF1
{
    public JFrame myMainWindow = new JFrame("Frame 1");

    JPanel panel2 = new JPanel();

    //Variables and Components
    JButton openFrame = new JButton("Open new frame");

    public void runGUI()
    {
        myMainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        myMainWindow.setLayout(new GridLayout(1,1));

        createSortTestPanel();

        myMainWindow.getContentPane().add(panel2);

        myMainWindow.setVisible(true);
        myMainWindow.pack();
        myMainWindow.setMinimumSize(new Dimension(myMainWindow.getBounds().getSize()));
        myMainWindow.setLocationRelativeTo(null);
    }

    public void createSortTestPanel()
    {
        MigLayout layout = new MigLayout("", "[grow]");
        panel2.setLayout(layout);

        openFrame.addActionListener(new buttonAction());
        panel2.add(openFrame);
    }

    public static void main(String[] args)
    {
        mcveF1 f1 = new mcveF1();
        f1.runGUI();
    }

    class buttonAction implements ActionListener
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            myMainWindow.setEnabled(false);
            mcveF2 f2 = new mcveF2();
            f2.runGUI();
        }
    }
}

mcveF2

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import net.miginfocom.swing.MigLayout;

public class mcveF2
{
    JFrame myMainWindow = new JFrame("Frame 2");

    JPanel panel2 = new JPanel();

    //Variables and Components
    JButton closeFrame = new JButton("Close");
    mcveF1 f1;

    public void runGUI()
    {
        myMainWindow.setLayout(new GridLayout(1,1));

        createSortTestPanel();

        myMainWindow.getContentPane().add(panel2);

        myMainWindow.setVisible(true);
        myMainWindow.pack();
        myMainWindow.setMinimumSize(new Dimension(myMainWindow.getBounds().getSize()));
        myMainWindow.setLocationRelativeTo(null);
    }

    public void createSortTestPanel()
    {
        MigLayout layout = new MigLayout("", "[grow]");
        panel2.setLayout(layout);

        closeFrame.addActionListener(new buttonAction());
        panel2.add(closeFrame);
    }

    public static void main(String[] args)
    {
        mcveF2 f2 = new mcveF2();
        f2.runGUI();
    }

    class buttonAction implements ActionListener
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            myMainWindow.dispose();
            f1.myMainWindow.setEnabled(true);
        }
    }
}

根据PM77-1的要求,此图中显示了空指针异常。

在 class mcveF2

中创建构造函数
public class mcveF2() {
   public mcveF2(mcveF1 f1) {
      this.f1 = f1;
   }

然后将 mcveF1 的实例传递给按钮动作侦听器中的此构造函数。

class buttonAction implements ActionListener
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            myMainWindow.setEnabled(false);
            mcveF2 f2 = new mcveF2(mcveF1.this);
            f2.runGUI();
        }
    }