javaプログラムの質問です。以下のプログラムを作成したいのですが、よく分からないので誰かお願いします。


赤い球を3つまで画面に描画するJavaアプレットを作成する。描画領域は400x200とする。
なお、以下の仕様を満たすこと。
(1) Ballと書かれたボタンを押すとx座標、y座標、半径がランダムに決定さ
  れた球が表示される。
(2) 描画領域をクリック(ボタン押下して同じ位置で離す)するとマウス
  カーソルの座標にランダムな半径を持つ球が表示される。
(3) 描画領域でボタン押下したままマウスカーソルを移動させて離すと、
  ボタン押下した座標に、カーソルが移動した距離の半径を持つ球が表
  示される。

回答の条件
  • 1人2回まで
  • 登録:2007/10/30 17:41:22
  • 終了:2007/11/06 17:45:03

回答(1件)

id:lunlumo No.1

lunlumo回答回数107ベストアンサー獲得回数142007/10/31 21:44:26

ポイント60pt

 こんな感じでしょうか。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.Iterator;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JPanel;

public class DrawCircle extends JApplet implements ActionListener, MouseListener, MouseMotionListener {
	
	private static final int CIRCLE_MAX = 3;
	private static final int CIRCLE_COLOR = 0xff0000;
	private static final int PANEL_WIDTH = 400;
	private static final int PANEL_HEIGHT = 200;
	private static final String DRAW_BUTTON_LABEL = "Ball";
	private static final int RADIUS_MAX = 100;
	
	private boolean isDragging;
	private int startX;
	private int startY;
	
	private CirclePanel drawPanel;
	private JButton drawButton;
	
	private ArrayList<CircleInfo> circles;
	
	public void init(){
		
		Container contentPane = getContentPane();
		
		drawPanel = new CirclePanel(true);
		drawButton = new JButton(DRAW_BUTTON_LABEL);
		
		drawPanel.setPreferredSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT));
		
		drawPanel.addMouseListener(this);
		drawPanel.addMouseMotionListener(this);
		drawButton.addActionListener(this);
		
		setLayout(new BorderLayout());
		add(BorderLayout.CENTER,drawPanel);
		add(BorderLayout.SOUTH,drawButton);
		
		isDragging = false;
	}
	
	public void start() { }
	
	public void update(Graphics g) {
		
		paint(g);
	}
	
	private void addCircle(int x, int y, int radius) {
		
		if (drawPanel.circleSize() < CIRCLE_MAX) {
			
			drawPanel.addCircle(new CircleInfo(x,y,radius));
			
			repaint();
		}
	}
	
	private void addCircle(int x, int y) {
		
		int radius;
		
		radius = (int)Math.round(Math.random() * RADIUS_MAX);
		
		addCircle(x,y,radius);
	}
	
	private void addCircle() {
		
		int x;
		int y;
		
		x = (int)Math.round(Math.random() * drawPanel.getWidth());
		y = (int)Math.round(Math.random() * drawPanel.getHeight());
		
		addCircle(x,y);
	}
	
	public void mouseReleased(MouseEvent e) {
		
		int x = e.getX();
		int y = e.getY();
		
		if (isDragging &amp;&amp; e.getButton() == MouseEvent.BUTTON1) {
			
			addCircle(startX, startY, (int)Math.round(Math.sqrt(Math.pow(x - startX,2) + Math.pow(y - startY,2))));
			
			isDragging = false;
		}
	}
	
	public void mouseClicked(MouseEvent e) {
		
		if (e.getButton() == MouseEvent.BUTTON1) {
			
			addCircle(e.getX(),e.getY());
		}
	}
	
	public void mousePressed(MouseEvent e) {
		
		if (e.getButton() == MouseEvent.BUTTON1) {
			
			startX = e.getX();
			startY = e.getY();
		}
	}
	
	public void mouseEntered(MouseEvent e) { }
	
	public void mouseExited(MouseEvent e) { }
	
	public void mouseDragged(MouseEvent e) {
		
		if ((e.getModifiersEx() &amp; MouseEvent.BUTTON1_DOWN_MASK) != 0) {
			
			isDragging = true;
		}
	}
	
	public void mouseMoved(MouseEvent e) { }
	
	public void actionPerformed(ActionEvent e) {
		
		addCircle();
	}
	
	private class CirclePanel extends JPanel {
		
		ArrayList<CircleInfo> circles;
		
		CirclePanel() {
			
			this(true);
		}
		
		CirclePanel(boolean isDoubleBuffered) {
			
			super(isDoubleBuffered);
			
			circles = new ArrayList<CircleInfo>();
		}
		
		public void addCircle(CircleInfo c) {
			
			circles.add(c);
		}
		
		public int circleSize() {
			
			return circles.size();
		}
		
		private void drawCircle(Graphics g, CircleInfo c) {
			
			int x = c.getX();
			int y = c.getY();
			int radius = c.getRadius();
			Color currentColor = g.getColor();
			
			g.setColor(new Color(CIRCLE_COLOR));
			
			g.fillOval(x - radius, y - radius, 2 * radius, 2 * radius);
			
			g.setColor(currentColor);
		}
		
		public void paint(Graphics g) {
			
			super.paint(g);
			
			if (!circles.isEmpty()) {
				
				Iterator<CircleInfo> i = circles.iterator();
				
				while (i.hasNext()) {
					
					drawCircle(g,i.next());
				}
			}
		}
	}
	
	private class CircleInfo {
		
		private int x;
		private int y;
		private int radius;
		
		CircleInfo() {
			
			this(0,0,0);
		}
		
		CircleInfo(int x, int y, int radius) {
		
			setX(x);
			setY(y);
			setRadius(radius);
		}
		
		public void setX(int value) { x = value; }
		public int getX() { return x; }
		public void setY(int value) { y = value; }
		public int getY() { return y; }
		public void setRadius(int value) { radius = value; }
		public int getRadius() { return radius; }
		
	}
}

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません