オリジナルの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 );
}
}
戻る