我在程序中使用此过程来生成JButton
s的数组。 JButtons
会显示在框架中,但ImageIcon
不会显示在按钮中。图片与程序位于同一目录中。问题是什么? (空间是我的框架)
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);
}
答案 0 :(得分:2)
从我看到的,你的错误是由于你正在阅读图像的方式。
在这种情况下,我使用了此question中的图片。
当您将应用程序打包为JAR文件时,无论如何都需要将图像作为资源访问,因此,最好现在就开始以这种方式访问它们。在这一刻,您的代码直接从您的文件系统而不是资源加载图像。您可以通过调用ImageIO.read()
方法对其进行更改(链接的方法是针对我正在使用的网址,因为链接到上面链接的问题的图片,但您可以通过File
,{{ 1}}或InputStream
。
例如:
ImageInputStream
当您为每个按钮使用相同的图像时(每个按钮的大小可能相同),我建议您使用GridLayout
代替GridBagLayout
。
您可以复制粘贴此代码而不进行任何修改,这称为Minimal, Complete and Verifiable Example (MCVE)或Short, Self Contained, Correct Example (SSCCE),下次您应发布一个类似代码,因此我们不必编写导入或推断img = ImageIO.read(getClass().getResource("L5DGx.png"));
是一个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,我建议你创建一个类的实例并以这种方式调用方法(没有{{1} }修饰符)。
从显示的代码中,我推断您没有将您的程序放在Event Dispatch Thread (EDT)上,这可能会因为线程问题而导致问题,您可以像我在{中所做的那样修复它{1}}方法,调用SwingUtilities#invokeLater()
方法。
您的变量命名很混乱,您将static
称为static
,如果我是您,我会将其称为main
或space
。 JFrame
我会将frame
称为spaceFrame
而不是field
数组,我会将field
数组称为JTextField
(复数形式为指的是其中许多)或JButton
。
您的JButton
循环(在我看来)是倒置的,我会从buttons
开始,然后继续fieldButtons
(或按照每个人的方式执行并使用{{1} },for
,x
用于简单循环中的计数器变量,或使它们具有更具描述性的名称)
您使用的是y
和i
变量,这些变量不是必需的,您可以拥有j
和k
(如果您更喜欢使用count1
1}}和count2
作为您constraints.gridx = i;
循环中的计数器变量(如上所述)或constraints.gridy = j;
和i
(如果您决定忽略我的提示#4)或{ {1}}和j
(如果您决定接受我的提示#4)