从我看到的,你的错误是由于你阅读图像的方式。
在这种情况下,我用这个question图像。
将应用程序打包为JAR文件时,无论如何您都需要以图片资源的形式访问图片,所以最好现在开始访问它们。在这一刻,你的代码直接从文件系统中加载图像,而不是作为资源。你可以通过调用ImageIO.read()
方法来改变它(链接的一个是我使用的是由于链接到上面链接的问题的图像其中URL,但您可以通过File
,InputStream
或ImageInputStream
过阅读。
对于例如:
img = ImageIO.read(getClass().getResource("L5DGx.png"));
当你使用相同的图像的每个按钮(也可能为每个按钮的大小相同),我推荐你使用GridLayout
,而不是GridBagLayout
可以复制。 - 无需修改即可刷新此代码,t他被称为Minimal, Complete and Verifiable Example (MCVE)或Short, Self Contained, Correct Example (SSCCE),并且下一次您应该发布一个相似的,所以我们不必编写进口或推断field
是JButton
而不是另一个JComponent
(例如JTextField
可能更适合该名称的field
)
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);
}
}
下面是运行上面的代码时,我得到了什么的输出图像:
其他提示
你让为创建GUI的static
方法,我建议你,而不是创建类的实例,并调用方法方式(W/O的static
修改) 。
从显示的代码,我推断你不把你的程序在Event Dispatch Thread (EDT),这可能导致你由于线程问题的问题,您可以修复它,我在main
方法做的方式,呼吁SwingUtilities#invokeLater()
方法。
你的变量命名为迷惑,你叫space
为JFrame
,如果我是你,我会叫它frame
或spaceFrame
。我会打电话field
到JTextField
而不是JButton
阵列,我会称JButton
阵列为buttons
(复数,因为它指的是其中许多)或fieldButtons
。
你for
环路(在我看来)倒,我就从x
开始,然后继续y
(或做大家都做,并使用i
,j
,k
在简单的循环计数器变量,或使它们有更具描述性的名称)
您使用count1
和count2
变量,这是没有必要的,你可以有你constraints.gridx = i;
和constraints.gridy = j;
(如果你喜欢使用i
和j
作为计数器变量您for
循环为RECOM上述谁料)或constraints.gridx = y;
和constraints.gridy = x;
(如果你决定要无视我的提示#4)或constraints.gridx = x;
和constraints.gridy = y;
(如果你决定要我的小费4#)
为了更好地帮助越早请张贴有效的[MCVE] – Frakcool
这应该起作用。你可以确定“cell.png”是否真的存在你执行这个程序的目录吗?为了调试,只需给出完整的路径,然后尝试。 – VHS
检查'cell.getIconHeight()'的结果,如果它是-1图像未找到/加载 –