2015-12-08 55 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