001:import java.awt.event.* ; // ActionEvent MouseEvent MouseAdapter WindowEvent WindowAdapter
002:import javax.swing.* ;    // ButtonGroup JFrame JLabel JPanel JRadioButton JTextField
003:import java.awt.* ;       // BorderLayout Color Container Dimension Graphics Graphics2D
004:import java.awt.geom.* ;  // RectangularShape Ellipse2D.Double Rectangle2D.Double
005:
006:interface ColoredShape extends Shape {
007:    public Color  getColor();
008:    public double getX();
009:    public double getY();
010:    public double getWidth();
011:    public double getHeight();
012:    public void   setFrame(double x, double y, double w, double h);
013:}
014:
015:class ColoredEllipse extends Ellipse2D.Double
016:                     implements ColoredShape {
017:    Color color;
018:
019:    ColoredEllipse(double x, double y, double w, double h, Color c) {
020:        super(x, y, w, h);
021:        color = c;
022:    }
023:
024:    public Color getColor()   { return color; }
025:    public double getX()      { return super.getX(); }
026:    public double getY()      { return super.getY(); }
027:    public double getWidth()  { return super.getWidth(); }
028:    public double getHeight() { return super.getHeight(); }
029:    public void   setFrame(double x, double y, double w, double h) { super.setFrame(x, y, w, h); }
030:}
031:
032:class ColoredRectangle extends Rectangle2D.Double
033:                       implements ColoredShape {
034:    Color color;
035:
036:    ColoredRectangle(double x, double y, double w, double h, Color c) {
037:        super(x, y, w, h);
038:        color = c;
039:    }
040:
041:    public Color getColor()   { return color; }
042:    public double getX()      { return super.getX(); }
043:    public double getY()      { return super.getY(); }
044:    public double getWidth()  { return super.getWidth(); }
045:    public double getHeight() { return super.getHeight(); }
046:    public void   setFrame(double x, double y, double w, double h) { super.setFrame(x, y, w, h); }
047:}
048:
049:public class Graph2d2x extends JPanel {
050:    static int              shapetype = 0;                  // ものの形状 0:楕円  1:矩形
051:    final static Color      bc = Color.white;               // 背景色
052:    static       Color      dc = Color.red;                 // 描画色
053:    final static JTextField tw = new JTextField("30",3);    // ものの幅
054:    final static JTextField th = new JTextField("30",3);    // ものの高さ
055:    final int               MAX_NUM = 100;                  // ものの最大個数
056:    int                     nshape = 0;                     // ものの個数
057:    ColoredShape[]          shape = new ColoredShape[MAX_NUM];  // 矩形のもの
058:    double                  x, y;                           // ドラッグ前の座標
059:
060:    public Graph2d2x() {
061:        addMouseListener(new MouseAdapter() {
062:            public void mouseClicked(MouseEvent e) {        // マウスがクリックされた場合
063:                double x = (double)e.getX();                         // カーソルの座標
064:                double y = (double)e.getY();
065:                double w = Double.parseDouble(tw.getText().trim());  // 下欄に表示中の幅
066:                double h = Double.parseDouble(th.getText().trim());  //               高さ
067:                RectangularShape s = null;
068:                if(nshape<MAX_NUM && shapetype==0) {                 // 下欄で楕円を指定中
069:                    shape[nshape++] =
070:                       new ColoredEllipse(x-w/2.0, y-h/2.0, w, h, dc);   // 楕円の生成
071:                } else if(nshape<MAX_NUM && shapetype==1) {
072:                    shape[nshape++] =
073:                       new ColoredRectangle(x-w/2.0, y-h/2.0, w, h, dc); // 矩形の生成
074:                } else {
075:                    System.out.println("これ以上書けません");
076:                }
077:                repaint();                                           // 再描画
078:            }
079:            public void mousePressed(MouseEvent e) {        // マウスが押された場合
080:                x = (double)e.getX();                                // カーソルの座標を保存
081:                y = (double)e.getY();
082:            }
083:        });
084:        addMouseMotionListener(new MouseMotionAdapter() {
085:            public void mouseDragged(MouseEvent e) {        // マウスがドラッグされた場合
086:                double newx = (double)e.getX();             // 新しい座標
087:                double newy = (double)e.getY();
088:                for(int i=0; i<nshape; i++) {               // 保存してある全図形について
089:                    if(shape[i].contains(x,y)){                         // カーソルが触れている場合
090:                        shape[i].setFrame(shape[i].getX() + newx - x,   // 図形を移動
091:                                          shape[i].getY() + newy - y,
092:                                          shape[i].getWidth(), shape[i].getHeight());
093:                    }
094:                }
095:                x = newx;                                   // 新しい座標を保存
096:                y = newy;
097:                double w = (double)getWidth();              // 表示枠の幅と高さ
098:                double h = (double)getHeight();
099:                int j=0;                                    // 保存してある全図形について
100:                while(j<nshape) {
101:                    if(!shape[j].intersects(0.0, 0.0, w, h)) {          // 表示枠の外にある場合
102:                        for(int i=j+1; i<nshape; i++) shape[i-1] = shape[i];   // その図形を消去
103:                        nshape--;
104:                    }
105:                    j++;
106:                }
107:                repaint();                                  // 再描画
108:            }
109:        });
110:        setBackground(bc);
111:    }
112:
113:    public void paintComponent(Graphics g) {
114:        super.paintComponent(g);
115:        Graphics2D gg = (Graphics2D)g;
116:        for(int i=0; i<nshape; i++) {                       // 保存してある全図形について
117:            gg.setColor(shape[i].getColor());               //   色の設定
118:            gg.fill(shape[i]);                              //   描画
119:        }
120:    }
121:
122:    public static void main(String[] args) {
123:        JFrame frame = new JFrame();
124:        frame.addWindowListener(new WindowAdapter() { 
125:            public void windowClosing(WindowEvent e) { System.exit(0); }
126:        });
127:        final Container cont = frame.getContentPane();
128:        cont.setLayout(new BorderLayout());
129:        cont.add( new Graph2d2x(), BorderLayout.CENTER );
130:        JPanel southpan = new JPanel();                     // ボタンをならべるパネル
131:        JButton button = new JButton("色選択");             // カラーチューザを呼び出すボタン
132:        button.addActionListener(new ActionListener() {
133:            public void actionPerformed(ActionEvent e) {
134:                Color c = JColorChooser.showDialog(cont, "Choose", Color.white);
135:                if( c!=null ) dc = c;
136:            }
137:        });
138:        southpan.add(button);
139:        JRadioButton buttonE = new JRadioButton("楕円", true);   // ラジオボタン
140:        buttonE.addActionListener(new ActionListener() {
141:            public void actionPerformed(ActionEvent e) {
142:                shapetype = 0;
143:            }
144:        });
145:        JRadioButton buttonR = new JRadioButton("矩形", false);  // ラジオボタン
146:        buttonR.addActionListener(new ActionListener() {
147:            public void actionPerformed(ActionEvent e) {
148:                shapetype = 1;
149:            }
150:        });
151:        ButtonGroup bg = new ButtonGroup();                      //
152:        bg.add(buttonE);
153:        bg.add(buttonR);
154:        southpan.add(buttonE);
155:        southpan.add(buttonR);
156:        southpan.add(new JLabel(" 幅"));
157:        southpan.add(tw);
158:        southpan.add(new JLabel(" 高さ"));
159:        southpan.add(th);
160:        cont.add( southpan, BorderLayout.SOUTH);
161:        frame.setSize(400, 300);
162:        frame.setVisible(true);
163:    }
164:}