web-dev-qa-db-ja.com

javaで破線を描く

私の問題は、パネルに破線を描きたいということです。それはできますが、境界線も破線で描きます。

誰かが理由を説明できますか? paintComponentを使用してパネルに直接描画します

これは破線を描くコードです:

public void drawDashedLine(Graphics g, int x1, int y1, int x2, int y2){
        Graphics2D g2d = (Graphics2D) g;
        //float dash[] = {10.0f};
        Stroke dashed = new BasicStroke(3, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[]{9}, 0);
        g2d.setStroke(dashed);
        g2d.drawLine(x1, y1, x2, y2);
    }
23
Trung Bún

paintComponent()に渡されるGraphicsインスタンスを変更します。これは、境界線のペイントにも使用されます。

代わりに、Graphicsインスタンスのコピーを作成し、それを使用して描画を行います。

public void drawDashedLine(Graphics g, int x1, int y1, int x2, int y2){

        //creates a copy of the Graphics instance
        Graphics2D g2d = (Graphics2D) g.create();

        //set the stroke of the copy, not the original 
        Stroke dashed = new BasicStroke(3, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[]{9}, 0);
        g2d.setStroke(dashed);
        g2d.drawLine(x1, y1, x2, y2);

        //gets rid of the copy
        g2d.dispose();
}
34
Kevin Workman

別の可能性は、スワップローカル変数で使用される値(例:色、ストロークなど)を保存し、それらを使用中のグラフィックに戻すことです。

何かのようなもの :

Color original = g.getColor();
g.setColor( // your color //);

// your drawings stuff

g.setColor(original);

これは、グラフィックスに対して行う変更を決定しても機能します。

2

ストロークを設定してグラフィックコンテキストを変更し、paintBorder()などの後続のメソッドは同じコンテキストを使用するため、行ったすべての変更を継承します。

Solution:コンテキストを複製し、ペイントに使用して、後で破棄します。

コード:

// derive your own context  
Graphics2D g2d = (Graphics2D) g.create();
// use context for painting
...
// when done: dispose your context
g2d.dispose();
2
Peter Walser