私の見ているところから、あなたのイメージはあなたがイメージを読んでいる方法に起因しています。
この場合、私はこのquestionの画像を使用しました。
アプリをJARファイルとしてパッケージ化する場合は、イメージとしてリソースとしてアクセスする必要があります。そのため、今すぐアクセスする方がよいでしょう。現時点では、コードはリソースではなくファイルシステムから直接イメージをロードしています。あなたはImageIO.read()
メソッドを呼び出すことによって、それを変更することができます(リンク1は、私が原因上記のリンク先の質問の画像へのリンクに使用している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)と呼ばれ、次回は同じように投稿する必要があるので、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)でプログラムを置いていないことを推測する、これはSwingUtilities#invokeLater()
メソッドを呼び出して、あなたはそれを私がmain
方法で行った方法を修正することができ、あなたの問題をスレッドに起因する問題が発生する可能性があります。
あなたの変数の命名には、あなたは私があなただったら、私はそれframe
またはspaceFrame
呼ぶだろう、JFrame
にspace
を呼び出し、混乱です。 field
field
をの配列ではなくJTextField
と呼びますが、JButton
の配列はbuttons
(複数の場合は複数の場合)またはfieldButtons
と呼びます。
あなたfor
ループが(私の意見では)反転している、私はx
からスタートし、その後y
に進み(または実行、誰もが同じようにしてi
を使用し、j
、単純なループのカウンタ変数のためk
、またはそれらを持っているになるだろうより説明的な名前)
あなたは(あなたが希望する場合RECOMとしてあなたfor
ループであなたのカウンタ変数としてi
とj
を使用して、あなたのconstraints.gridx = i;
とconstraints.gridy = j;
を持つことができ、必要でないcount1
とcount2
変数を、使用しています(あなたが早いほど良いのヘルプについて4)
私の先端#を取ることにした場合、有効な[MCVE]を投稿してください上記の修繕)または
constraints.gridx = y;
とconstraints.gridy = x;
(あなたは私の先端#4)またはconstraints.gridx = x;
とconstraints.gridy = y;
を無視することにした場合 – Frakcoolこれはうまくいくはずです。 "cell.png"が実際にこのプログラムを実行しているディレクトリから存在するかどうか確認できますか?デバッグのために、今は完全なパスを与えてから試してみてください。 – VHS
'cell.getIconHeight()'の結果をチェックします。-1の場合、画像が見つからない/ロードされました。 –