2012-01-16 1 views
0

どのようにして(丸い四角形のような)図形をコンポーネントに型変換できますか?型をJavaのコンポーネントにキャストしますか?

+0

私は質問が意味をなさないと思います...または少なくとも私はそれを理解しません。 –

+0

ああ...できない? – mre

+0

コンポーネント(JPanelのような)の図形をペイントすることができます。 – LazyCubicleMonkey

答えて

1

キャスティングは、オブジェクトの参照を別の表現に変更するだけで、異なるタイプのオブジェクトに変換したりオブジェクトを変更することはありません。いくつかの作られたクラスで例を与える

、すでに実際にその形状のときに限り、広場に図形をキャストすることができ広場です。

Shape shape = new Square(); 
Square square = (Square) s; // this will be okay! 

これはちょうどに関連付けられているオブジェクトの既存の余分な動作を公開していますそれは正方形になり、正方形に変換されません。次の例のように、これを行うことはできません。

Shape shape = new Square(); 
Circle circle = (Circle) shape; // this will throw a ClassCastException 

形状が実際に開始する円形ではなく、あなたが潜在的に実際のために意味がありません行動(例えばgetPerimeter())をさらすことになるので基礎となるオブジェクト。

同様に、あなたのケースでは、シェイプはコンポーネントではなく、決してそのようになりません。したがって、シェイプはコンポーネントにキャストできません。この動作はShapeクラスではサポートされていないため、キャストを実行してコンポーネントに関連する動作を公開することはできません(リスナーを追加する)。シェイプクラスは、リスナーを追加することに意味があっても、インターフェイスからイベントメッセージを受け取ることはありません。コンポーネントが最初にComponentとしてインターフェイスに追加されていないためです。おそらく、図形をコンポーネントに手動で塗りつぶしているので、コンポーネント階層の一部ではないことをすでに理解しているはずです。

あなたが提案したように、これを処理する最良の方法は、既にコンポーネント内に図形が描画されていることを前提としており、関連するMouseEventのx座標とy座標がそれぞれ形状。

最初からコンポーネントとして扱いたい場合は、シェイプごとにコンポーネントを作成し、残りのインターフェイスを作成するのと同じ方法で、LayoutManagerを使用してコンテナに追加する必要があります。これは、あなたが言ったように "カスタムコンポーネント"を作成することを含みます。これは、使用する準備ができているクラスまたはメソッドではなく、コンポーネントの独自のサブクラスを作成することを意味します。コンストラクタ。 Here is an example私はあなたのニーズを満たす必要がありますラウンド、カスタムボタンのコンポーネントを作成するために見つかりました。

あなたは基本的にあなたの最後のコメントのほとんどの部分についてあなた自身の質問に答えました。これはうまくいけば理解しやすくなります:)。

乾杯、これが助けてください。

0

今後のご意見から、カスタムコンポーネントを作成したいと思っています。

ここで難しいのは、カスタムコンポーネントが本当に必要なのかどうかです。

通常は、シェイプクラスを拡張し、contains()(必要な他のメソッド)とpaint()メソッドを実装/オーバーライドするだけでよいでしょう。

次に、シェイプの配置に使用するコンテナクラス(JFame、JPanel、..)内でリスナーを設定し、shape.contains(point)を使用してイベントを処理できます。

本当にコンポーネントが必要な場合は、イベントを処理したり、他のコンポーネントやレイアウトマネージャとやりとりすることができます。

thisの例を確認できます。

関連する問題