내가보기에, 당신의 오류는 당신이 이미지를 읽는 방식 때문입니다.
이 경우 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
).
:
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
의 다음은 위의 코드를 실행할 때 내가 가진 무엇의 출력 이미지입니다
추가 팁
- 당신은 GUI의 창조를위한
static
방법을 만들고있어 , 난 당신이 대신 클래스의 인스턴스를 생성하고 (/를 static
수정 오 승) 방법을 그런 식으로 전화를하는 것이 좋습니다 . 표시된 코드에서
, 난 당신이 Event Dispatch Thread (EDT)에 프로그램을 배치하지 않는 것을 추론이 SwingUtilities#invokeLater()
메소드를 호출, 당신은 그것을 나는 main
방법에 그런 식으로 문제를 해결할 수 있습니다, 당신에게 문제를 스레딩으로 인한 문제가 발생할 수 있습니다 .
귀하의 변수 명명 당신은 JFrame
에 space
전화 내가 당신이라면 나는 그것을 frame
또는 spaceFrame
를 부를 것이다, 혼동이다. field
field
을 배열이 아닌 JTextField
으로 전화 할 경우 JButton
배열을 buttons
(복수형을 나타낼 때 복수형) 또는 fieldButtons
이라고합니다.
귀하의 for
루프는 반전 (제 생각에), 나는 x
에서 시작할 것 다음 y
계속 (또는 모든 사람처럼 할 사용할 간단한 루프 카운터 변수 i
, j
, k
, 또는 그들이 가지고 있는지 확인하는 당신은 필요하지 않습니다 count1
및 count2
변수를 사용하고 좀 더 설명하는 이름)
, 당신이 할 수 constraints.gridx = i;
및 constraints.gridy = j;
(당신이 당신의 for
루프에서 귀하의 카운터 변수로 i
및 j
을 사용하려고 할 경우 RECOM 위의 수선) 또는 constraints.gridx = y;
및 constraints.gridy = x;
(당신이 (내 팁 # 4) 또는 constraints.gridx = x;
및 constraints.gridy = y;
을 무시하는 당신이 더 도움이 필요한 경우 내 팁 # 4)
을하기로 결정한 경우 빨리 유효한 [mcve]을 게시하시기 바랍니다하기로 결정한 경우 – Frakcool
이 방법이 효과적입니다. "cell.png"이 실제로이 프로그램을 실행하는 디렉토리가 있는지 확인 할 수 있습니까? 디버깅을 위해 지금은 전체 경로를주고 시도하십시오. – VHS
'cell.getIconHeight()'의 결과를 확인하십시오 -1이면 이미지를 찾지 못했습니다 /로드했습니다 –