2016-02-17 45 views
0

所以我遇到的問題與我的JFrame有關。首先,我要在這裏發佈我的代碼,然後解釋這個問題。給出空指針的Java JFrame代碼異常

package evenMoreTesting; 

import java.awt.event.ActionEvent; 

import javax.swing.AbstractAction; 
import javax.swing.Action; 
import javax.swing.InputMap; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.KeyStroke; 

public class MyKeyBindings { 

static int x1=0,x2=0,x3=0; 
static JFrame frame; 



public static void main(String[] args) { 


    //JFrame frame = new JFrame(); 


    //some kind of problem when im calling JFrame out of the main class 
    frame.setTitle("we still testing"); 
    frame.setSize(750, 500); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 

    Action a1 = new AbstractAction() { 
     public void actionPerformed(ActionEvent AE){ 

      x1 +=1; 


      Action a2 = new AbstractAction() { 
       public void actionPerformed(ActionEvent AE){ 

        x2 +=1; 


        Action a3 = new AbstractAction() { 
         public void actionPerformed(ActionEvent AE){ 

          x3 +=1; 

          if(x3==1){ 
           System.out.println("you wot"); 
          } 
          if(x3==2){ 
           System.out.println("m8"); 
          } 


         } 
        }; 

        if(x2==1){ 
         System.out.println("dude"); 
        } 
        if(x2==2){ 
         System.out.println("stop"); 
        } 
        if(x1==3 && x2==4){ 
         System.out.println("woah you broke the goddamn system"); 
        } 

        //this game will be sensitive to how many clicks have happened 

        //and it doesnt work unless i call the above code in this action 
        //the a3 action will be in here just like a2 is in a1 

        JPanel content = (JPanel) frame.getContentPane(); 

        KeyStroke three = KeyStroke.getKeyStroke("3"); 

        InputMap IM = content.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 


        IM.put(three, "x3++"); 
        content.getActionMap().put("x3++", a3); 



       } 
      }; 






      JPanel content = (JPanel) frame.getContentPane(); 

      KeyStroke two = KeyStroke.getKeyStroke("2"); 

      InputMap IM = content.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 

      IM.put(two, "x2++"); 
      content.getActionMap().put("x2++",a2); 


      if(x1==1){ 
       System.out.println("ok"); 
      } 
      if(x1==2){ 
       System.out.println("cool"); 
      } 



     } 
    }; 



    JPanel content = (JPanel) frame.getContentPane(); 

    KeyStroke one = KeyStroke.getKeyStroke("1"); 


    InputMap IM = content.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 
    IM.put(one, "x1++"); 
    content.getActionMap().put("x1++", a1); 



} 
} 

所以問題是,當我打電話的主要方法外JFrame中我得到這個錯誤:在evenMoreTesting.MyKeyBindings.main(MyKeyBindings螺紋

異常「主」顯示java.lang.NullPointerException 的.java:27)

第27行是這樣的:

frame.setTitle("we still testing"); 

而實際上前幾天這個問題是不是在這裏,我不知道怎麼異常現在就開始了。

我決定評論一下,看看這是否是唯一的問題。我做了,但仍然有錯誤,但是這次是在第28行,所以我將第28行註釋掉,然後錯誤發生在第29行,而其餘的代碼都是在框架中發生的。

現在你可以說,只需將JFrame放在主要方法中,但是有一個原因需要超出主要方法。

在我的行動裏面我將調用JFrame把圖像放在屏幕上。當JFrame處於主要方法中時,它僅限於該方法,從我所知道的方面來看。

所以我決定在主外面調用JFrame,這樣它也可以訪問這些動作。這就是我將如何將圖像調用到屏幕上,對於任何感興趣的人或者它是否有助於解決這個問題。

frame.add(new JLabel(new ImageIcon("frames/img01.jpg"))); 

框架是源文件夾和IMG01是我第一次圖像屏幕

上如果有接近繪製圖像在屏幕上的另一種方式,請告知。

總之我的問題是,爲什麼我在調用主方法之外的JFrame時收到空指針異常,以及如何防止它。

預先感謝您!

+0

你'靜態的JFrame幀;'是由默認'null',你在'main'方法中做的第一個動作是'frame.setTitle',這意味着你是invok 'null'上的'setTitle'(並且null沒有這樣的方法,或者任何方法都更精確)。首先初始化'frame'。你可以聲明它爲'static JFrame frame = new JFrame();'或者在你的main方法中調用frame = new JFrame();'。 – Pshemo

+0

感謝解釋它是如何工作的! –

回答

0

編輯: - 這裏,只需調用此方法showImage("c:/image.png");和路徑傳遞到您的形象,它會創建一個JFrame,並從路徑載入圖片ADN它顯示給你: -

// the imports required 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.*; 
import java.awt.*; 

//paste this method in your class and call it when you want to display image 

public void showImage(String path_to_image) 
{ 
JFrame frame = new JFrame("Image"); 
frame.setLayout(new BorderLayout()); 
frame.setResizable(false); 
ImageIcon myImage = new ImageIcon(path_to_image); 
frame.getContentPane().add(new JLabel(myImage)); 

frame.pack(); 
frame.setVisible(true); 
} 

OR

在你的主加frame = new JFrame();如您尚未創建尚未它的一個新的instace,因此你如果你創建一個收到你所添加的組件框架

+0

謝謝我感謝你甚至回答了第二個問題! –

+0

沒有probs @ cei-ge –

0

的空值的空指針異常非原始類字段(引用)並且不初始化它,那麼默認情況下它將被初始化爲null

所以做的一個低於

  1. 取消註釋以下行

    //JFrame frame = new JFrame();

    ,並刪除下面的行

    static JFrame frame;

OR

  • 更新以下行

    static JFrame frame;

    static JFrame frame = new JFrame();