2010-11-26 39 views
5

まずはスイングを使う最初の週ですが、私の質問があまりにも明白であれば申し訳ありません。また、標準的なJavaライブラリを使用するソリューションが必要です。これは宿題のためであり、私は奇妙なライブラリを使用することはできません。JavaスイングでJLabelまたはImageIconを回転させよう

私はImageIconでJLabelを使用して、JFrameに画像を表示しています。今私は任意の角度に画面上の画像を回転させたい。私はGraphics2Dについて何かを見つけましたが、私はそれを行う方法を見つけません。

私が見つけた解決策は動作しない、または理解できないため、ImageIconまたはJLabelを回転させるソリューションに興味があります。私はJLabel上でsetBoundsを実行してイメージを配置しているので、JLabelは私が考えるより優れたソリューションになります(このようにしてImageIconオブジェクトも保存する必要はありません)。

ご迷惑をおかけして申し訳ありません。

JFrame frame = new JFrame("Something"); 
frame.setLayout(new FlowLayout()); //for example 
JPanel panel = new JPanel(); 
panel.setLayout(null); 

ImageIcon playerSprite = new ImageIcon("rute/to/file.png"); 
JLabel player = new JLabel(playerSprite); 

panel.add(player); 
player.setBounds(10,10,36,52); //for example 

frame.getContentPane().add(panel); 
frame.setVisible(true); 

再開、私はこのIconImageかのJLabelを回転させることができる方法:

編集... は、私は次の操作を行う画面で画像を表示します。あなたがそれが良いと思えば、私はイメージを表示するために他の方法を使うことができます。解決策は、私が見るように、Graphics2Dのを使用している場合は、私はこれをしようとするので、私は...、後でイメージアイコンに回転した画像を返し、このクラスのオブジェクトに到着する時に

ImageIcon imagePlayer = new ImageIcon("img/stand.png"); 
Image image = imagePlayer.getImage(); 
Graphics2D g = (Graphics2D)image.getGraphics(); 

をソリューションに感謝します実行時間が、答えはこれです...

Exception in thread "main" java.lang.UnsupportedOperationException: getGraphics() not valid for images created with createImage(producer) 

2番目版... は今、私はこのコードで働いています。画像は回転しますが、古い回転していない画像は新しい画像の下の画面に残ります。 stand.pngという名前のpng画像を同じディレクトリに置くと、その画像が表示されます。

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.imageio.ImageIO; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.lang.Math; 
public class Test { 
    public static void main(String args[]) throws Exception {  
     try { 
      JFrame frame = new JFrame("Rotation Test"); 
      frame.setBounds(10,10,1008,756); 

      BufferedImage bi = ImageIO.read(new File("stand.png")); 
      Graphics2D g = (Graphics2D)bi.getGraphics(); 
      g.rotate(Math.toRadians(45),26,26); 
      g.drawImage(bi, 0, 0, null); 
      JLabel player = new JLabel(new ImageIcon(bi)); 
      frame.getContentPane().add(player); 

      player.setBounds(0,0,100,100); 
      frame.setVisible(true); 
     } catch (IOException ex) { 
      System.out.println("Exception"); 
     } 
    } 
} 
+0

+1はコンパイル可能な例です。私の例の 'RotatableImage.getImage()'や@ camickrの 'Rotated Icon'を使って完成させてみてください。 – trashgod

答えて

7

コンポーネント自体を回転させる代わりに、コンポーネントののコンテンツをローテーションすることを検討してください。このexampleは、JPanelに回転イメージを描画します。

補遺:exampleRotatableImage.getImage()では、メモリ内に直接BufferedImageを作成していますが、他の場所から画像を取得するためにImageIO.read()を使用することができます。イメージを変更する場合はBufferedImage#createGraphics()がサポートされていますが、変更されていないイメージをpaintComponent()の一部として回転したグラフィックスコンテキストで描画したいだけです。

補足:イメージを回転したコピーでペイントしています。代わりに、回転したグラフィックスコンテキストに画像を描画します。

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Test { 

    public static void main(String args[]) throws Exception { 
     JFrame frame = new JFrame("Rotation Test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     final BufferedImage bi = ImageIO.read(new File("img/stand.jpg")); 
     frame.add(new JPanel() { 

      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(bi.getWidth(), bi.getHeight()); 
      } 

      @Override 
      protected void paintComponent(Graphics g) { 
       super.paintComponent(g); 
       Graphics2D g2 = (Graphics2D) g; 
       g2.rotate(Math.PI/4, bi.getWidth()/2, bi.getHeight()/2); 
       g2.drawImage(bi, 0, 0, null); 
      } 
     }); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
+0

私はそのヒントはGraphics2Dを使用していることを理解していますが、その例ではImageIconオブジェクトからこのクラスに到達する方法はわかりません。実際に、私はそれを試してexeptionを受け取ることを示すためにメインのポストを編集しました。ご協力ありがとうございました。 – davidgnin

+0

@ nin1987:私は上記で詳述しました。 – trashgod

+0

私はあなたのコードをすべて理解していないので、おそらく鉱山が失敗する理由がありますが、少なくとも問題は少し解決されています。私が書いた新しいコードで私の最初の投稿を編集し、それを使って画像を回転させますが、回転していない元の画像も表示されます。私は新しいBufferedImage(同じサイズと同じタイプ)を作成するのにうんざりして回転をペイントしますが、元の回転していないイメージだけをペイントします。 – davidgnin

3

まあの私が見つけた解決策が機能しないか、私は彼らに

を理解していないので、あなたがそれらを理解していない場合、あなたはあなたのSSCCE(HTTPを投稿する必要があります。 //sscce.org)にテストコードを示しています。次に、誰かがコードがどのように動作するかを説明することができます。

イメージやアイコンの回転の概念がすべて同じであるため、私たちが投稿するかもしれない新しいコードを理解することはできません。

I)は、なぜあなたは(setBoundsを使用しているのJLabel

にsetBoundsをしている画像を配置していますので。レイアウトマネージャを使用して、これについて心配する必要はありません。

編集:

たぶん、あなたはRotated Iconを使用することができます。

+0

私はバレーボールのコートを見せなければなりません。プレーヤーは内部を移動し、回転したり、スプライトを変えたりしなければなりません。この状況では、setLayout(null)は良いオプションだと思います。私が間違っていれば修正してください。 – davidgnin

+0

しかし、私は私の問題を説明するいくつかの例(私はそれがSSCCE:Dと見なされることを願って)でメインのポストを編集しました。ありがとうございました。 – davidgnin

+0

@ nin1987、あなたはSSCCEをどう考えていますか?そのコードはどのようにコンパイル可能ですか?私の編集を参照してください。 – camickr

関連する問題