画像の回転

画像(Window)を回転しながら描画します。

前田稔の超初心者のプログラム入門

プログラムの作成

  1. メモ帳などでタイプして WinRotate2.java の名前で保存して下さい。
    //★ Window を回転する    前田 稔
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import static java.lang.Math.PI;
    
    class WinRotate2 extends JPanel implements ActionListener
    {   Image   img;
        int     Rate = 0;
    
        // Main
        public static void main(String args[])
        {   new WinRotate2();
        }
    
        // Constructor
        public WinRotate2()
        {   JFrame jframe= new JFrame("Window Rotation");
            Container c = jframe.getContentPane();
            c.add(this, BorderLayout.CENTER);
            img = getToolkit().getImage("c:\\data\\test\\ayu.jpg");
            new Timer(30,this).start();
            jframe.setSize(320, 320);
            jframe.setVisible(true);
        }
    
        public void actionPerformed(ActionEvent evt)
        {   Rate = ++Rate % 360;
            repaint();
        }
    
        public void paintComponent(Graphics g)
        {   Graphics2D g2d = (Graphics2D)g;
            Dimension  size = getSize();
            g2d.setColor(getBackground());
            g2d.fillRect(0, 0, size.width, size.height);
            g2d.rotate(Rate*PI/180,size.width/2.0,size.height/2.0);
            g2d.drawImage(img,0,0,this);
            g2d.setColor(Color.yellow);
            //g2d.setFont(new Font("Helvetica",Font.PLAIN,32));
            g2d.setFont(new Font("MS P明朝",Font.PLAIN,32));
            g2d.drawString("ウインドウの回転",20,100);
        }
    }
    
  2. "c:\\data\\test\\ayu.gif" の画像を回転しながら描画します。
    テストするときは適当なサイズの画像を調達して、フルパスで指定して下さい。

プログラムの説明

  1. 講座のプログラムの多くは JFrame を継承しているのですが、今回は JPanel を継承しました。
    JPanel を継承すると自動的に Double Buffer が使われるので、チラツキが少なくなります。
    JPanel の継承は JPanel を継承する を参照して下さい。
    タイマを使うので java.awt.event.* をインポートします。
    Rate は回転角度です。
        //★ Window を回転する(チラツキが少なくなります)    前田 稔
        import java.awt.*;
        import javax.swing.*;
        import java.awt.event.*;
        import static java.lang.Math.PI;
    
        class WinRotate2 extends JPanel implements ActionListener
        {   Image   img;
            int     Rate = 0;
        
  2. Constructor です。
    new JFrame("Window Rotation"); で JFrame をインスタンス化します。
    jframe.getContentPane(); で Container を取得して、c.add で貼り付けます。
    new Timer() でタイマをインスタンス化して起動します。
    setSize() で Window(Frame) のサイズを設定します。
    setVisible() で表示します。
        // Constructor
        public WinRotate2()
        {   JFrame jframe= new JFrame("Window Rotation");
            Container c = jframe.getContentPane();
            c.add(this, BorderLayout.CENTER);
            img = getToolkit().getImage("c:\\data\\test\\ayu.jpg");
            new Timer(30,this).start();
            jframe.setSize(320, 320);
            jframe.setVisible(true);
        }
        
  3. タイマ割り込みで起動するメソッドです。
    Rate に回転角度を設定して repaint() で描画するメソッドを呼び出します。
        public void actionPerformed(ActionEvent evt)
        {   Rate = ++Rate % 360;
            repaint();
        }
        
  4. paint() は描画処理で呼び出されるメソッドです。
    背景色を設定して g2d.fillRect() で画面を塗りつぶします。
    g2d.rotate() がウインドウ(画像)を回転するメソッドです。
    g2d.drawImage() で回転したキャンバスの上から今までと同様に描画します。
    次にフォントと色を設定して g2d.drawString() で文字列を描画します。
    マイナーな Font を設定するとサポートされていないことがあるので "Helvetica" が無難かも知れません。
    ウインドウ(キャンバス)が回転しているので、文字列も回転して描画されます。
        public void paintComponent(Graphics g)
        {   Graphics2D g2d = (Graphics2D)g;
            Dimension  size = getSize();
            g2d.setColor(getBackground());
            g2d.fillRect(0, 0, size.width, size.height);
            g2d.rotate(Rate*PI/180,size.width/2.0,size.height/2.0);
            g2d.drawImage(img,0,0,this);
            g2d.setColor(Color.yellow);
            //g2d.setFont(new Font("Helvetica",Font.PLAIN,32));
            g2d.setFont(new Font("MS P明朝",Font.PLAIN,32));
            g2d.drawString("ウインドウの回転",20,100);
        }
        

超初心者のプログラム入門(Java2)