オリジナルのJComponentを作ってみる

戻る



:::::::::::::: DrawingPanel.java :::::::::::::: import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import java.util.*; /** $Id: JComponentTest.html,v 1.1 2009/06/22 16:11:47 kishi Exp kishi $ @author KISHI Yasuhiro */ public class DrawingPanel extends JPanel implements ActionListener { private java.util.List connections = new ArrayList(); private EntryPoint entryPoint; private ExitPoint exitPoint; private RagButton button; private MyLabel label; public DrawingPanel() { // レイアウトマネージャを使用しない setLayout( null ); // エントリポイントを追加 entryPoint = new EntryPoint(); entryPoint.setBounds( 5, 5, 50, 20 ); // マウスドラッグのモーションリスナを登録 MouseMotionListener motionListener = new MouseDraggedEventHandler( this, entryPoint ); entryPoint.addMouseMotionListener( motionListener ); // エグジットポイントを追加 exitPoint = new ExitPoint(); exitPoint.setBounds( 5, 200, 50, 20 ); exitPoint.addActionListener( this ); // マウスドラッグのモーションリスナを登録 MouseMotionListener motionListener2 = new MouseDraggedEventHandler( this, exitPoint ); exitPoint.addMouseMotionListener( motionListener2 ); // ボタン button = new RagButton( "ボタン" ); button.setBounds( 200, 200, 100, 30 ); button.addActionListener( this ); // マウスドラッグのモーションリスナを登録 MouseMotionListener motionListener3 = new MouseDraggedEventHandler( this, button ); button.addMouseMotionListener( motionListener3 ); // ラベル label = new MyLabel( ); label.setBounds( 400, 200, 100, 79 ); // マウスドラッグのモーションリスナを登録 MouseMotionListener motionListener4 = new MouseDraggedEventHandler( this, label ); label.addMouseMotionListener( motionListener4 ); this.add( label ); this.add( button ); this.add( entryPoint ); this.add( exitPoint ); connections.add( label ); connections.add( button ); connections.add( entryPoint ); connections.add( exitPoint ); } public void actionPerformed( ActionEvent e ) { System.out.println( "Clicked ..." + e.getSource() ); } /** in case when repaint() method is invoked, this method is also executed. */ public void paintComponent( Graphics g ) { System.out.println( "paintComponet:" ); int width = getWidth(); int height = getHeight(); // 画面クリア g.setColor( Color.black ); // このコンポーネントのサイズを取得する g.fillRect( 0 , 0 , width , height ); // 各オブジェクトを線で繋ぐ g.setColor( Color.blue ); for ( int i = 0;i < connections.size();i++ ) { // 管理対象となるのは全てJComponentを継承したクラスである JComponent from = ( JComponent ) connections.get( i ); JComponent to; if ( i == connections.size() - 1 ) { to = ( JComponent ) connections.get( 0 ); } else { to = ( JComponent ) connections.get( i + 1 ); } Rectangle fromRect = from.getBounds(); Rectangle toRect = to.getBounds(); System.out.println( fromRect + "\t" + toRect ); int fromX = ( int ) ( fromRect.x + fromRect.width / 2.0 ); int fromY = ( int ) ( fromRect.y + fromRect.height / 2.0 ); int toX = ( int ) ( toRect.x + toRect.width / 2.0 ); int toY = ( int ) ( toRect.y + toRect.height / 2.0 ); g.drawLine( fromX, fromY, toX, toY ); } } } :::::::::::::: EntryPoint.java :::::::::::::: import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.geom.*; /** $Id: JComponentTest.html,v 1.1 2009/06/22 16:11:47 kishi Exp kishi $ */ public class EntryPoint extends JComponent { public void paintComponent( Graphics g ) { int width = getWidth(); int height = getHeight(); // 画面クリア g.setColor( Color.red ); // このコンポーネントのサイズを取得する g.fillRect( 0 , 0 , width , height ); } } :::::::::::::: ExitPoint.java :::::::::::::: import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.geom.*; /** $Id: JComponentTest.html,v 1.1 2009/06/22 16:11:47 kishi Exp kishi $ */ public class ExitPoint extends JComponent { protected String command_ = ""; public void paintComponent( Graphics g ) { int width = getWidth(); int height = getHeight(); // 画面クリア g.setColor( Color.white ); // このコンポーネントのサイズを取得する g.fillRect( 0 , 0 , width , height ); } public boolean isFocusable() { return true; } public void setActionCommand( String command ) { command_ = command; } public String getActionCommand() { return ( command_ ); } public void addActionListener( ActionListener l ) { listenerList.add( ActionListener.class, l ); } public void removeActionListener( ActionListener l ) { listenerList.remove( ActionListener.class, l ); } protected void _fireActionPerformed() { _fireActionPerformed( new ActionEvent( this, ActionEvent.ACTION_PERFORMED, command_ ) ); } protected void _fireActionPerformed( ActionEvent evt ) { Object[] listeners = listenerList.getListenerList(); for ( int i = listeners.length - 2;i >= 0;i -= 2 ) { if ( listeners[ i ] == ActionListener.class ) { ( ( ActionListener ) listeners[ i + 1 ] ).actionPerformed( evt ); } } } } :::::::::::::: JComponentTest.java :::::::::::::: import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; /** $Id: JComponentTest.html,v 1.1 2009/06/22 16:11:47 kishi Exp kishi $ */ public class JComponentTest extends JFrame { private int width = 640; private int height = 480; public JComponentTest() { super( "オリジナルのJComponentを作ってみる" ); Container contentPane = getContentPane(); contentPane.setLayout( new FlowLayout() ); DrawingPanel dp = new DrawingPanel(); dp.setPreferredSize( new Dimension( width, height ) ); contentPane.add( dp ); } public static void main( String[] args ) { JComponentTest frame = new JComponentTest(); /* 終了処理を追加 */ frame.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent e ) { System.exit( 0 ); } } ); /** サイズと位置を指定 */ frame.setBounds( 0, 0, frame.width, frame.height ); frame.setVisible( true ); frame.pack(); } } :::::::::::::: MouseDraggedEventHandler.java :::::::::::::: import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import java.io.*; /** $Id: JComponentTest.html,v 1.1 2009/06/22 16:11:47 kishi Exp kishi $ @author KISHI Yasuhiro */ public class MouseDraggedEventHandler implements MouseMotionListener { private JComponent component; private Container container; public MouseDraggedEventHandler( Container container, JComponent component ) { this.container = container; this.component = component; } public void mouseDragged( MouseEvent argEvent ) { System.out.printf( "(%3d,%3d)\n", argEvent.getX() , argEvent.getY() ); if ( argEvent.getX() < 0 || argEvent.getY() < 0 ) { Rectangle objBounds = component.getBounds(); component.setLocation( objBounds.x + argEvent.getX(), objBounds.y + argEvent.getY() ); } else { Rectangle objBounds = component.getBounds(); if ( objBounds.x <= objBounds.x + argEvent.getX() && objBounds.x + argEvent.getX() <= objBounds.x + objBounds.width && objBounds.y <= objBounds.y + argEvent.getY() && objBounds.y + argEvent.getY() <= objBounds.y + objBounds.height ) { component.setLocation( objBounds.x + argEvent.getX(), objBounds.y + argEvent.getY() ); } else { component.setLocation( argEvent.getX(), argEvent.getY() ); } } container.repaint(); } public void mouseMoved( MouseEvent argEvent ) { } } :::::::::::::: MyLabel.java :::::::::::::: import java.awt.* ; import java.awt.event.* ; import javax.swing.* ; /** $Id: JComponentTest.html,v 1.1 2009/06/22 16:11:47 kishi Exp kishi $ */ public class MyLabel extends JLabel { public MyLabel() { super(); setIcon( new ImageIcon( "test.gif" ) ); setHorizontalAlignment( SwingConstants.LEFT ); setVerticalAlignment( SwingConstants.TOP ); setHorizontalTextPosition( SwingConstants.CENTER ); setVerticalTextPosition( SwingConstants.BOTTOM ); setForeground( Color.green ); } } :::::::::::::: RagButton.java :::::::::::::: import javax.swing.*; /** $Id: JComponentTest.html,v 1.1 2009/06/22 16:11:47 kishi Exp kishi $ */ public class RagButton extends JButton { public RagButton( String text ) { super( text ); } }
戻る inserted by FC2 system