JLayeredPaneを使ってオーバーレイ画像を編集する

戻る
お絵かきツールなどで複数個のレイヤーを使って画像を編集する場合があります。 こんなときレイヤーの制御はJLayeredPaneを駆使することで対応できます。


::::::::::::::
BGPanel.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;
import java.awt.dnd.*;
import java.awt.geom.*;
import java.awt.image.*;

import javax.imageio.*;

import javax.swing.event.*;
import javax.swing.*;
import javax.swing.border.*;

import java.io.*;
import java.net.*;

/**
* $Id: LayeredPaneTest.html,v 1.1 2009/06/22 16:11:49 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class BGPanel extends JPanel {

    private BufferedImage image = null;
    private Color bgColor = null;

    public BGPanel() {
        super();
        bgColor = new Color( 0xcc, 0xcc, 0xff );

        System.out.println( "画像URLを読み取り中・・・" );
        image = null;
        try {
            image = ImageIO.read( new URL( "http://img.yahoo.co.jp/i/jp/my/top7.gif" ) );

        } catch ( IOException ex ) {
            ex.printStackTrace();
        }
        System.out.println( "完了しました!" );

    }

    public void paint( Graphics g ) {

        int width = getWidth();
        int height = getHeight();

        g.setColor( bgColor );
        // 背景色でこのコンポーネントを全て塗りつぶす
        g.fillRect( 0 , 0 , width , height );

        Graphics2D g2 = ( Graphics2D ) g;

        g2.drawImage( image, width / 2, height / 2, this );

    }

}

::::::::::::::
LayeredPaneTest.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;
import java.awt.dnd.*;
import java.awt.geom.*;

import javax.swing.event.*;
import javax.swing.*;
import javax.swing.border.*;

/**
* $Id: LayeredPaneTest.html,v 1.1 2009/06/22 16:11:49 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class LayeredPaneTest extends JFrame {

    public LayeredPaneTest () {
        super( "LayeredPaneのテスト" );

        try {
            // 外観を設定します
            UIManager.setLookAndFeel( "com.sun.java.swing.plaf.windows.WindowsLookAndFeel" );
            // 外観を変更します
            SwingUtilities.updateComponentTreeUI( this );
        } catch ( Exception e ) {
            e.printStackTrace();
            System.exit( -1 );
        }

        setBounds( 0, 0, 640, 480 );

        // System.out.println(this.getHeight());

        // LayeredPaneをコンテナに配置
        MyLayeredPane lPane = new MyLayeredPane( this.getWidth(), this.getHeight() );
        Container container = getContentPane();
        container.add( lPane );

        setVisible( true );

        addWindowListener( new WindowAdapter() {
                               public void windowClosing( WindowEvent ev ) {
                                   dispose();
                                   System.exit( 0 );
                               }
                           }
                         );

    }

    private static void createAndShowGUI() {

        //Create and set up the window.
        JFrame frame = new LayeredPaneTest();
    }

    public static void main( String[] args ) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater( new Runnable() {
                                                    public void run() {
                                                        createAndShowGUI();
                                                    }
                                                }
                                              );

    }

}

::::::::::::::
MyLayeredPane.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;
import java.awt.dnd.*;
import java.awt.geom.*;

import javax.swing.event.*;
import javax.swing.*;
import javax.swing.border.*;

/**
* $Id: LayeredPaneTest.html,v 1.1 2009/06/22 16:11:49 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class MyLayeredPane extends JLayeredPane {

    public MyLayeredPane( int width, int height ) {
        super();

        // 背景となるPanel
        BGPanel bgPanel = new BGPanel();
        bgPanel.setBounds( 0, 0, width, height );

        this.add( bgPanel );
        this.setLayer( bgPanel , -1 );

        // 重ね合わせするPanel
        OverlayedPanel olPanel = new OverlayedPanel();
        olPanel.setBounds( 0, 0, width, height );

        this.add( olPanel );
        this.setLayer( olPanel , 0 );

    }

}
::::::::::::::
MyMouseAdapter.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;
import java.awt.dnd.*;
import java.awt.geom.*;

import javax.swing.event.*;
import javax.swing.*;
import javax.swing.border.*;

/**
* $Id: LayeredPaneTest.html,v 1.1 2009/06/22 16:11:49 kishi Exp kishi $
*/

public class MyMouseAdapter extends MouseAdapter {

    private Cursor dc = new Cursor( Cursor.DEFAULT_CURSOR );
    private Cursor yd = DragSource.DefaultMoveDrop;

    private JComponent component;

    public MyMouseAdapter( JComponent component ) {
        super();
        this.component = component;
    }

    public void mousePressed( MouseEvent m ) {
        component.setCursor( yd );

        System.out.println( "In " + this.getClass().getName() + ": PRESSED" );
        int x = m.getX() + component.getX();
        int y = m.getY() + component.getY();

        setMousePosition( x, y );

    }

    public void mouseReleased( MouseEvent m ) {
        component.setCursor( dc );

        System.out.println( "In " + this.getClass().getName() + ": RELEASED" );
        int x = m.getX() + component.getX();
        int y = m.getY() + component.getY();

        setMousePosition( x, y );

    }

    private void setMousePosition( int x, int y ) {

        ( ( OverlayedPanel ) component ).setMx( x );
        ( ( OverlayedPanel ) component ).setMy( y );
        component.repaint();
    }

}

::::::::::::::
MyMouseMotionAdapter.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;
import java.awt.dnd.*;
import java.awt.geom.*;

import javax.swing.event.*;
import javax.swing.*;
import javax.swing.border.*;


import java.awt.*;
import java.awt.event.*;
import java.awt.dnd.*;
import java.awt.geom.*;

import javax.swing.event.*;
import javax.swing.*;
import javax.swing.border.*;

/**
* $Id: LayeredPaneTest.html,v 1.1 2009/06/22 16:11:49 kishi Exp kishi $
*/

public class MyMouseMotionAdapter extends MouseMotionAdapter {

    private JComponent component;

    public MyMouseMotionAdapter( JComponent component ) {
        super();
        this.component = component;

    }

    public void mouseDragged( MouseEvent m ) {
        // System.out.println( "In " + this.getClass().getName() + ": DRAGGED" );
        int x = m.getX() + component.getX();
        int y = m.getY() + component.getY();
        // System.out.printf( "%3d, %3d\n", x, y );

        setMousePosition( x, y );
    }

    private void setMousePosition( int x, int y ) {

        ( ( OverlayedPanel ) component ).setMx( x );
        ( ( OverlayedPanel ) component ).setMy( y );
        component.repaint();
    }
}

::::::::::::::
OverlayedPanel.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;
import java.awt.dnd.*;
import java.awt.geom.*;

import javax.swing.event.*;
import javax.swing.*;
import javax.swing.border.*;

/**
* $Id: LayeredPaneTest.html,v 1.1 2009/06/22 16:11:49 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class OverlayedPanel extends JPanel {
    int mx = 0;
    int my = 0;

    public OverlayedPanel() {
        super();

        // 透明にする
        setOpaque( false );

        addMouseListener( new MyMouseAdapter( this ) );
        addMouseMotionListener( new MyMouseMotionAdapter( this ) );

    }

    public void paintComponent( Graphics g ) {
        Graphics2D g2 = ( Graphics2D ) g;

        g2.setRenderingHint( RenderingHints.KEY_ANTIALIASING,
                             RenderingHints.VALUE_ANTIALIAS_ON );

        BasicStroke wideStroke = new BasicStroke( 4.0f );
        g2.setStroke( wideStroke );

        g2.setPaint( Color.black );
        g2.draw( new Ellipse2D.Double( 30, 40, 50, 50 ) );

        g2.setPaint( Color.blue );
        g2.draw( new Ellipse2D.Double( 70, 40, 50, 50 ) );

        g2.setPaint( Color.red );
        g2.draw( new Ellipse2D.Double( 110, 40, 50, 50 ) );

        g2.setPaint( Color.yellow );
        g2.fill( new Arc2D.Double( 50, 100, 110, 110, 330, 100, Arc2D.PIE ) );
        g2.setPaint( Color.gray );
        g2.draw( new Arc2D.Double( 50, 100, 110, 110, 330, 100, Arc2D.PIE ) );

        g2.setPaint( Color.white );
        g2.drawLine( 0, 480, mx, my );
        g2.fill( new Ellipse2D.Double( mx - 10, my - 10, 20, 20 ) );

    }

    public void setMx( int mx ) {
        this.mx = mx;
    }
    public void setMy( int my ) {
        this.my = my;
    }
}
戻る inserted by FC2 system