2

皆さん、こんにちは、

マルチタッチスクリーン用のアニメーションキャラクターを書こうとしています。私はオブジェクトに 5 つの目を持ち、それぞれの瞳孔を別々にドラッグ アンド ドロップする必要があります。

1 つのクラスですべてを実行しようとしましたが、5 人の生徒のそれぞれにマウス ハンドラーを割り当てることが問題のようです。つまり、1 つの瞳孔を移動すると、すべての瞳孔が移動します。

それから、私は生徒だけにオーダーメイドのクラスを使用することに頼りました. 単独で使用する場合、瞳孔はドラッグ可能です。しかし、目のクラスでオブジェクトとして使用すると、瞳孔が静的になります! クリックは登録されず、マウス アクティビティは追跡されません。

チュートリアルや、マウス ハンドラーに関するその他の関連する問題を確認しましたが、進展がありませんでした。最終的にここに投稿する前に、さまざまなチュートリアルや提案からコードを何十回も変更しました。キューが見つからないアイデアはありますか? 任意のポインタをいただければ幸いです。

前もって感謝します。

PS: 私はまだ目の中の瞳孔の動きに制約を加えていないことを知っています.

メインの目のクラスのコード:

package rollEyes;

import java.awt.*;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class FiveEyes extends JPanel
{
    private static final long serialVersionUID = 1L;
    private static final int SIZE = 512;
    private int a = SIZE / 2;
    private int b = a;
    private int r = 4 * SIZE / 5;
    private int n;
int circleSize=30;
Pupil dc = new Pupil(1);

    public FiveEyes(int n) 
    {
        super(true);
        this.setPreferredSize(new Dimension(SIZE, SIZE));
        this.n = n;
    }

    @Override
    protected void paintComponent(Graphics g) 
    {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
            g2d.setRenderingHint(
            RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setColor(Color.black);
        a = getWidth() / 2;
        b = getHeight() / 2;
        int m = Math.min(a, b);
        r = 4 * m / 5;
        int r2 = Math.abs(m - r) / 2;


        int numOfEyes = 5;
    for (int i = 0; i < numOfEyes ; i++) 
            {
            Graphics2D g2d2 = (Graphics2D) g;
                double t = 2 * Math.PI * i / n;
                int x = (int) Math.round(a + r * Math.cos(t));
                int y = (int) Math.round(b + r * Math.sin(t));
                drawEyeSockets(g2d2, x,y, 2*r2,2*r2);
            }
    }


    public static void main(String[] args) 
    {
        EventQueue.invokeLater(new Runnable() 
        {
        @Override
            public void run() 
        {
                create();
            }
        });
    }

    public void drawEyeSockets(final Graphics2D g2, int x, int y, int w, int h)
    {
        g2.drawOval(x,y,w,h);
        dc.drawCircle(g2, x+12, y+12);
    }

    private static void create() 
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        FiveEyes fivey = new FiveEyes(5);
        f.add(fivey);
        f.pack();
        f.setVisible(true);
    }

}

生徒クラスのコード:

package rollEyes;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Pupil extends JPanel 
{
private static final long serialVersionUID = 1L;
int radius=50;
int x_after = 50;
int y_after = 50;
MouseHandler mh ;
private static int n =1;
public Pupil(int n) 
{
    super(true);
}

protected void paintComponent(Graphics g) 
{
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
    drawCircle(g2d,x_after,y_after); 
}

public  void drawCircle(final Graphics2D g2d, int x, int y) 
{
        g2d.setColor(Color.BLUE);
        g2d.fillOval(x, y, radius/2, radius/2);
        mh = new MouseHandler();
        this.addMouseListener(mh);
        this.addMouseMotionListener(mh);
}

private static void create() 
{
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Pupil dc = new Pupil(n);
    f.add(dc);
    f.pack();
    f.setVisible(true);
}

public static void main(String[] args) 
{
    EventQueue.invokeLater(new Runnable() 
    {
        @Override
        public void run() 
        {
            create();
        }
    });
}

private class MouseHandler extends MouseAdapter
{
    boolean circleClicked=false;
    public void mouseReleased(MouseEvent e) 
    {
        circleClicked = false;
    }   
    public void mousePressed(MouseEvent me) 
    {
            circleClicked = true;
    }
        public void mouseDragged(MouseEvent me) 
        {
            if (circleClicked) 
        {
            x_after = me.getX();
            y_after = me.getY();
            repaint();
        }
        }
    }
}
4

2 に答える 2

3

まず、このコード

    mh = new MouseHandler();
    this.addMouseListener(mh);
    this.addMouseMotionListener(mh);

一度だけ呼び出す必要があります。何百万ものマウス ハンドラーをコンポーネントに追加しています。

Pupilそして、それぞれの目に 1 つずつ、合計 5 つの のインスタンスが必要です。現時点では 1 つしかないため、もちろん、レンダリングによって得られる結果は 1 つだけです。

最後に、一度に 1 つの目だけが「アクティブ」であることを確認する必要があります (つまり、すべての目がマウス イベントを受信したり、すべてが処理したりする必要があるわけではありません)。

于 2012-08-17T12:58:10.003 に答える
3

生徒に JPanel を拡張させましたが、実際にはそうすべきではありません。代わりに、現在の Pupil クラスで学んだ概念を使用してください。つまり、可動円を描画し、それをより大きな FiveEyes クラスに拡張する方法です。今回は を作成しList<Pupil>て描画します。私の提案:

  • 瞳孔が JPanel を拡張しないようにします。代わりに、特定の場所に円を描き、その場所を変更する機械を与えてください。
  • また、contains(Point p) メソッドを指定して、円がクリックされたかどうかを認識できるようにする必要があります。これを行う 1 つの方法は、Shape オブジェクトを使用することです。または、独自のメソッドをロールすることもできます。
  • List<Pupil>実際には であるFiveEyes を与えArrayList<Pupil>、瞳孔オブジェクトで埋めます。
  • FiveEyespaintComponent(...)メソッドでは、この List を反復処理して、各生徒に自分自身を描画するように指示します。
  • FiveEyes MouseAdapter のmousePressed(...)メソッドで、瞳孔リストを反復処理して、瞳孔がクリックされたかどうかを確認します。その場合は、移動します。
  • または、Pupil BufferedImage を作成して ImageIcon に配置し、それを JLabel に配置してから、FiveEyes クラスの MouseAdapter がラベルをドラッグできるようにすることもできます。
于 2012-08-17T12:56:26.127 に答える