2016-10-16 6 views
-1

イメージをJbuttonに追加しようとしています。画像は別のクラスを使用して作成した配列です。画像を追加しようとするたびに失敗しました。私はそれらをImageIconに変換しようとしましたが、それをそのまま追加しても機能しません。最初のコードセットは、ボタンを作成してJFrameに追加したコードです。私の目標は、ボタンが押されたときにボタンが画像を表示するように、四角形をイベントリスナーを追加することで、またはテキストイメージが配列内にあるときにJButtonにイメージを追加する方法

import java.awt.Dimension; 
import java.awt.Image; 
import javax.swing.Icon; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class ButtonTest extends JFrame{ 


    public ButtonTest(){ 

      JPanel panel = new JPanel(); 
      JButton[] b = new JButton[9]; 
      Image[] imgs = MyImageSplit.splitter("dog", 9); 


      for (int i=0; i<b.length; i++){ 
      b[i]=new JButton(); 
      b[i].setPreferredSize(new Dimension(100, 100)); 

      panel.add(b[i]); 
      } 

     add(panel); 
     setVisible(true); 
     setSize(400,400); 
     } 

     public static void main(String[] args) { 
      new ButtonTest(); 

     } 
} 

このコードを持つ長方形は、私は、画像を分割し、小さなを追加するために使用するものですアレイへの画像。

import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.FileInputStream; 
import javax.imageio.ImageIO; 

public class MyImageSplit { 

    public static Image[] splitter (String filename, int numGroup){ 
     int rows=(int) Math.sqrt(numGroup); 
     int cols=(int) Math.sqrt(numGroup); 

     BufferedImage[] buffimage = new BufferedImage[rows*cols]; 
     Image[] images = new Image[rows*cols]; 

     try{ 
      File file = new File(filename + ".jpg"); //gets image from directory 
      FileInputStream f = new FileInputStream(file); 
      BufferedImage img = ImageIO.read(f); //reads the image file 



      //determines the width and height for each piece 
      int pieceWidth=img.getWidth()/cols; 
      int pieceHeight = img.getHeight()/rows; 


      for (int x = 0; x < rows; x++) { 
       for (int y = 0; y < cols; y++) { 
        //Initialize the image array with image pieces 
        buffimage[x * rows + y] = new BufferedImage(pieceWidth, pieceHeight, img.getType()); 

        // draws the image piece 
        Graphics2D gr = buffimage[x * rows + y].createGraphics(); 
        gr.drawImage(img, 0, 0, pieceWidth, pieceHeight, pieceWidth * y, pieceHeight * x, pieceWidth * y + pieceWidth, pieceHeight * x + pieceHeight, null); 
        gr.dispose(); 
       } 
      } 

      for (int i =0; i < buffimage.length; i++){ 
       ImageIO.write(buffimage[i], "jpg", new File(filename + i + ".jpg")); 

      } 
     } 

     catch (Exception e) { 
      System.out.println(e.getStackTrace()); 
     } 

     for(int i = 0; i < rows*cols; i++){ 
      images[i] = (Image) buffimage[i]; 

     } 

     return images; 
    } 

    public static void main(String[] args){ 
     splitter("monkey", 9); 
    } 

} 

dog.jpg

+0

は、画像が正しくロードされているかどうかをチェックしましたか? JFrameでImageIconとJLabelを使用する簡単なコードを試してみてください。 – Arvind

答えて

0

それはあなたがボタンを作成するように思えるが、その画像を設定することはありません。

ButtonTestであなたのメインループに次の行を追加します。

b[i].setIcon(new ImageIcon(imgs[i]));

+0

私はこれを前に試して、それは実行されません。これはコンソールにあるものです: –

+0

[Ljava.lang.StackTraceElement; @ 27973e9b スレッド "main"の例外java.lang.NullPointerException \t at javax.swing.ImageIcon。 (不明な情報源) \t(ButtonTest) (ButtonTest。java:22) \t ButtonTest.main(ButtonTest.java:35) –

+0

おそらく画像への不正なパスを使用しています。相対パスを使用しているため、イメージは現在の作業ディレクトリに置かなければなりません。 –

2

あなたは、ボタンのそれぞれに画像を追加するのを忘れています。あなたのfor-loopにこれを追加:画像がそれらに合わせdoesntのため、

for (int i=0; i<b.length; i++){ 
    b[i]=new JButton(); 
    b[i].setPreferredSize(new Dimension(200, 100)); 
    b[i].setIcon(new ImageIcon(imgs[i])); 
    panel.add(b[i]); 
} 

はまた私がJButtonれる好ましいサイズを変更することをお勧めいたします。

b[i].setPreferredSize(new Dimension(200, 100)); 

また、JFrameのサイズも同様です。

setSize(800,400); 

編集:正しく色を保つために.png画像ファイルの拡張子を使用してください。 .jpgは、いくつかの色が単純に言った損失を引き起こします。比較:

dog.jpg

enter image description here

をdog.png

enter image description here

+0

イメージはMyImageSplitクラスを使用して既にインポートされています。そのクラスはイメージの配列を返します。配列からイメージを引き出す必要があるので、なぜファイルを再度入力する必要がありますか? –

+0

はい、申し訳ありませんが、私はその変数を忘れています。私は私の答えを編集しました。 'for-loop'部分をもう一度チェックしてください。また、画像のパスが正しいかどうかを確認してください。 –

+0

ありがとうございます。これは正しかった。私は別のプロジェクトフォルダにジャンプし続け、私は現在作業しているフォルダに画像がありませんでした。 –

関連する問題