ツールバーに配置したコンポーネントをDrag&Dropする

戻る

Web Startはこちらです。




::::::::::::::
ComponentDragger.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.*;

/**
* $Id: ToolBarDemo.html,v 1.1 2009/06/22 16:12:01 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class ComponentDragger extends MouseMotionAdapter {

    private Point point = null;

    public ComponentDragger() {
        super();
        point = new Point();
    }

    public void mouseDragged( MouseEvent e ) {
        JComponent component = ( JComponent ) e.getSource();
        Container container = component.getParent();

        // System.out.println( "DRAGGED... " + component.getClass().getName() );

        // コンテナ内の絶対座標を求める
        point.x = e.getX() + component.getX();
        point.y = e.getY() + component.getY();

        component.setLocation( point );

    }
}


::::::::::::::
ComponentPopupMenuConfigurator.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;

import javax.swing.*;
import java.io.*;
import java.util.*;

/**
$Id: ToolBarDemo.html,v 1.1 2009/06/22 16:12:01 kishi Exp kishi $
@author KISHI Yasuhiro
*/

public class ComponentPopupMenuConfigurator {

    private JPanel panel = null;
    private JComponent component = null;
    private JPopupMenu popup = null;

    public ComponentPopupMenuConfigurator( JPanel panel, JComponent component ) {
        this.panel = panel;
        this.component = component;
    }
    public void setPopupMenu() {

        popup = new JPopupMenu();
        popup.setBackground( Color.yellow );

        addMenuItem( "削除", "KILL_ITSELF" );
        // addMenuItem( "プロパティ変更", "MODIFY_PROP" );

        component.addMouseListener( new MouseAdapter() {
                                        public void mousePressed( MouseEvent e ) {
                                            if ( e.isPopupTrigger() ) {
                                                /* JPopupMenuを表示 */
                                                popup.show( e.getComponent(), e.getX(), e.getY() );
                                            }
                                        }

                                        public void mouseReleased( MouseEvent e ) {
                                            if ( e.isPopupTrigger() ) {
                                                /* JPopupMenuを表示 */
                                                popup.show( e.getComponent(), e.getX(), e.getY() );
                                            }
                                        }
                                    }
                                  );

    }

    /** ポップアップメニューにメニューアイテムを追加する */
    private void addMenuItem( String text, String commandName ) {
        JMenuItem menuItem = new JMenuItem( text );
        menuItem.setBackground( Color.green );
        menuItem.setActionCommand( commandName );
        menuItem.addActionListener( new MyAction() );
        popup.add( menuItem );
    }

    /**
    * アクションクラス
    */
    private class MyAction extends AbstractAction {

        public MyAction() {
            super();
        }
        public void actionPerformed( ActionEvent event ) {
            String command = event.getActionCommand();

            // 実行されたコマンドをダンプします
            System.out.println( command );

            if ( command.equals( "KILL_ITSELF" ) ) {
                // 親オブジェクトからこのインスタンスを削除する
                panel.remove( component );

                // このメソッドを呼ばないと即時に反映されないので必ず再描画する!
                panel.validate();
                panel.repaint();

            }

        }

    }
}

::::::::::::::
DNDTest1.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.net.*;
import java.io.*;
import java.awt.image.*;

import javax.imageio.*;

/**
* $Id: ToolBarDemo.html,v 1.1 2009/06/22 16:12:01 kishi Exp kishi $
* ツールバーに配置したコンポーネントをDrag&Dropする
*/

public class DNDTest1 extends JFrame {
    private JPanel panel = new JPanel();
    private JToolBar toolBar = new JToolBar();

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

    public DNDTest1() {
        super( "ツールバーに配置したコンポーネントをDrag&Dropする" );
        addWindowListener( new WindowAdapter() {
                               public void windowClosing( WindowEvent ev ) {
                                   dispose();
                                   System.exit( 0 );
                               }
                           }
                         );
        setBounds( 10, 10, 650, 450 );
        toolBar.setPreferredSize( new Dimension( 1, 45 ) );
        toolBar.setBorder( BorderFactory.createRaisedBevelBorder() );
        panel.setLayout( null );
        getContentPane().add( "North", toolBar );
        getContentPane().add( "Center", panel );
        addComponentinToolbar( new JLabel( "赤い狐" ), Color.red );
        addComponentinToolbar( new JLabel( "緑の狸" ), Color.green );
        addComponentinToolbar( new JLabel( "蒼い影" ), Color.blue );
        addComponentinToolbar( new JButton( "黄色いボタン" ), Color.yellow );

        BufferedImage image = null;
        try {
            image = ImageIO.read( new URL( "http://asistobe851.hp.infoseek.co.jp/JWS/logo.gif" ) );

        } catch ( IOException ex ) {
            ex.printStackTrace();
        }
        addComponentinToolbar( new JButton( new ImageIcon( image ) ), null );

        setVisible( true );
    }

    private void addComponentinToolbar( JComponent component, Color color ) {
        toolBar.addSeparator();
        component.setOpaque( true );
        if ( component instanceof JLabel ) {
            ( ( JLabel ) component ).setHorizontalAlignment( SwingConstants.CENTER );
        }

        component.setForeground( Color.black );
        component.setBackground( color );

        toolBar.add( component );
        provideMouseListener( component );
    }

    /**
    * マウスオペレーションによるコンポーネントの振る舞いを規定する
    */
    private void provideMouseListener( final JComponent component ) {
        component.addMouseListener( new MouseAdapter() {

                                        public void mousePressed( MouseEvent m ) {
                                            setCursor( yd );
                                            component.setBorder( new MatteBorder( 1, 1, 1, 1, Color.black ) );
                                        }

                                        public void mouseReleased( MouseEvent m ) {
                                            component.setBorder( null );
                                            setCursor( dc );
                                            int x = m.getX() + component.getX();
                                            int y = m.getY() + component.getY() - panel.getY();

                                            if ( y > 0 && x > 0 && y < panel.getHeight() && x < panel.getWidth() ) {

                                                // コンポーネントの生成
                                                Component newComponent = createComponent( component, x, y );

                                                // マウスドラッグのモーションリスナを登録
                                                ( ( JComponent ) newComponent ).addMouseMotionListener( new ComponentDragger() );

                                                // コンポーネントに対してポップアップメニューを付与
                                                ComponentPopupMenuConfigurator cpmc
                                                = new ComponentPopupMenuConfigurator( panel, ( JComponent ) newComponent );
                                                cpmc.setPopupMenu();

                                                System.out.println( "BEFORE ADD: " + newComponent );
                                                System.out.println( "BEFORE ADD: " + newComponent.getX() );
                                                System.out.println( "BEFORE ADD: " + newComponent.getY() );

                                                panel.add( newComponent );

                                                panel.validate();
                                                panel.repaint();
                                            }
                                        }
                                    }
                                  );
    }
    private Component createComponent( JComponent source, int x, int y )              //function to draw component in new position
    {
        System.out.println( "コピー前: " + source );

        JComponent component = null;
        //--------------------------------------------------------
        // 後でファクトリーメソッドに変更する
        //--------------------------------------------------------
        if ( source instanceof JLabel ) {
            component = new JLabel( ( ( JLabel ) source ).getText() );
        }
        if ( source instanceof JButton ) {
            component = new JButton( ( ( JButton ) source ).getText() );

            Icon icon = ( ( JButton ) source ).getIcon();
            if ( icon != null ) {
                ( ( JButton ) component ).setIcon( icon );
            }
        }

        component.setOpaque( true );

        if ( component instanceof JLabel ) {
            ( ( JLabel ) component ).setHorizontalAlignment( SwingConstants.CENTER );
        }
        component.setForeground( source.getForeground() );
        component.setBackground( source.getBackground() );
        component.setBounds( x, y, source.getWidth(), source.getHeight() );

        System.out.println( "コピー後: " + component );
        return component;
    }

    public static void main ( String[] args ) {
        new DNDTest1();
    }

}




戻る inserted by FC2 system