2017-01-18 5 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]を投稿してください上記の修繕)またはconstraints.gridx = y;constraints.gridy = x;(あなたは私の先端#4)またはconstraints.gridx = x;constraints.gridy = y;を無視することにした場合 – Frakcool

+1

これはうまくいくはずです。 "cell.png"が実際にこのプログラムを実行しているディレクトリから存在するかどうか確認できますか?デバッグのために、今は完全なパスを与えてから試してみてください。 – VHS

+0

'cell.getIconHeight()'の結果をチェックします。-1の場合、画像が見つからない/ロードされました。 –

答えて

2

私の見ているところから、あなたのイメージはあなたがイメージを読んでいる方法に起因しています。

この場合、私はこのquestionの画像を使用しました。

アプリをJARファイルとしてパッケージ化する場合は、イメージとしてリソースとしてアクセスする必要があります。そのため、今すぐアクセスする方がよいでしょう。現時点では、コードはリソースではなくファイルシステムから直接イメージをロードしています。あなたはImageIO.read()メソッドを呼び出すことによって、それを変更することができます(リンク1は、私が原因上記のリンク先の質問の画像へのリンクに使用しているURLのためですが、あなたはあまりにもFileInputStreamまたはImageInputStreamで読み取ることができます。のために

例:

img = ImageIO.read(getClass().getResource("L5DGx.png")); 

あなたはボタンごとに同じ画像を使用して(と各ボタンのおそらく同じ大きさ)しているように、私はGridLayoutの代わりGridBagLayoutを使用することをお勧めいたします

あなたがコピーすることができます。このコードを変更せずにペーストする彼はMinimal, Complete and Verifiable Example (MCVE)またはShort, Self Contained, Correct Example (SSCCE)と呼ばれ、次回は同じように投稿する必要があるので、fieldJButtonの配列ではなく、別のJComponent(たとえば、JTextFieldfieldの)

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); 
    } 
} 

は、ここで上記のコードを実行しているときに私が得たものの出力画像です:

enter image description here


その他のヒント

  1. あなたはGUIを作成するためのstatic方法を作っている、私はあなたの代わりにあなたのクラスのインスタンスを作成し、方法(W/O static修飾子)メソッドを呼び出すことが示唆。示されているコードから

  2. 、私はあなたがEvent Dispatch Thread (EDT)でプログラムを置いていないことを推測する、これはSwingUtilities#invokeLater()メソッドを呼び出して、あなたはそれを私がmain方法で行った方法を修正することができ、あなたの問題をスレッドに起因する問題が発生する可能性があります。

  3. あなたの変数の命名には、あなたは私があなただったら、私はそれframeまたはspaceFrame呼ぶだろう、JFramespaceを呼び出し、混乱です。 fieldfieldをの配列ではなくJTextFieldと呼びますが、JButtonの配列はbuttons(複数の場合は複数の場合)またはfieldButtonsと呼びます。

  4. あなたforループが(私の意見では)反転している、私はxからスタートし、その後yに進み(または実行、誰もが同じようにしてiを使用し、j、単純なループのカウンタ変数のためk、またはそれらを持っているになるだろうより説明的な名前)

  5. あなたは(あなたが希望する場合RECOMとしてあなたforループであなたのカウンタ変数としてijを使用して、あなたのconstraints.gridx = i;constraints.gridy = j;を持つことができ、必要でないcount1count2変数を、使用しています(あなたが早いほど良いのヘルプについて4)

+0

downvoterに理由を説明できますか? – Frakcool

関連する問題