2

初心者として、フレーム内にグラフィカルな形状を追加したいときはいつでも、次のようにします。

public void paintComponent(Graphics g) {
    super.paintComponent(g); 
    g.fillRect(0, 0, 10, 10);
    g.fillOval(10,10,10,10);
}

フレーム内に無制限の数の図形を自動的に描画するにはどうすればよいですか? 上記の方法に従えば、限られた数の形状 (Rect、Oval など) しかありません。

たとえば、メソッドaddStuff(x, y)が呼び出されるたびに、座標 x と y に自動的に "Stuff" を描画し、paintComponent手動で内部を再度編集する必要はありません。

以前は acm パッケージでこれを行っていましたが、簡単でした。以下のコードのように。

for (int i = 0; i < NCIRCLES; i++) {
    double r = rgen.nextDouble(MIN_RADIUS, MAX_RADIUS);
    double x = rgen.nextDouble(0, getWidth() - 2 * r);
    double y = rgen.nextDouble(0, getHeight() - 2 * r);
    GOval circle = new GOval(x, y, 2 * r, 2 * r);
    circle.setFilled(true);
    circle.setColor(rgen.nextColor());
    add(circle);
}

上記のように、好きなだけ円を追加できます。これを説明するにはページが必要になることはわかっていますが、acm パッケージに依存せずに上記のコードに似たものを作成する方法について簡単に説明したいと思います。

4

2 に答える 2

2

この動作を定義するには、抽象クラスを使用します。

abstract class OpalDraw {
    protected int x1, y1, x2, y2;
    protected OpalDraw(int x1, int y1, int x2, int y2) {
        this.x1 = x1;
        this.y1 = y1;
        this.x2 = x2;
        this.y2 = y2;
    }
    abstract public void draw(Graphics g);
}

class OpalOval {
    public OpalOval(int x1, int y1, int x2, int y2) { super(x1,y1,x2,y1); }
    public void draw(Graphics g) {
        g.drawOval(x1,y1,x2,y1);
    }
}

class OpalRect {
    public OpalRect(int x1, int y1, int x2, int y2) { super(x1,y1,x2,y1); }
    public void draw(Graphics g) {
        g.drawRect(x1,y1,x2,y1);
    }
}

次に、ペイントコンテナに入れることができます

addOval(int x1, int y1, int x2, int y2) {
    myDraws.add(new OpalOval(x1,x2,y1,y2);
}

addRect(int x1, int y1, int x2, int y2) {
    myDraws.add(new OpalRect(x1,x2,y1,y2);
}

その後、後で内部で次のpaintComponent(Graphics)ことができます

for(OpalDraw draw : myDraws) draw.draw(g);
于 2011-08-30T17:03:29.140 に答える
1

を拡張するクラスJFrameで、次のようなプライベートメンバーを追加します

private ArrayList<Shape> shapes = new ArrayList<Shape>();

そしてあなたの方法、例えば

public void addRectangle(int x, int y, int with, int height) {
    shapes.add(new Rectangle(x, y, width, height));
}

次に、あなたのpaintBackground方法では、次のようなものがあります

public void paintComponent(Graphics g) {
    super.paintComponent(g); 

    for (Shape shape : shapes) {
        if (shape instanceof Rectangle2D) {
            g.drawRect(shape.getX(), shape.getY(), shape.getWidth(), shape.getHeight());

        } else if (shape instanceof Ellipse2D) {
            // ...
        } // else if ...
            // etc.
    }
}

初心者として、これはかなり理解しやすいはずです。さらに良い解決策はMyShape、メソッドを使用してカスタム形状インターフェース (つまり ) を持ち、そのインターフェース ( 、など)draw(Graphics g)から形状を実装することです。次に、あなたがなることができ、あなたのメソッドは非常にアイテムのメソッドを呼び出すだけです.Circle implements MyShapeSquare implements MyShapeArrayList<Shape> shapesArrayList<MyShape> shapespaintBackgrounddrawMyShape

于 2011-08-30T17:04:56.907 に答える