2015-12-08 57 views
0

我有两个Java类; mcveF1mcveF2。下面的代码在运行时打开一个JFrame,其上单数JButton禁用。此按钮打开第二个JFrame并禁用第一个。同样,这个框架上有一个单独的JButton。该按钮应关闭第二帧并重新启用第一帧。但是抛出异常,java.lang.NullPointerException。我相信这是因为我正在创建一个mcveF1的新实例,而不是使用当前的实例。我不知道如何解决这个问题,并希望在解决它的任何帮助。使用JFrame的原始实例

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的请求。

null pointer exception

+0

你在'mvceF2.java'文件中有什么在线#** 54 **? –

+0

@ PM77-1'f1.myMainWindow.setEnabled(true);' – Dan

+0

'f1'在'mcveF2'类中为'null'。你从来没有初始化它。 –

回答

1

在你的类创建一个构造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(); 
     } 
    } 
+0

这正是我所需要的。谢谢 – Dan

+1

@丹,当我还是学生时,我有确切的问题:) – AdamSkywalker