2009-08-13 6 views
3

Graphics.fillRoundRect()を使用して領域を塗りつぶしたいのですが、その中央にある矩形をにしないでください。を塗りつぶします。Javaでペイントするための「反転」クリップ領域を持つ方法はありますか?

は基本的に、100x30の成分を与え、私はサイズが80x10の10,10の矩形になるようにクリッピングを設定したいが、塗りは外側だけ矩形を80x10をエリアをペイント持っています。その理由は、内側のコンポーネント領域に影響を与えることなく塗りつぶした曲線のあるnピクセルの境界線が必要なためです。

私が今まで見ることのできる最良の方法は、10,10 90x10にクリップし、fillRoundRect()を行い、次に90,10 10x10にクリップし、fillRect()を行って右下に塗りつぶします。コーナーの上に。

単線​​の矩形を単純に塗り直すと、曲線があまり接しない(および/または周囲のピクセルに影響を及ぼすため)コーナーに「スポッティング」することになります。

EDIT:警告 - J2ME AWT(Personal Profile 1.1のCDC)とJ2SEで動作する方法が必要です。


編集:もう一つのsimilar question私は適応することができたan answerを持っています。私の状況で正しく動作するコードは自己回答として掲示されます。

+0

Do not kこれはなぜ "objective-c"タグを持っていたのですか? –

+0

@Quinn:訂正してくれてありがとう - タグフィールドに "* J2ME"と入力しましたが、タグフィールドから編集概要にタブを押すとタグと私は気付かなかった!私はタグフィールドのタブの動作が非常に迷惑な/直感的な直感的であることがわかります。 –

答えて

2

AWTクリップとしてポリゴンを使用するもう1つの問題についてはsimilar answerです。おそらくこれはJ2MEでサポートされていますか?除外する矩形の境界と描画領域の外側境界を知る必要があります。 OP FROM

 
+-------------------+ 
| clip drawing area | 
+---+-----------+ | 
| | excluded | | 
| | area | | 
| +-----------+ | 
|     | 
+-------------------+ 

EDIT。

この回答は私のために働いており、APIはJ2MEでサポートされています。もう1つの質問の答えには間違いが1つあります。囲まれたポリゴンを作成するには、外側の左上と内側の上の点を開始する必要があります。働いていた私の最終的なコードは次のとおりです。

をクリッピング形状を作成するために、私はこの方法を使用:私はグラフィックコンテキストに設定してから、私の矩形を満たし

static public Shape getOutsideEdge(Graphics gc, Rectangle bb, int top, int lft, int btm, int rgt) { 
    int         ot=bb.y   , it=(ot+top); 
    int         ol=bb.x   , il=(ol+lft); 
    int         ob=(bb.y+bb.height), ib=(ob-btm); 
    int         or=(bb.x+bb.width), ir=(or-rgt); 

    return new Polygon(
    new int[]{ ol, ol, or, or, ol, ol, il, ir, ir, il, il }, 
    new int[]{ it, ot, ot, ob, ob, it, it, it, ib, ib, it }, 
    11 
    ); 
    } 

Rectangle tmp=new Rectangle(px,py,pw,ph); 
gc.setClip(getOutsideEdge(gc,tmp,thickness,thickness,thickness,thickness)); 
gc.fillRoundRect(px,py,pw,ph,RADIUS,RADIUS); 

をし、私は各コーナーに1つのドットを塗りつぶして角を丸くした錯覚を作りました:

gc.setClip(px,py,pw,ph); 
gc.drawLine((px +thickness ),(py +thickness ),(px +thickness ),(py +thickness )); 
gc.drawLine((px+pw-thickness-1),(py +thickness ),(px+pw-thickness-1),(py +thickness )); 
gc.drawLine((px +thickness ),(py+ph-thickness-1),(px +thickness ),(py+ph-thickness-1)); 
gc.drawLine((px+pw-thickness-1),(py+ph-thickness-1),(px+pw-thickness-1),(py+ph-thickness-1)); 
1

私の答えはthisです。それは非常に似ています。

EDIT:AlphaCompositeがj2meで利用可能かどうかを確認したい場合があります。 Javaでは、アルファコンポジットモードを変更することでクリップをシミュレートすることができます(私はそのsrcInと思うところを覚えていません)、白黒領域の画像にペイントすることでクリップをシミュレートできます。あなたはそれをチェックしたいかもしれません。

+0

はい、それはJ2SEでうまくいくようですが、解決策はJ2MEのためにも動作する必要があります(私はもともと、申し訳ありませんでした)。 J2ME PP 1.1にはjava.awt.geomパッケージがありません。おとこ!それはハンドヘルドをサポートしなければならない苦痛です! –

+0

はいタグとタイトルを変更する必要があります。私が提供した質問では私の答えではないことを確認しました。多分それはあなたのために働くでしょう。 –

+0

+1私が答えを持っている同様の質問に私を向けるために、私は実際の解決策に適応することができました。 –

関連する問題