- ベストアンサー
パネルを透かせることってできますか?
メインパネルAには絵が貼り付けてあります。 メインパネルAの上にパネルBを貼り付けてそこに丸い絵を貼り付けます。その時、四角いパネルBに丸い絵を張るので角を透かせる必要があります。丸いパネルを使えれば問題ないのですが、そんな事は無理だと思ったので・・・ じゃあ透かせばいいのでは?と無い頭で考えました。 できますか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
「きちんとした丸」というのは、幾何学的というか、 「形に規則のない図形」という意味です。 ですから、もちろん楕円もOKですよ。 ちなみに、楕円の場合は、 new Ellipse2D.Double(0.0, 0.0, 50.0, 50.0); の引数を変えればOKです。 ここの引数で与えられた座標の矩形に接する形の楕円となります。
その他の回答 (5)
- ngsvx
- ベストアンサー率49% (157/315)
一応、出来そうなのでご回答します。 その前に、クリッピングという言葉はご存じでしょうか? ある領域を指定して、その領域内だけを描画の対象にする処理です。 今回はこのクリッピングを使いたいと思います。 package xxx; import java.awt.*; import java.awt.geom.*; public XCanvas extends Canvas { private Image img; public void paint(Graphics g){ /*クリッピング領域の作成 領域のサイズは、画像に合わせてください。 */ Shape sp = new Ellipse2D.Double(0.0, 0.0, 50.0, 50.0); /*クリッピングの設定*/ g.setClip(sp); /*画像表示*/ g.drawImage(img, 0, 0, null, null); /*クリッピングの解除*/ g.setClip(null); } public XCanvas(){ /*画像の読み込み(アプリケーションの場合) ここの処理はおまかせします。 */ Toolkit tk = getToolkit(); img = tk.createImage("xxx.gif"); } } 画像の丸がきちんとしたものならば、一応これでできると思います。 お試しを。
お礼
度度度々のお答え本当にありがとうございました。 お礼の返事が遅くなり大変もうしわけございません。 >その前に、クリッピングという言葉はご存じでしょうか? 知りませんでした・・・勉強不足です。 教えていただいたロジックを参考に組んでみます。 >画像の丸がきちんとしたものならば、一応これでできると思います。 きちんとした○ってのは楕円形では駄目という事でしょうか?
- ngsvx
- ベストアンサー率49% (157/315)
絵(画像)が、黒地に赤の丸ですよね? だとすると、サブパネルは関係ないですよね? メインパネル:白 サブパネル:緑 画像:黒地に赤の丸 としても、サブパネルと、画像のサイズが同じなら、 緑は絶対に見えませんね?(サブパネルが画像で上書き されるから) t-treeさんはこの状態で、黒を見せたくないということ だと思うので、やっぱりサブパネルは関係ないと思います。 それじゃ、どうするかというと、赤い丸の形に合わせて クリッピングをして、画像を貼り付けるということになると思うのですが、やったことがないので、調べてみます。 少し時間を下さい。 *赤い丸というのは、正確な丸と考えていいのでしょうか?それとも、丸に近い形の、いいかげんな形の丸でしょうか?(後者だと、結構面倒な気がします)
お礼
何度も何度も本当にありがとうございます。m(_ _)m もしも私の理解が誤っていたらすみません。 >メインパネル:白 >サブパネル:緑 >画像:黒地に赤の丸 >としても、サブパネルと、画像のサイズが同じなら、 >緑は絶対に見えませんね?(サブパネルが画像で上書き >されるから) その通りだと思います。サブパネルが緑というのはバックグラウンドカラーが緑に設定されるという意味ですよね? この際サブパネルのバックグラウンドカラーは画像がサブパネルに貼り付けられ、サブパネル自体の色は関係なくなります。 パネルって四角いじゃないですか?貼り付ける絵に合わせたパネルの形が作れれば問題ないんですけどね・・・ そりゃできませんよね・・・ 今日、同じような質問をまた出します。今度はラベルに字だけ表示する方法です。
- ngsvx
- ベストアンサー率49% (157/315)
#1,#2のものです。 すみません。質問をよく読んだら、あなたの目的は達成できなかもしれません。 前提条件を追加させてもらいます。 (条件3) ・「絵を貼り付ける」というのは、jpg等の画像を貼り付けるという意味ではない。 (解説) 私の回答は、確かにパネルの背景を透明にすることができます。 しかし、図形の丸い縁に沿ってクリッピングはしないため、 「絵」というのが画像であった場合、角の部分は透明ではないように見えてしまいます。 この場合(条件3が違う場合)、もう少しアイデアをだす必要があります。 (その場合は、また回答しますが、とりあえず・・・)
お礼
再度のお答えありがとうございました。 条件3ですが、Gifの絵をパネルに貼り付けるという意味です。 説明下手ですみません・・・ 例えば、 メインパネルは真っ黒の絵を張り。 その上にサブパネルを貼り付けます。 サブパネルには、黒地に赤の丸の絵を貼り付けます。 すると、見た目ではメインパネルの黒とサブパネルの黒地が重なって見えて、赤丸の丸いパネルが張られているように見えますよね? しかしメインパネルが白だった場合、見た目では黒地に赤の丸のパネルが見えてしまいますよね? 私がしたいのは、メインパネルが何色でも、サブパネルは赤丸だけが見えるようにしたいのです。 そこで、サブパネルの黒地(パネルの角部分)を透かせることはできないだろうか?と思い質問させていただきました。 いかがでしょう?
- ngsvx
- ベストアンサー率49% (157/315)
以下のようなクラスを定義して、 パネル2はこのクラスを使用します。 (注意)スペースには全角文字を使っています package xxxxx; import java.awt.*; public XPanel extends Panel { public void update(Graphics g){ paint(g); } }
- ngsvx
- ベストアンサー率49% (157/315)
次の前提で話を進めます。 この条件が違っている場合は、再度質問してください。 ・パネルというのは、java.awt.Panelのこと ・パネルBに貼り付けた絵は動かさない (回答) AWTのPanelには、背景を透明にする機能は用意されていません。 どうしても、透明にしたいのならupdateメソッドをオーバーライドしたクラスを 作成する必要があります。このときupdateメソッドは、子コンポーネントがないのなら paintメソッドを呼び出すだけでOKです。 (解説) java.awt.Container#updateメソッドでは、 ・背景の再描画 ・paintメソッドの呼び出し ・子コンポーネントの描画 が行われます(概略です)。 これをオーバーライドすることで、 背景の再描画をしない = 背景が透明 を実現できます。 *もし、このコンポーネント内の図形を動かす(移動なども含む)場合は、 注意が必要です。 背景の再描画が行われないため、図形を移動させると移動前の図形は 背景で塗りつぶされることがなく、そのまま残ってしまいます。
お礼
お答えありがとうございました。 ご提示してくださった条件は当てはまっております。 >updateメソッドをオーバーライドしたクラスを作成 具体的にどのようにすればよいのでしょう?すみません、初心者なもので。
お礼
度々度々度々ありがとうございました。テストしてみます。こんなに助けていただいたのにポイントを送るだけとは申し訳ないです・・・ 本当にありがとうございました。