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

}




戻る inserted by FC2 system