2016-11-11 2 views
1

の行列n * nをJPanelに持っています。現在、私はそれぞれのJButtonImageIconを設定しています。これは、単純なイメージアイコンではありません、それは私がこの機能と重複する2つの画像です:ImageIconをJavaで保存するには

public ImageIcon DoubleImage(BufferedImage eau, BufferedImage img){ 
     // Create a new image. 
     finalIcon = new BufferedImage(
      eau.getWidth(), eau.getHeight(), 
      BufferedImage.TYPE_INT_ARGB); // start transparent 

     // Get the graphics object. This is like the canvas you draw on. 
     Graphics g = finalIcon.getGraphics(); 

     // Now we draw the images. 
     g.drawImage((Image) eau, 0, 0, null); // start at (0, 0) 

     img = resize((BufferedImage) img, eau.getWidth(), eau.getHeight()); 
     g.drawImage((Image) img, eau.getWidth()/2-img.getHeight()/2, eau.getHeight()/2-img.getWidth()/2, null); // start at (10, 10) 


     // Once we're done drawing on the Graphics object, we should 
     // call dispose() on it to free up memory. 
     g.dispose(); 

     // Finally, convert to ImageIcon and apply. 
     ImageIcon icon = new ImageIcon(finalIcon); 

     return icon; 
    } 

私の問題は、今の時間の各繰り返しで、私は私のJButtonsで私のアイコンを変更しなければならないということです。 10種類以上の最終画像がないうちにアイコンを再描画する必要があることを意味します。しかし、それはあまりにも多くの時間がかかります(アプリケーションが10 * 10の小さなマトリックスで遅れます; 1秒ごとに反復が発生するので、これを修正する必要があります)。私は最初にすべてのイメージを作成し、どこかに保存するという考えがありましたが、これを実行する方法はわかりません。おそらく列挙型ですか?私のクラスのコンストラクタにちょうど入っていますか?

私の主なクラスがJButtonに拡張されていることを正確に説明する必要があります。最後の行列にn * nをインスタンス化します。

EDIT:関数のコードresize

public static BufferedImage resize(BufferedImage img, int newW, int newH) { 
     Image tmp = img.getScaledInstance(newW, newH, Image.SCALE_SMOOTH); 
     BufferedImage dimg = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_ARGB); 

     Graphics2D g2d = dimg.createGraphics(); 
     g2d.drawImage(tmp, 0, 0, null); 
     g2d.dispose(); 

     return dimg; 
    } 

EDIT2:各反復

public void iteration(){ 
     final Vue vue = marreGraphique.lireVue(); 
     final Presenter presenter = vue.lirePresenter(); 


     try{ //here I'm just instantiating my BufferedImage 
      eau = ImageIO.read(new File("Icones/mosaique.jpg")); 
      if(grenouille){ 
       img = ImageIO.read(new File(presenter.getGrenouilleImg())); 
      } 
      else{ 
       img = ImageIO.read(new File(presenter.getImg(ligne, colonne))); 
      } 
     } 
     catch (IOException e){} 

     icon = DoubleImage(eau,img); 

     setIcon(icon); 

     setHorizontalAlignment(SwingConstants.CENTER); 
     setVerticalAlignment(SwingConstants.CENTER); 
    } 
+0

イメージのサイズを変更しようとしていますか? ( 'resize()'を参照してください) – ItamarG3

+0

はい、私は 'resize'のコードで私の投稿を編集しました – pioupiou1211

+0

ええ、何が起こっているのか把握しようとしています... – ItamarG3

答えて

1

で、私は実行コードあなたは、静的、外部クラスで画像を置くことができるが、(それを呼び出すことができますTesting今のところ):

public class Testing { 
    private static List<ImageIcon> images = new ArrayList<>(); 

    public static void add(ImageIcon im) { 
     images.add(im); 
    } 

    public static List<ImageIcon> get() { 
     return Testing.images; 
    } 
    public static void clear(){ 
     images.clear(); 
    } 
... 

次に:

icon = DoubleImage(eau,img); 
Testing.add(icon); 
setIcon(icon); 

... 

アイコンを再作成する必要があるたびに、Testing.clear()でリストを消去します。

+0

助けてくれてありがとう。しかし、もしg.drawImage((Image)img、eau.getWidth()/ 2-img.getHeight()/ 2、eau.getHeight()/ 2-img.getWidth()/ 2、null); ' 、 'img'は表示されません(' 'img''は' 'eau''に重複しています)。 – pioupiou1211

+0

@ pioupiou1211試しましたか?あなたが持っていれば、それは変わっています。あなたが 'resize()'に 'img'を描く方法を見ているからです。 – ItamarG3

+0

ああ、私はあなたが意味することを知っています。 'サイズ変更 'では、' img'のサイズを変更するのは 'eau'に比べて小さすぎるためです。しかし、 'サイズ変更'では 'finalIcon'に' img'を描くことはありません。編集:私はしようとし、 'img'は表示されません – pioupiou1211

関連する問題