MouseAdapterおよびMouseMotionAdapterのテスト -- 矩形領域の交差判定
戻る
::::::::::::::
MouseAdapterTest.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: MAT.html,v 1.1 2009/06/22 16:11:50 kishi Exp kishi $
* @author KISHI Yasuhiro
*/
public class MouseAdapterTest extends JFrame {
public MouseAdapterTest () {
super( "MouseAdapterおよびMouseMotionAdapterのテスト" );
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 );
// パネルをコンテナに配置
MyPanel panel = new MyPanel();
Container container = getContentPane();
container.add( panel );
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 MouseAdapterTest();
}
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();
}
}
);
}
}
::::::::::::::
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: MAT.html,v 1.1 2009/06/22 16:11:50 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();
System.out.printf( "%3d, %3d\n", x, y );
( ( MyPanel ) component ).setStartPos( 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();
System.out.printf( "%3d, %3d\n", x, y );
( ( MyPanel ) component ).setEndPos( x, 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.*;
/**
* $Id: MAT.html,v 1.1 2009/06/22 16:11:50 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 );
( ( MyPanel ) component ).setEndPos( x, y );
component.repaint();
}
}
::::::::::::::
MyPanel.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: MAT.html,v 1.1 2009/06/22 16:11:50 kishi Exp kishi $
*/
public class MyPanel extends JPanel {
private final Color bgColor = new Color( 0x99, 0x66, 0xff );
private int sx = 0;
private int sy = 0;
private int ex = 0;
private int ey = 0;
private JButton button1;
private JButton button2;
private JLabel label1;
public MyPanel() {
super();
setBackground( bgColor );
setLayout( null );
button1 = new JButton( "One Button" );
button1.setBounds( 30, 30, 100, 50 );
this.add( button1 );
button2 = new JButton( "Another Button" );
button2.setBounds( 70, 230, 140, 50 );
this.add( button2 );
label1 = new JLabel( "A Label" );
label1.setBounds( 370, 110, 120, 60 );
label1.setBackground( Color.yellow );
label1.setOpaque( false );
this.add( label1 );
addMouseListener( new MyMouseAdapter( this ) );
addMouseMotionListener( new MyMouseMotionAdapter( this ) );
}
public void paintComponent( Graphics g ) {
int width = getWidth();
int height = getHeight();
// 画面クリア
g.setColor( bgColor );
// このコンポーネントのサイズを取得する
g.fillRect( 0 , 0 , width , height );
if ( sx == ex && sy == ey )
return ;
g.setColor( Color.white );
g.drawLine( sx, sy, ex, ey );
g.setColor( Color.cyan );
int fromX = sx;
int fromY = sy;
int toX = ex;
int toY = ey;
if ( sx > ex ) {
fromX = ex;
toX = sx;
}
if ( sy > ey ) {
fromY = ey;
toY = sy;
}
g.drawRect( fromX, fromY, Math.abs( ex - sx ), Math.abs( ey - sy ) );
// それぞれの矩形領域が交差するか判定する
Rectangle squareArea = new Rectangle( fromX, fromY, Math.abs( ex - sx ), Math.abs( ey - sy ) );
Component[] components = this.getComponents();
for ( int i = 0;i < components.length;i++ ) {
Rectangle componentArea = new Rectangle( components[ i ].getBounds() );
if ( squareArea.intersects( componentArea ) ) {
// 交差する場合はボーダーを与える
( ( JComponent ) components[ i ] ).setBorder( new MatteBorder( 2, 2, 2, 2, Color.red ) );
} else {
( ( JComponent ) components[ i ] ).setBorder( null );
}
}
}
public void setStartPos( int sx, int sy ) {
this.sx = sx;
this.sy = sy;
}
public void setEndPos( int ex, int ey ) {
this.ex = ex;
this.ey = ey;
}
}
戻る