2012-02-22 10 views
2

JComponentを拡張してmouseListenerを実装したいBallクラスがあります。mouselistenerで動作するようにJavaコンポーネントを定義する方法

public class Ball extends JComponent implements MouseListener { 
    Int x, y, radius; 

    public Ball(int X, int Y, int Radius){ 
     //contains only three ints and redefines x,y,radius 
     x=X; 
     y=Y; 
     radius=Radius; 
    } 

    public void draw(Graphics g){ 
     //draw oval using x,y,radius 
    } 

    //5 mouselisteners undefined yet 
} 

ボールは、フレーム内にあるパネルによって使用されるコンストラクタです。

申し訳ありませんすべてのコードを入力していません。すぐに完全なコードを提出します。

私は、マウスがコンポーネント(ボール/楕円形)に入ったときに、ボールクラスでMouseEnteredリスナーを使用する必要があります。 しかし、私はそれが入力されていることを知るようにコンポーネントを定義する方法を知らない。 いくつかのディメンションが必要ですか?私がやっているのは、パネルの描画機能を使用しているからです。

+0

で見つけることができます)。コンストラクタ内の変数代入は依然として間違っているか、少なくとも意味が分かりません(X = x)。コードを再訪してください! – home

+0

申し訳ありません私は自分の電話でコードを入力していました。 – SoluableNonagon

答えて

3

これは私のクラスだったら、私はそれはJComponentのを拡張し、私は単一のJComponent内の複数のボールを表示したい場合は特にそれをのMouseListenerかのMouseMotionListenerを与えないだろう持っていません。代わりに、他のクラスが境界を取得できるようにするパブリックメソッド(Shapeインターフェイスから利用可能なものなど)と、シェイプに何かが含まれているかどうか(シェイプインターフェイスがうまく機能するかどうかなど)外部クラスがこのオブジェクトの状態(外観?)を変更できるようにするメソッド

私はその後のJComponentは、1つのボールまたはArrayList<Ball>を保持し、このJComponentのためのMouseListener /のMouseMotionListener/MouseAdapterの中で、マウスはどんなボールの内側にある場合に見ArrayList<Ball>を反復処理し、そうであれば、そのボールのを変更する必要があります状態。その後、JComponentのpaintComponentメソッドで、ArrayList<Ball>draw(g)を呼び出すことで、各ボールを繰り返し処理します。

+0

この度はありがとうございますが、私はすでに別のクラスでモーションリスナーで座標を読み取ってボールを修正することで、そのようにできました。 – SoluableNonagon

+0

しかし、ボールをコンポーネントとして定義する必要があり、マウスリスナーが必要で、ボールがマウスに入ったときにボールを再描画する必要があります。私はもはやモーションリスナーを使用することはできません。 – SoluableNonagon

+0

それでは、どのようにして境界を定義できますか? – SoluableNonagon

1

あなたは、コンストラクタで

this.addMouseListener(new MouseAdapter() { 
    .... 
}); 

を呼び出す必要があります。アダプターの内側にmouseEntered()mouseExited()を上書きします。

0

MouseListener全体を実装することをお勧めします。ボールコンポーネントをクリックして移動させるなど、ボールコンポーネントから後で多くのものを必要とする可能性もあります。インターフェイスを実装する場合は、後で変更する場合に適用されます。

import java.awt.Graphics; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 

import javax.swing.JComponent; 

public class Ball extends JComponent implements MouseListener { 
    int x, y, radius; 

    public Ball(int x, int y, int radius){ 
    //contains only three ints and redefines x,y,radius 
    this.x= x; 
    this.y= y; 
    this.radius= radius; 
} 

public void draw(Graphics g){ 
    //draw oval using x,y,radius 
} 

@Override 
public void mouseClicked(MouseEvent arg0) { 


} 

@Override 
public void mouseEntered(MouseEvent arg0) { 
    //your code to do things, when the mouse entered your ball   
} 

@Override 
public void mouseExited(MouseEvent arg0) { 


} 

@Override 
public void mousePressed(MouseEvent arg0) { 


} 

@Override 
public void mouseReleased(MouseEvent arg0) { 


} 

}

+0

ところで、これには別の利点があります。 「ボール」コンポーネントのサブクラスがある場合(「回転ボール」など)。既存のボールクラスを簡単に拡張し、MouseListenerの動作をオーバーライドすることができます。 –

0

すでにホバークラフト・フル・オブ・ウールズの発言のほかに、私はあなたがリスナーであるという概念を混乱させ、リスナーを何かに追加すると思います。

MouseListenerこれらのメソッドが呼び出されるわけではありません。リスナーは利害関係者であり、関心のあるオブジェクトにリスナーを追加します。したがって、この場合はクラスにを追加する必要があります。これはBallクラスにMouseListenerを実装させることとはまったく異なります。お使いのバージョンでは、単に '国民対(「公開」がコンパイルされませんように私は少しあなたのコードをフォーマットし

詳しい情報はWikipedia: Observer patternで見つけることができるか、よりシンプルかつよりスイング指向のドキュメントはSwing tutorials