文書テンプレートを作成してみる

戻る



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

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

public class BGPanel extends JPanel {
    private String selectedComponentType = null;

    private final String imagePath = "./bLayer.jpg";
    private BufferedImage image = null;

    private int width = 0;
    private int height = 0;

    private Map<JComponent, String> componentMap = null;

    private ComponentSelectionPanel csPanel = null;

    public BGPanel() {
        super();

        setLayout( null );

        componentMap = new LinkedHashMap<JComponent, String>();

        //-------------------------------------------------
        // 画像を台紙として表示
        //-------------------------------------------------
        try {
            image = ImageIO.read( new File( imagePath ) );

        } catch ( IOException ex ) {
            ex.printStackTrace();
        }
        System.out.println( image.getWidth() );
        System.out.println( image.getHeight() );

        if ( image != null ) {
            setPreferredSize( new Dimension( image.getWidth(), image.getHeight() ) );
        }

        // このパネルの幅、高さを得る
        Dimension dimension = getPreferredSize();
        width = ( int ) dimension.getWidth();
        height = ( int ) dimension.getHeight();

        System.out.println( "width=" + width );
        System.out.println( "height=" + height );

        addMouseListener( new BGPanelMouseAdapter() );
        addMouseMotionListener( new BGPanelMouseMotionAdapter() );

    }

    public void setCsPanel( ComponentSelectionPanel csPanel ) {
        this.csPanel = csPanel;
    }

    public ComponentSelectionPanel getCsPanel() {
        return csPanel;
    }

    public void setSelectedComponentType( String type ) {
        selectedComponentType = type;
    }

    public String getSelectedComponentType() {
        return selectedComponentType;
    }

    public synchronized void putComponentMap( JComponent component, String name ) {
        if ( componentMap != null ) {
            componentMap.put( component, name );
        }
    }

    public Map getComponentMap() {
        return componentMap;
    }

    public void paintComponent( Graphics g ) {
        if ( image != null ) {
            g.drawImage( image, 0, 0, this );
        }
    }

}
::::::::::::::
BGPanelMouseAdapter.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.util.*;

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

public class BGPanelMouseAdapter extends MouseAdapter {

    public void mousePressed( MouseEvent m ) {
        System.out.println( "PRESSED.." );
    }

    public void mouseReleased( MouseEvent m ) {

        System.out.println( "RELEASED.." );

        // イベント生成元はBGPanelである
        BGPanel panel = ( BGPanel ) m.getSource();
        panel.getCsPanel().resetBgColorOfAllButtons();

        if ( m.isPopupTrigger() ) {
            /* マウス右クリックが実行されたらポップアップメニューを表示 */
            BGPanelPopupMenu popup = new BGPanelPopupMenu( panel );
            popup.show( m.getComponent(), m.getX(), m.getY() );
            popup.pack();
        }

        if ( panel.getSelectedComponentType() == null ) {
            // コンポーネントが選択されていない場合は何もしない
            return ;
        }

        // このコンポーネン内のマウスの座標を取得する
        int x = m.getX();
        int y = m.getY();

        // この背景パネルの幅、高さを取得する
        Dimension dimension = panel.getPreferredSize();
        int width = ( int ) dimension.getWidth();
        int height = ( int ) dimension.getHeight();

        if ( y > 0 && x > 0 && y < height && x < width ) {

            System.out.println( "COMPONENT CREATED!" );

            // ファクトリクラスからJComponentを取得
            JComponent component = JComponentFactory.createComponent( panel.getSelectedComponentType(), x, y );

            panel.putComponentMap( component, null ); // まだタグ名は設定されていない

            // コンポーネントをドラッグできるようにする
            component.addMouseMotionListener( new ComponentDragger() );

            // コンポーネントに対してポップアップメニューを設定する
            new PopupMenuSetter( panel, component );

            // コンポーネントをパネル上に配置する
            panel.add( component );
            panel.validate( );
            panel.repaint( );

            // コンポーネント選択パネルの設定内容をリセット
            panel.setSelectedComponentType( null );
        }
    }
}
::::::::::::::
BGPanelMouseMotionAdapter.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.util.*;

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

public class BGPanelMouseMotionAdapter extends MouseMotionAdapter {

    public void mouseDragged( MouseEvent m ) {
        /** DO NOTHING */
    }

    public void mouseMoved( MouseEvent m ) {

        // イベント生成元はBGPanelである
        BGPanel panel = ( BGPanel ) m.getSource();

        String selectedComponentType = panel.getSelectedComponentType();

        if ( selectedComponentType != null ) {
            panel.setCursor( DragSource.DefaultMoveDrop );
        } else {
            panel.setCursor( Cursor.getDefaultCursor() );
        }
    }

}
::::::::::::::
BGPanelPopupMenu.java
::::::::::::::
import javax.swing.*;

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

import java.util.*;

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

public class BGPanelPopupMenu extends JPopupMenu implements ActionListener {

    private BGPanel panel = null;

    public BGPanelPopupMenu( BGPanel panel ) {
        super();

        this.panel = panel;

        setPopupSize( 120, 50 );

        JMenuItem menuItem1 = new JMenuItem( "コンポーネント一覧" );
        menuItem1.setActionCommand( "SHOW_COMPONENT_MAP" );
        menuItem1.addActionListener( this );
        this.add( menuItem1 );

        JMenuItem menuItem2 = new JMenuItem( "テンプレート情報保存" );
        menuItem2.setActionCommand( "SAVE_TEMPLATE" );
        menuItem2.addActionListener( this );
        this.add( menuItem2 );

    }

    public void actionPerformed( ActionEvent event ) {

        String command = ( String ) event.getActionCommand();

        if ( "SHOW_COMPONENT_MAP".equals( command ) ) {
            new ComponentMapViewer( panel );
        }
        if ( "SAVE_TEMPLATE".equals( command ) ) {}
    }
}
::::::::::::::
CheckboxGroupPanel.java
::::::::::::::
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

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

public class CheckboxGroupPanel extends JPanel {

    public CheckboxGroupPanel() {
        super();
        setBackground( Color.green );

        // this.add( new JCheckBox("てすと", true));

        // setLayout( new GridLayout( 3, 1 ) );

        JCheckBox cb1 = new JCheckBox( "チェック項目1", true );
        cb1.setEnabled( false );
        this.add( cb1 );

        JCheckBox cb2 = new JCheckBox( "チェック項目2", true );
        cb2.setEnabled( false );
        this.add( cb2 );

        JCheckBox cb3 = new JCheckBox( "チェック項目3", false );
        cb3.setEnabled( false );
        this.add( cb3 );
    }
}
::::::::::::::
ComboBoxPanel.java
::::::::::::::
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

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

public class ComboBoxPanel extends JPanel {

    private JComboBox cb = null;

    public ComboBoxPanel() {
        super();

        // 透明にする
        setOpaque( false );
        // setBackground(Color.orange);

        // コンポーネントを配置するときの余白を明示的に指定する
        // FlowLayout layout = new FlowLayout();
        // layout.setVgap( 10 );
        // layout.setHgap( 10 );
        // setLayout( layout );

        Object obj[] = new Object[] {
                           "選択肢1"
                           , "選択肢2"
                           , "***********"
                       };
        cb = new JComboBox( obj );

        this.add( cb );
    }
}
::::::::::::::
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: TD.html,v 1.1 2009/06/22 16:11:58 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 );

    }
}

::::::::::::::
ComponentMapViewer.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

import java.util.*;

/**
* <pre>
* $Id: TD.html,v 1.1 2009/06/22 16:11:58 kishi Exp kishi $
* コンポーネントのマップを閲覧するクラス
* </pre>
* @author KISHI Yasuhiro
*/
public class ComponentMapViewer extends JFrame implements ActionListener {

    private BGPanel bgPanel;

    private String[] columnNames = {"コンポーネント種別", "タグ名"};

    JTable table;

    public ComponentMapViewer( BGPanel bgPanel ) {

        super( "コンポーネント一覧" );

        this.bgPanel = bgPanel;

        setBounds( 250, 250, 520, 600 );
        setVisible( true );

        table = new JTable();
        showComponentList();

        // スクロールペイン
        JScrollPane scrPane = new JScrollPane();
        scrPane.getViewport().setView( table );
        scrPane.setPreferredSize( new Dimension( 300, 300 ) );

        // 上部のパネル
        JPanel panel = new JPanel();
        panel.add( scrPane );

        // ボタン
        JButton update = new JButton( "更新" );
        update.setActionCommand( "UPDATE" );
        update.addActionListener( this );

        // 下部のパネル
        JPanel lowerPanel = new JPanel();
        lowerPanel.add( update );

        // 全体
        Container container = this.getContentPane();
        container.add( panel, BorderLayout.CENTER );
        container.add( lowerPanel, BorderLayout.SOUTH );

        pack();

    }

    private void showComponentList() {

        getTableData();


    }

    public void actionPerformed( ActionEvent e ) {
        String command = e.getActionCommand();
        System.out.println( "COMMAND=" + command );
    }

    private void getTableData() {

        DefaultTableModel model = new DefaultTableModel();

        // ヘッダをセット
        model.setColumnIdentifiers( columnNames );

        Map map = bgPanel.getComponentMap();
        Iterator iterator = map.keySet().iterator();
        int i = 0;
        while ( iterator.hasNext() ) {
            JComponent component = ( JComponent ) iterator.next();
            String tagName = ( String ) map.get( component );

            System.out.printf( "(%3d) %s : %s\n", ++i, component.getClass().getName(), tagName );
            model.addRow( new Object[] {component.getClass().getName(), tagName} );
        }

        table.setModel( model );

        // 各カラムの表示幅を指定する
        int[] width = new int[ columnNames.length ];
        width[ 0 ] = 150;
        width[ 1 ] = 150;
        for ( i = 0;i < width.length;i++ ) {
            TableColumn col = table.getColumnModel().getColumn( i );
            col.setMinWidth( width[ i ] );
            col.setMaxWidth( width[ i ] );
        }

    }


}
::::::::::::::
ComponentSelectionPanel.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.util.*;

/**
* <pre>配置するコンポーネントを選択するパネル
* $Id: TD.html,v 1.1 2009/06/22 16:11:58 kishi Exp kishi $
* </pre>
* @author KISHI Yasuhiro
*/

public class ComponentSelectionPanel extends JPanel implements ActionListener {

    private java.util.List list = null;
    /**
    * 背景画像のパネル
    */
    private BGPanel bgPanel;

    private Map defaultBGColorMap = null;

    public ComponentSelectionPanel( BGPanel bgPanel ) {
        super();

        this.bgPanel = bgPanel;

        list = new LinkedList();

        list.add( new JButton( "ラベル" ) );
        list.add( new JButton( "テキストフィールド" ) );
        list.add( new JButton( "テキストエリア" ) );
        list.add( new JButton( "チェックボックス" ) );
        list.add( new JButton( "ラジオボタン" ) );
        list.add( new JButton( "コンボボックス" ) );
        list.add( new JButton( "イメージ" ) );
        list.add( new JButton( "図形" ) );

        defaultBGColorMap = new HashMap();

        Iterator iterator = list.iterator();
        while ( iterator.hasNext() ) {
            JButton button = ( JButton ) iterator.next();
            this.add( button );

            // ToolTipテキストを設定する
            button.setToolTipText( button.getText() + "を配置します。クリック後、下のペインにカーソル移動してください。" );

            button.addActionListener( this );

            // ボタンの背景色を保存しておく
            defaultBGColorMap.put( button, button.getBackground() );
        }
    }

    public void actionPerformed( ActionEvent event ) {
        JButton selectedButton = ( JButton ) event.getSource();
        System.out.println( "[" + selectedButton.getText() + "] が選択されました!" );

        resetBgColorOfAllButtons();

        // 選択されたボタンのみ背景色を黄色にする
        bgPanel.setSelectedComponentType( selectedButton.getText().toString() );
        selectedButton.setBackground( Color.yellow );

    }

    /**
    * 背景色を元の色に戻す
    */
    public void resetBgColorOfAllButtons() {
        Iterator iterator = list.iterator();
        while ( iterator.hasNext() ) {
            JButton button = ( JButton ) iterator.next();

            Color bgColor = ( Color ) defaultBGColorMap.get( button );
            button.setBackground( bgColor );
        }

    }



}
::::::::::::::
FigurePanel.java
::::::::::::::
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;

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

public class FigurePanel extends JPanel {

    public FigurePanel() {
        super();
    }

    public void paintComponent( Graphics g ) {

        Graphics2D g2 = ( Graphics2D ) g;

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

        g2.draw( new Ellipse2D.Double( 0, 0, 50, 50 ) );

        BasicStroke wideStroke = new BasicStroke( 4.0f );
        g2.setStroke( wideStroke );
        g2.draw( new Ellipse2D.Double( 0, 50, 80, 110 ) );

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

    }
}
::::::::::::::
ImagePanel.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: TD.html,v 1.1 2009/06/22 16:11:58 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class ImagePanel extends JPanel {

    private BufferedImage image = null;
    private String imageURLAsString = null;

    public ImagePanel() {
        super();

    }
    public void paintComponent( Graphics g ) {

        if ( image == null ) {
            // 画像をセットしていない場合は背景色でこのコンポーネントを全て塗りつぶす
            int width = getWidth();
            int height = getHeight();
            g.setColor( Color.cyan );
            g.fillRect( 0 , 0 , width , height );

            g.setColor( Color.black );
            g.drawString( "Image", 25, 25 );

        } else {
            g.drawImage( image, 0, 0, this );

            // イメージのサイズに表示領域をあわせる
            setSize( image.getWidth(), image.getHeight() );
        }
    }

    /**
    * URLから画像をダウンロードする
    * @param imageURLAsString URL文字列
    */
    public void obtainImage( String imageURLAsString ) {

        this.imageURLAsString = imageURLAsString;

        System.out.println( "画像URLを読み取り中・・・" );
        System.out.println( "URL=" + imageURLAsString );

        image = null;
        try {
            // image = ImageIO.read( new URL( "http://img.yahoo.co.jp/i/jp/my/top7.gif" ) );

            image = ImageIO.read( new URL( imageURLAsString ) );

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

        repaint();
    }

    public String getImageURLAsString() {
        return imageURLAsString;
    }

}

::::::::::::::
JComponentFactory.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: TD.html,v 1.1 2009/06/22 16:11:58 kishi Exp kishi $
* @author KISHI Yasuhiro
* <pre>
* JComponentを返すファクトリ
* </pre>
*/

public class JComponentFactory {

    /**
    * @param type コンポーネントの種別
    * @param x 左上X座標
    * @param y 左上y座標
    * @return コンポーネントのインスタンス
    */
    public static JComponent createComponent( String type, int x, int y ) {
        JComponent component;

        if ( "ラベル".equals( type ) ) {
            component = new JLabel( "LABEL" );
            component.setBounds( x, y, 100, 30 );

        } else if ( "テキストフィールド".equals( type ) ) {
            component = new JTextField( 20 );
            component.setBounds( x, y, 100, 25 );
            ( ( JTextField ) component ).setText( "TEXTFIELD" );

        } else if ( "テキストエリア".equals( type ) ) {
            component = new JTextArea();
            component.setBounds( x, y, 100, 50 );
            component.setBackground( Color.white );

            //component.setBorder( new LineBorder( Color.RED , 1 ) );
            // component.setBorder( new MatteBorder( 1, 0, 1, 0, Color.black ) );
            component.setBorder( new BevelBorder( BevelBorder.LOWERED ) );

            ( ( JTextArea ) component ).setText( "TEXTAREA" );

        } else if ( "チェックボックス".equals( type ) ) {

            component = new CheckboxGroupPanel();
            component.setBounds( x, y, 100, 100 );
            component.setBorder( new LineBorder( Color.green, 10 ) );

        } else if ( "コンボボックス".equals( type ) ) {

            component = new ComboBoxPanel();
            component.setBounds( x, y , 150, 60 );
            // component.setBorder( new LineBorder( Color.gray, 1 ) );
            component.setBorder( new EmptyBorder( 10, 10, 10, 10 ) );


        } else if ( "イメージ".equals( type ) ) {

            component = new ImagePanel();
            component.setBounds( x, y, 100, 100 );

        } else if ( "図形".equals( type ) ) {

            component = new FigurePanel();
            component.setBounds( x, y, 200, 200 );

        } else {
            component = new JButton( "BUTTON" );
            component.setBounds( x, y, 100, 25 );
            ( ( JButton ) component ).setText( type );
        }

        return component;
    }

}
::::::::::::::
MainPanel.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import java.awt.datatransfer.*;
import java.awt.dnd.*;

import java.util.*;

/**
* $Id: TD.html,v 1.1 2009/06/22 16:11:58 kishi Exp kishi $
*/
public class MainPanel extends JPanel implements Observer {

    public MainPanel() {
        super();
        // setBackground( Color.yellow );
    }

    public void update( Observable obj, Object arg ) {

        System.out.println( "in " + this.getClass().getName() + ": UPDATE() [" + arg
                            + "] -- notified by " + obj.getClass().getName() );

        removeAll();

        if ( "CREATE_TEMPLATE".equals( arg ) ) {
            // テンプレートを作成するパネルを配置
            TemplateCreationPanel panel = new TemplateCreationPanel();
            this.add( panel );
        }
        if ( "EDIT_TEMPLATE".equals( arg ) ) {
            // テンプレートを編集するパネルを配置
            TemplateEditingPanel panel = new TemplateEditingPanel();
            this.add( panel );
        }

        validate();
        repaint();
    }

}
::::::::::::::
ModeNotifier.java
::::::::::::::
import java.io.*;
import java.util.*;

/**
* $Id: TD.html,v 1.1 2009/06/22 16:11:58 kishi Exp kishi $
* 現在の操作メニューを各Observerに通知するクラス
* シングルトンにしなければならない
*/

public class ModeNotifier extends Observable {

    private static ModeNotifier uniqueInstance = null;

    /**
    * コンストラクタ
    */
    private ModeNotifier() {
        // do nothing
    }

    public static ModeNotifier getInstance() {
        if ( uniqueInstance == null ) {
            uniqueInstance = new ModeNotifier();
            System.out.println( uniqueInstance.getClass().getName() + " がインスタンス化されました。" );
        }

        return uniqueInstance;
    }

    /**
    * Observerに対して操作メニューの変更を通知する
    */
    public void notifyCurrentContext( String command ) {
        setChanged();
        notifyObservers( command );
    }

}
::::::::::::::
MyMenuBar.java
::::::::::::::
import java.util.*;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

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

public class MyMenuBar extends JMenuBar {

    public MyMenuBar() {
        super();

        JMenu file = new JMenu( "ファイル" );
        JMenu dummy = new JMenu( "ダミー" );

        // 各メニューに対してのアクションコマンドを指定
        Action action = new MyMenuBarAction();

        addMenuItem( file, action, "新規テンプレート作成", "CREATE_TEMPLATE" );
        addMenuItem( file, action, "既存テンプレート編集", "EDIT_TEMPLATE" );
        addMenuItem( file, action, "Doc作成", "CREATE_DOC" );
        addMenuItem( file, action, "Doc編集", "EDIT_DOC" );
        addMenuItem( file, action, "終了", "EXIT" );

        addMenuItem( dummy, action, "機能1", "A" );
        addMenuItem( dummy, action, "機能2", "B" );
        addMenuItem( dummy, action, "機能3", "C" );
        addMenuItem( dummy, action, "機能4", "D" );
        addMenuItem( dummy, action, "機能5", "E" );

        this.add( file );
        this.add( dummy );
    }

    private void addMenuItem( JMenu menu, Action action, String description, String commandName ) {
        JMenuItem item = new JMenuItem( description );
        menu.add( item );
        item.setActionCommand( commandName );
        item.addActionListener( action );
    }

}
::::::::::::::
MyMenuBarAction.java
::::::::::::::
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

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

public class MyMenuBarAction extends AbstractAction {

    public MyMenuBarAction() {
        super();
    }

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

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

        if ( command.equals( "EXIT" ) ) {
            System.exit( 0 );
        }

        // 選択されたコマンドをObserverに通知
        ModeNotifier.getInstance().notifyCurrentContext( command );

    }
}

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

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

/**
* $Id: TD.html,v 1.1 2009/06/22 16:11:58 kishi Exp kishi $
* @author KISHI Yasuhiro
* <pre>
* コンポーネントのプロパティを編集するためのポップアップメニュー
* </pre>
*/

public class PopupMenuSetter {

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

    public PopupMenuSetter( JPanel panel, JComponent component ) {
        this.panel = panel;
        this.component = component;

        setPopupMenu();
    }

    /**
    * ポップアップメニューを生成する
    */
    private void setPopupMenu() {

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

        addMenuItem( "プロパティ変更", "MODIFY_PROP", Color.white );
        addMenuItem( "サイズ変更", "CHANGE_SIZE", Color.white );
        addMenuItem( "削除", "KILL_ITSELF", Color.yellow );

        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, Color bgColor ) {
        JMenuItem menuItem = new JMenuItem( text );
        menuItem.setBackground( bgColor );
        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();

            }
            if ( command.equals( "MODIFY_PROP" ) ) {
                // プロパティを設定するためのサブウィンドウを表示する
                int xPos = component.getX() + component.getWidth() + 10;
                int yPos = component.getY() + 10;

                new PropertyEditor( xPos, yPos, ( BGPanel ) panel, component );
            }

        }

    }
}

::::::::::::::
PropertyEditor.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import java.util.*;

/**
* $Id: TD.html,v 1.1 2009/06/22 16:11:58 kishi Exp kishi $
*/
public class PropertyEditor extends JFrame implements ActionListener {

    /**
    * 対象となるコンポーネント
    */
    private JComponent component = null;
    /**
    * 背景画像を格納するパネル
    */
    private BGPanel bgPanel = null;
    /**
    * タグ名
    */
    private JTextField tagNameTF = null;
    private JTextField defaultValueTF = null;
    private JTextField imageURLTF = null;

    private JTextField cmpntX = null;
    private JTextField cmpntY = null;
    private JTextField cmpntWidth = null;
    private JTextField cmpntHeight = null;

    private JCheckBox isOpaqueCB = null;

    public PropertyEditor( int xPos, int yPos, BGPanel bgPanel, JComponent component ) {

        super( "コンポーネントのプロパティ編集" );
        setBounds( xPos, yPos, 520, 600 );

        this.bgPanel = bgPanel;
        this.component = component;

        TDCommonPanel panel = new TDCommonPanel();

        int rowNum = 0;

        //------------------------------------------------------------
        // コンポーネント種別
        //------------------------------------------------------------
        panel.addComponent( new JLabel( "コンポーネントの種別", JLabel.RIGHT ) , 0, rowNum, 1, 1 );

        String componentTypeName = component.getClass().getName();
        JTextField tf1 = new JTextField( 20 );
        tf1.setText( componentTypeName );
        tf1.setEnabled( false );
        panel.addComponent( tf1, 1, rowNum, 1, 1 );

        rowNum++;

        //------------------------------------------------------------
        // タグ名
        //------------------------------------------------------------
        panel.addComponent( new JLabel( "タグ名", JLabel.RIGHT ) , 0, rowNum, 1, 1 );

        tagNameTF = new JTextField( 20 );
        // コンポーネントに名称が設定されている場合は、初期値として表示
        Map componentMap = bgPanel.getComponentMap();
        if ( componentMap != null && componentMap.containsKey( component ) ) {
            tagNameTF.setText( ( String ) componentMap.get( component ) );
        }
        panel.addComponent( tagNameTF, 1, rowNum, 1, 1 );

        rowNum++;

        //------------------------------------------------------------
        // 初期値(ラベル、テキストフィールド、テキストエリアの場合)
        //------------------------------------------------------------
        if ( component instanceof JLabel
                || component instanceof JTextField
                || component instanceof JTextArea ) {

            panel.addComponent( new JLabel( "初期値", JLabel.RIGHT ) , 0, rowNum, 1, 1 );

            defaultValueTF = new JTextField( 20 );
            // 本当は動的なキャストをしたい⇒別方法があるかもしれない
            if ( component instanceof JLabel ) {
                defaultValueTF.setText( ( ( JLabel ) component ).getText() );
            }
            if ( component instanceof JTextField ) {
                defaultValueTF.setText( ( ( JTextField ) component ).getText() );
            }
            if ( component instanceof JTextArea ) {
                defaultValueTF.setText( ( ( JTextArea ) component ).getText() );
            }

            panel.addComponent( defaultValueTF, 1, rowNum, 1, 1 );

            rowNum++;
        }

        //------------------------------------------------------------
        // イメージ取得URLの設定(イメージパネルの場合)
        //------------------------------------------------------------
        if ( component instanceof ImagePanel ) {
            panel.addComponent( new JLabel( "イメージ取得URL", JLabel.RIGHT ) , 0, rowNum, 1, 1 );

            imageURLTF = new JTextField( 20 );
            String imageURLAsString = ( ( ImagePanel ) component ).getImageURLAsString();
            if ( imageURLAsString != null ) {
                imageURLTF.setText( imageURLAsString );
            }
            panel.addComponent( imageURLTF, 1, rowNum, 1, 1 );

            rowNum++;
        }

        //------------------------------------------------------------
        // 表示位置および幅、高さ
        //------------------------------------------------------------
        Rectangle bounds = component.getBounds();
        // System.out.println( bounds.x + "," + bounds.getWidth());

        panel.addComponent( new JLabel( "左上X座標", JLabel.RIGHT ) , 0, rowNum, 1, 1 );
        cmpntX = new JTextField( 10 );
        cmpntX.setText( new Integer( bounds.x ).toString() );
        panel.addComponent( cmpntX, 1, rowNum, 1, 1 );
        rowNum++;

        panel.addComponent( new JLabel( "左上Y座標", JLabel.RIGHT ) , 0, rowNum, 1, 1 );
        cmpntY = new JTextField( 10 );
        cmpntY.setText( new Integer( bounds.y ).toString() );
        panel.addComponent( cmpntY, 1, rowNum, 1, 1 );
        rowNum++;

        panel.addComponent( new JLabel( "幅", JLabel.RIGHT ) , 0, rowNum, 1, 1 );
        cmpntWidth = new JTextField( 10 );
        int width = ( int ) bounds.getWidth();
        cmpntWidth.setText( new Integer( width ).toString() );
        panel.addComponent( cmpntWidth, 1, rowNum, 1, 1 );
        rowNum++;

        panel.addComponent( new JLabel( "高さ", JLabel.RIGHT ) , 0, rowNum, 1, 1 );
        cmpntHeight = new JTextField( 10 );
        int height = ( int ) bounds.getHeight();
        cmpntHeight.setText( new Integer( height ).toString() );
        panel.addComponent( cmpntHeight, 1, rowNum, 1, 1 );
        rowNum++;

        //------------------------------------------------------------
        // 透明|不透明
        //------------------------------------------------------------
        panel.addComponent( new JLabel( "透明", JLabel.RIGHT ) , 0, rowNum, 1, 1 );

        isOpaqueCB = new JCheckBox();
        isOpaqueCB.setSelected( !component.isOpaque() );

        panel.addComponent( isOpaqueCB, 1, rowNum, 1, 1 );
        rowNum++;

        //------------------------------------------------------------
        // 更新ボタン
        //------------------------------------------------------------
        JButton submit = new JButton( "更新" );
        submit.setSize( 80, 30 );
        JPanel submitPanel = new JPanel();
        submitPanel.add( submit );
        submit.addActionListener( this );
        submit.setActionCommand( "SUBMIT" );
        panel.addComponent( submitPanel, 0, rowNum, 2, 1 );

        rowNum++;

        //------------------------------------------------------------
        // パネルをコンテナに配置
        //------------------------------------------------------------
        Container container = getContentPane();
        container.add( panel );

        setVisible( true );
        pack();
    }

    /**
    * 設定情報の更新
    */
    public void actionPerformed( ActionEvent event ) {
        String command = event.getActionCommand();

        if ( "SUBMIT".equals( command ) ) {
            //----------------------------------------------------
            // コンポートネントとタグ名の関係を保存
            //----------------------------------------------------
            bgPanel.putComponentMap( component, tagNameTF.getText() );

            //----------------------------------------------------
            // コンポーネント別の処理
            //----------------------------------------------------
            if ( component instanceof JLabel ) {
                ( ( JLabel ) component ).setText( defaultValueTF.getText() );
            }
            if ( component instanceof JTextField ) {
                ( ( JTextField ) component ).setText( defaultValueTF.getText() );
            }
            if ( component instanceof JTextArea ) {
                ( ( JTextArea ) component ).setText( defaultValueTF.getText() );
            }

            if ( component instanceof ImagePanel ) {
                // 指定されたURLからイメージを取得
                ( ( ImagePanel ) component ).obtainImage( imageURLTF.getText() );
            }

            // ウィンドウを閉じる
            this.dispose();
        }
    }

}


::::::::::::::
RadioButtonGroupPanel.java
::::::::::::::
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

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

public class RadioButtonGroupPanel extends JPanel {

    public RadioButtonGroupPanel() {
        super();
        setBackground( Color.green );

        // this.add( new JCheckBox("てすと", true));

        // setLayout( new GridLayout( 3, 1 ) );

        JCheckBox cb1 = new JCheckBox( "チェック項目1", true );
        cb1.setEnabled( false );
        this.add( cb1 );

        JCheckBox cb2 = new JCheckBox( "チェック項目2", true );
        cb2.setEnabled( false );
        this.add( cb2 );

        JCheckBox cb3 = new JCheckBox( "チェック項目3", false );
        cb3.setEnabled( false );
        this.add( cb3 );
    }
}
::::::::::::::
TDCommonPanel.java
::::::::::::::
import java.awt.*;

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

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

public class TDCommonPanel extends JPanel {
    protected GridBagLayout layout;

    public TDCommonPanel() {
        super();

        layout = new GridBagLayout();
        this.setLayout( layout );
    }

    /**
    * GridBagLayoutを使ってコンポーネントを配置する
    */
    protected void addComponent( JComponent component, int x, int y, int w, int h ) {

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridx = x;
        gbc.gridy = y;
        gbc.gridwidth = w;
        gbc.gridheight = h;
        layout.setConstraints( component, gbc );
        this.add( component );
    }

}
::::::::::::::
TemplateCreationPanel.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: TD.html,v 1.1 2009/06/22 16:11:58 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class TemplateCreationPanel extends JPanel {

    protected ComponentSelectionPanel csPanel;
    protected BGPanel bgPanel;
    protected JScrollPane sPane;

    public TemplateCreationPanel() {
        super();

        setLayout( new BorderLayout() );

        //----------------------------------------------------
        // 編集エリア用のパネルを下部に配置
        //----------------------------------------------------
        bgPanel = new BGPanel();
        sPane = new JScrollPane();
        sPane.getViewport().setView( bgPanel );
        sPane.setPreferredSize( new Dimension( 512, 480 ) );

        this.add( sPane , BorderLayout.CENTER );

        //----------------------------------------------------
        // コンポーネント選択用のパネルを上部に配置
        //----------------------------------------------------
        csPanel = new ComponentSelectionPanel( bgPanel );
        this.add( csPanel , BorderLayout.NORTH );

        bgPanel.setCsPanel( csPanel );
    }
}
::::::::::::::
TemplateDesigner.java
::::::::::::::
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

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

public class TemplateDesigner extends JFrame {

    public TemplateDesigner() {

        try {
            // Windows風の外観に設定します
            UIManager.setLookAndFeel( "com.sun.java.swing.plaf.windows.WindowsLookAndFeel" );

            // 外観を変更します
            SwingUtilities.updateComponentTreeUI( this );
        } catch ( Exception e ) {
            e.printStackTrace();
            System.exit( -1 );
        }

        //-------------------------------------------------------
        // メニュー
        //-------------------------------------------------------
        MyMenuBar menuBar = new MyMenuBar();

        //-------------------------------------------------------
        // 作業をするためのメインのPanel
        //-------------------------------------------------------
        MainPanel mainPanel = new MainPanel();
        // ModeNotifierの状態を監視するよう設定する
        ModeNotifier.getInstance().addObserver( mainPanel );

        //-----------------------------------------------------
        // 全ての部品をContainerに配置する
        //-----------------------------------------------------
        Container content = this.getContentPane();

        content.add( menuBar, BorderLayout.NORTH );
        content.add( mainPanel, BorderLayout.CENTER );
        content.add( new JPanel(), BorderLayout.EAST );
        content.add( new JPanel(), BorderLayout.SOUTH );
    }

    public static void main( String[] args ) {

        TemplateDesigner designer = new TemplateDesigner();

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

        designer.setBounds( 0, 0, 800, 600 );

        // タイトルの表示
        designer.setTitle( "Template Designer DEMO" );

        designer.setVisible( true );
        // designer.pack();
    }

}

::::::::::::::
TemplateEditingPanel.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: TD.html,v 1.1 2009/06/22 16:11:58 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class TemplateEditingPanel extends TemplateCreationPanel {

    public TemplateEditingPanel() {
        super();

        loadContext();
    }

    /**
    * コンポーネント定義XMLファイルを読み込み、インスタンス化
    */
    private void loadContext() {

        System.out.println( "In " + this.getClass().getName()
                            + "コンポーネントが定義されたファイルを読み込んでいます・・・" );
    }
}


戻る inserted by FC2 system