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:}