7

まず第一に、これは私がスイングを使用する最初の週です、そして私の質問があまりにも明白であるならば申し訳ありません。また、これは宿題用であり、奇妙なライブラリを使用することは許可されていないため、標準のJavaライブラリを使用するソリューションが必要です。

JFrameに画像を表示するためにImageIconでJLabelを使用しています。次に、画面上の画像を任意の角度に回転させます。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に戻す解決策を評価します。これを試してみると、...

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

2 に答える 2

11

コンポーネント自体を回転させる代わりに、コンポーネントのコンテンツを回転させることを検討してください。このでは、回転した画像をで描画しJPanelます。

補遺:この では、メモリ内に直接RotatableImage.getImage()作成しますが、他の場所から画像を取得するために使用できます。画像を変更したい場合にサポートされますが、おそらく、の一部として回転したグラフィックスコンテキストで変更されていない画像を描画したいだけです。BufferedImageImageIO.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);
    }
}
于 2010-11-26T21:44:11.223 に答える
3

私が見つけた解決策が機能しないか、私はそれらを理解していないので

それらを理解していない場合は、テストコードを示すSSCCE(http://sscce.org)を投稿する必要があります。そうすれば、誰かがコードの仕組みを説明できるようになるかもしれません。

画像やアイコンの回転の概念はすべて同じであるため、私たちが投稿する可能性のある新しいコードを理解できるとは思えません。

JLabelでsetBoundsを実行して画像を配置しているので

なぜsetBounds()を使用しているのですか。これについて心配する必要がないように、レイアウトマネージャーを使用する必要があります。

編集:

多分あなたは回転したアイコンを使うことができます。

于 2010-11-26T18:48:41.987 に答える