2017-01-18 3 views
0

이 절차를 프로그램에서 사용하여 JButton 배열을 만들었습니다. JButtons이 프레임에 표시되지만 ImageIcon은 단추에 넣지 않습니다. 그림은 프로그램과 같은 디렉토리에 있습니다. 문제가 무엇입니까? (공간은 제 프레임입니다)ImageIcon을 JButton으로 설정할 수 없습니까?

static void BasicSetup() { 
    int count1 = 0; 
    int count2 = 0; 
    ImageIcon cell = new ImageIcon("cell.png"); 

    for (int y = 0; y < 16; y++) { 
     count1 = count1 + 1; 
     count2 = 0; 
     for (int x = 0; x < 16; x++) { 
      count2 = count2 + 1; 
      field[y][x] = new JButton(); 
      field[y][x].setIcon(cell); 
      constraints.gridx = count1; 
      constraints.gridy = count2; 
      constraints.weightx = 1; 
      jpanel.add(field[y][x], constraints); 

     } 
    } 
    space.add(jpanel); 
} 
+1

을하기로 결정한 경우 빨리 유효한 [mcve]을 게시하시기 바랍니다하기로 결정한 경우 – Frakcool

+1

이 방법이 효과적입니다. "cell.png"이 실제로이 프로그램을 실행하는 디렉토리가 있는지 확인 할 수 있습니까? 디버깅을 위해 지금은 전체 경로를주고 시도하십시오. – VHS

+0

'cell.getIconHeight()'의 결과를 확인하십시오 -1이면 이미지를 찾지 못했습니다 /로드했습니다 –

답변

2

내가보기에, 당신의 오류는 당신이 이미지를 읽는 방식 때문입니다.

이 경우 question의 이미지를 사용했습니다.

앱을 JAR 파일로 포장하는 경우 이미지로 리소스에 액세스해야하므로 지금 바로 이러한 방식으로 액세스하는 것이 좋습니다. 이 순간 당신의 코드는 리소스 대신 파일 시스템에서 이미지를 직접로드합니다. 당신은 ImageIO.read() 메서드를 호출하여 변경할 수 있습니다 (링크 된 하나의 내가 인해 위의 링크 된 질문의 이미지에 링크에 사용하고 URL입니다,하지만 당신은 너무 File, InputStream 또는 ImageInputStream로 읽을 수 있습니다. 들어

예 :

당신이 각각의 버튼에 대해 동일한 이미지를 사용으로
img = ImageIO.read(getClass().getResource("L5DGx.png")); 

(그리고 아마도 각 버튼에 대해 동일한 크기), 난 당신을 추천이 GridLayout 대신 GridBagLayout를 사용하는

당신은 복사 할 수 있습니다. 이 코드를 수정하지 않고 붙여 넣으십시오. 그 사람의 이름은 Minimal, Complete and Verifiable Example (MCVE) 또는 Short, Self Contained, Correct Example (SSCCE)이고 다음에 비슷한 글을 게시해야하므로 수입액을 쓰거나 JComponent 대신 JButton 인 배열을 가져올 필요가 없습니다 (예 : JTextField).

enter image description here


:

import java.awt.GridBagConstraints; 
import java.awt.GridLayout; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.net.URL; 

import javax.imageio.ImageIO; 
import javax.swing.Icon; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class ImageIconArray { 

    private JButton[][] buttons = new JButton[16][16]; 
    private JPanel pane; 
    private JFrame frame; 
    private GridBagConstraints constraints = new GridBagConstraints(); 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new ImageIconArray().createAndShowGui(); 
      } 
     }); 
    } 

    public void createAndShowGui() { 
     BufferedImage img = null; 
     URL url; 
     try { 
      url = new URL("https://i.stack.imgur.com/L5DGx.png"); 
      img = ImageIO.read(url); 
     } catch (IOException ioe) { 
      ioe.printStackTrace(); 
     } 
     Icon cell = new ImageIcon(img); 
     frame = new JFrame("Example"); 
     pane = new JPanel(); 
     pane.setLayout(new GridLayout(16, 16)); 

     for (int i = 0; i < 16; i++) { 
      for (int j = 0; j < 16; j++) { 
       buttons[i][j] = new JButton(); 
       buttons[i][j].setIcon(cell); 
       constraints.gridx = i; 
       constraints.gridy = j; 
       constraints.weightx = 1; 
       pane.add(buttons[i][j], constraints); 

      } 
     } 
     frame.add(pane); 

     frame.pack(); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 

) field의 다음은 위의 코드를 실행할 때 내가 가진 무엇의 출력 이미지입니다

추가 팁

  1. 당신은 GUI의 창조를위한 static 방법을 만들고있어

    , 난 당신이 대신 클래스의 인스턴스를 생성하고 (/를 static 수정 오 승) 방법을 그런 식으로 전화를하는 것이 좋습니다 . 표시된 코드에서

  2. , 난 당신이 Event Dispatch Thread (EDT)에 프로그램을 배치하지 않는 것을 추론이 SwingUtilities#invokeLater() 메소드를 호출, 당신은 그것을 나는 main 방법에 그런 식으로 문제를 해결할 수 있습니다, 당신에게 문제를 스레딩으로 인한 문제가 발생할 수 있습니다 .

  3. 귀하의 변수 명명 당신은 JFramespace 전화 내가 당신이라면 나는 그것을 frame 또는 spaceFrame를 부를 것이다, 혼동이다. fieldfield을 배열이 아닌 JTextField으로 전화 할 경우 JButton 배열을 buttons (복수형을 나타낼 때 복수형) 또는 fieldButtons이라고합니다.

  4. 귀하의 for 루프는 반전 (제 생각에), 나는 x에서 시작할 것 다음 y 계속 (또는 모든 사람처럼 할 사용할 간단한 루프 카운터 변수 i, j, k, 또는 그들이 가지고 있는지 확인하는 당신은 필요하지 않습니다 count1count2 변수를 사용하고 좀 더 설명하는 이름)

  5. , 당신이 할 수 constraints.gridx = i;constraints.gridy = j; (당신이 당신의 for 루프에서 귀하의 카운터 변수로 ij을 사용하려고 할 경우 RECOM 위의 수선) 또는 constraints.gridx = y;constraints.gridy = x; (당신이 (내 팁 # 4) 또는 constraints.gridx = x;constraints.gridy = y;을 무시하는 당신이 더 도움이 필요한 경우 내 팁 # 4)

+0

downvoter에게 이유를 설명해 주시겠습니까? – Frakcool

관련 문제