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;
}
}
戻る