2013-08-03 1 views
0

기본 목표는 3x3 패턴의 9 개의 흰색 정사각형으로 채워진 JPanel을 갖는 것입니다. 사각형은 150x150 빈 흰색 .jpg 파일입니다. 나중에 프로그램이 빈 사각형을 단순한 이미지 선택 중 하나로 변경해야하므로 언제든지 사각형을 변경할 수 있어야합니다. 문제는 단순히 NullPointerException이 발생한다는 것입니다. null로 배열을 초기화하는 것과 관련 있다고 가정해야하지만 NetBeans (예, NetBeans ...)는 그렇게하지 않으면 나에게 화를 낸 것처럼 보입니다. 배열의 크기를 선언하려고 할 때도 마찬가지입니다. .? "ArrayType [arraysize] arrayName;"(즉 ... 것Java - 루프 (NullPointerException)를 통해 ImageIcon을 사용하여 JLabel의 배열 채우기

편집 난 그냥 격렬하게 추측하고있어, "예, EGH

- NullPointerException이 고정,하지만 지금은 빈 (흰색) 이미지 . 단순히 새로운 상태를 반영하기 위해 편집 아래 코드 프레임에 표시되지 않습니다, 더 잠재적으로 관련 라인이 추가 여기

모든 관련 코드 수 :. 또한

JFrame controller = new JFrame("SmartHome Interface"); 
controller.setVisible(true); 
controller.setSize(480,500); 
controller.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

//[...] 

JPanel labelPanel = new JPanel(); 

//[...] 

labelPanel.setBackground(Color.GREEN); 

//[...] 

ImageIcon blank = new ImageIcon("../Images/blank.jpg"); 

//[...] 

controller.add(labelPanel); 

//[...] 

JLabel[] labels = new JLabel[9]; 
     for (int i = 0; i <= 8; i++) 
     { 
      int xLowBound; 
      int xUpBound; 
      int yLowBound; 
      int yUpBound; 

      //Maths for positioning the labels correctly. Should be 150px in size with 10px gaps each. 
      xLowBound = (i % 3) * 160; 
      xUpBound = xLowBound + 150; 
      yLowBound = (i/3) * 160; 
      yUpBound = yLowBound + 150; 

      labels[i] = new JLabel(); 
      labels[i].setIcon(blank); 
      labels[i].setBounds(xLowBound, yLowBound, xUpBound, yUpBound); 
      labelPanel.add(labels[i]); 
     } 

..... 파일 경로입니다 ImageIcon이 맞는지? "src/smarthome"에있는 코드 자체 및 "src/Images"에있는 이미지

포럼 규칙/행동 강령/등을 위반하면 사과드립니다. 여기 Newby는 조심하지 않으려 고 노력했지만 뭔가를 잊어 버렸을 수도 있습니다.

답변

2

귀하의 문제는 여기에 감소 :

JLabel[] labels = null; 
for (int i = 0; i <= 8; i++) { 
    labels[i].setIcon(blank); 
} 

이 코드는 실패합니다 레이블 == null이 때문이다. 그러므로 labels [i] == null.

사용이 대신 : imageIcons에 대한

JLabel[] labels = new JLabel[9]; 
for (int i = 0; i <= 8; i++) { 
    labels[i] = new JLabel(); 
    labels[i].setIcon(blank); 
} 
+0

감사합니다, 나는 정확히 이루어지지했고 나는 더 이상 오전 오류를 받고, 그러나 빈 (흰색) 이미지가 단순히 표시되지 않습니다 프레임에. – Malix

2

귀하의 파일 경로가 올바르지 않습니다. 당신은 사용해야 로딩 이미지 아이콘에 대한 좋은 answer 있습니다

ImageIcon img = new ImageIcon(YourClass.class.getResource("../Images/blank.jpg")); 

(좋은 암소 덕분에) : 코드는 정적 메소드의 사용이있다

ImageIcon img = new ImageIcon(getClass().getResource("../Images/blank.jpg"));  

합니다.


당신은 프레임에 모든 구성 요소를 추가 한 후 setVisible()setSize()를 호출해야합니다.


구성 요소를 프레임의 내용 창()에 추가하십시오.


항상 GUI 코드를 별도의 스레드에 배치해야합니다.


그래서, 당신의 코드는 다음과 같습니다 당신이 말한대로

SwingUtilities.invokeLater(new Runnable() 
{ 

    @Override 
    public void run() 
    { 
     JFrame controller = new JFrame("SmartHome Interface"); 
     controller.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel labelPanel = new JPanel(); 

     labelPanel.setBackground(Color.GREEN); 

     // !!! 
     ImageIcon blank = new ImageIcon(YourClass.class 
       .getResource("../Images/blank.jpg")); 

     // !!! 
     controller.getContentPane().add(labelPanel); 

     JLabel[] labels = new JLabel[9]; 
     for (int i = 0; i <= 8; i++) 
     { 
      int xLowBound; 
      int xUpBound; 
      int yLowBound; 
      int yUpBound; 

      xLowBound = (i % 3) * 160; 
      xUpBound = xLowBound + 150; 
      yLowBound = (i/3) * 160; 
      yUpBound = yLowBound + 150; 

      labels[i] = new JLabel(); 
      labels[i].setIcon(blank); 
      labels[i].setBounds(xLowBound, yLowBound, xUpBound, 
        yUpBound); 
      labelPanel.add(labels[i]); 
     } 

     // !!!  
     controller.setVisible(true); 
     controller.setSize(480, 500); 

    } 
}); 
+0

여러 스레드를 동일한 스레드에 게시하지 말고 다른 스레드를 포함하도록이 스레드를 편집하십시오. 이렇게하면 얻은 점수를 잃어 버리게됩니다. GUI가 EDT에서 시작되었지만 여전히 'pack()/setVisible()'과 같은 호출은 모든 컴포넌트를 컨테이너에 추가 한 후에 가져와야합니다. 그것을하기 전에 악의적 인 결과를 줄 수 있습니다 :-) –

+0

당신은 맞습니다 =) – Barataliba

+0

여기 내 +1 온다, 경로 thingy에 관해서는이 [답변] (참조하십시오 http://stackoverflow.com/a/9866659/1057230) :-) –