円を作成するのクラスにもう一つのそれらを重ねるクラスを複数使うことで二重円を作るプログラムです。だが、ドラグをすると色はなぜか黒になって自分が望んだ色の変化がしないです。以下がすべてのプログラムです。
import java.awt.*; import java.awt.image.*; import java.awt.event.*; import java.io.*; import java.util.*; import javax.imageio.*; import javax.swing.*; public class R5A_3 extends JPanel { ArrayList<Fig> fif = new ArrayList<Fig>(); Fig ser = null; private Fig pi(int x, int y) { Fig fi = null; for (Fig f : fif) { if (f.ht(x, y)) { fi = f; } } return fi; } public R5A_3() { setOpaque(false); fif.add(new DoubleCircle(300, 300, 200, 255, 0, 0)); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { ser = pi(e.getX(), e.getY()); // クリックされた図形を選択 } }); addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent evt) { if (ser == null) { // クリックされた図形がなければ何もしない return; } ser.moto(evt.getX(), evt.getY()); // クリックされた図形を移動させる repaint(); } }); } public void paintComponent(Graphics gg) { for (Fig f : fif) { f.dro(gg); } } public static void main(String[] arg) { JFrame f = new JFrame(); f.add(new R5A_3()); f.setSize(640, 640); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } public class Circle implements Fig { Color c; int px, py, ran; int ca, r, g, b; public Circle(int x, int y, int r, int q, int w, int e) { Color ci = (new Color(q, w, e)); c = ci; px = x; py = y; ran = r; } public void chc() { ca = r; r = g; g = b; b = ca; Color c1 = new Color(r, g, b); c = c1; } public void dro(Graphics G) { G.setColor(c); G.fillOval(px - ran / 2, py - ran / 2, ran, ran); } public boolean ht(int x, int y) { boolean a = (px - x) * (px - x) + (py - y) * (py - y) <= ran * ran; if (a == true) chc(); return a; } public void moto(int x, int y) { px = x; py = y; } } public class DoubleCircle implements Fig { Color co; Circle c0; Circle c1; int r, g, b; public DoubleCircle(int x, int y, int ra, int q, int w, int e) { Color c = new Color(q, w, e); co = c; r = q; g = w; b = e; c0 = new Circle(x, y, ra, r, g, b); c1 = new Circle(x, y, ra / 2, r, g, b); } public void dro(Graphics go) { c0.dro(go); c1.dro(go); } public boolean ht(int x, int y) { System.out.println(r + " " + g + " " + b); c0.ht(x, y); c1.ht(x, y); boolean a = c0.ht(x, y); return a; } public void moto(int a, int b) { c0.moto(a, b); c1.moto(a, b); } } interface Fig { public void dro(Graphics g); public boolean ht(int x, int y); public void moto(int x, int y); }
実際の画像です。左が実行後直後。右がドラグを行った直後です。
問題点&解決をしたい内容:御覧のように二重円といっても異なった二つの円が表れていないことが一つの問題です。次に色がクリック&ドラッグするたびび偏食をする(R=>G=>B=>R)ことが一度黒になるとそこで変色がおしまいになることです。
やってみた、試したこと。:まずクラスの中にchc()の自作変色関数があります、それをCircleクラスとDoublecircleクラスの中で入れ替えて見た。何も起きなかった。
もしどなたかわかる方がいっらいらっしゃればぜひ教えていただくと助かります。ありがとうございます。
自分はC言語の入門の知識を持ってます。
もし質問の内容について不足がありましたら是非コメントをください。
ありがとうございます。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。