2

Java2D を使用して単純なグラフィックス プログラミングを実行しようとしています。JFrameにいくつかの円を表示しようとするだけで、簡単に始めました。1 つの円を表示することに成功しましたが、2 つ目の円を追加すると、JFrame に最後に追加された円のみが表示されます。クラス Circle を使用して円を定義し、表示に使用する paintComponent メソッドをオーバーライドします。私が間違っているかもしれないことについての提案は大歓迎です。私のクラス Circle と DancingCircles のコードは、参考のために以下に提供されています。

import java.awt.*;
import javax.swing.*;
import java.awt.geom.*;
/**
 *
 * @author Paul
 */
public class Circle extends JPanel {

// Data members for Circle center and radius
private double centerX, centerY;
private double radius;

// No-argument constructor
Circle() {
    centerX = 200;
    centerY = 200;
    radius = 10;
}

// Full-argument constructor
Circle( double x, double y, double r) {
    centerX = x;
    centerY = y;
    radius = r;
}

// Draw a Circle
protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    //Convert to Java2D Object
    Graphics2D g2 = (Graphics2D) g;

    // Create the circle
    Ellipse2D circle = new Ellipse2D.Double();
    circle.setFrameFromCenter(centerX, centerY, centerX + radius, centerY + radius);

    // Draw it
    g2.draw(circle);
}// end paintComponent

// Get/set data members
public void setCenterX(double x){this.centerX = x;}
public void setCenterY(double y){this.centerY = y;}
public void setRadius(double r){radius = r;}

public double getCenterX(){return centerX;}
public double getCenterY(){return centerY;}
public double getRadius(){return radius;}
}// end class Circle


import java.awt.*;
import javax.swing.*;

/**
 *
 * @author Paul
 */
public class DancingCircles extends JFrame{

// Display Dimensions
public static final int DEFAULT_WIDTH = 400;
public static final int DEFAULT_HEIGHT = 400;

// Default constructor
private DancingCircles() {
    setTitle("Dancing Circles");
    setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

    // Add Circles to JFrame
    Circle myCircle = new Circle(200.0, 200.0, 20.0);
    add(myCircle);          // Add circle to frame
    Circle myCircle2 = new Circle(100.0, 100.0, 30.0);
    add(myCircle2);        // Add circle to frame
}// end DancingCircles

public static void main(String[] args) {

    EventQueue.invokeLater(new Runnable()
    {
        public void run()
        {
            DancingCircles dc = new DancingCircles();
            dc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            dc.setVisible(true);
        }
    });

 }// end main
}

ありがとう!

ポール

4

3 に答える 3

5

これを行う方法は、円クラスから描画メソッドを削除し、代わりに複数の円を含む単一のパネルを作成することです。

import java.awt.*;
import javax.swing.*;
import java.awt.geom.*;
import java.util.*;

public class Circles extends JPanel
{
    ArrayList<Circle> circles = new ArrayList<Circle>();

    public void add(Circle circle) {
        circles.add(circle);
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;

        for (Circle circle: circles) {
            Ellipse2D circle2D = new Ellipse2D.Double();
            circle2D.setFrameFromCenter(
                circle.getCenterX(),
                circle.getCenterY(),
                circle.getCenterX() + circle.getRadius(),
                circle.getCenterY() + circle.getRadius());
            g2.draw(circle2D);
        }
    }
}
于 2010-01-07T20:13:03.620 に答える
0

あなたが本当にあなたのサークルをJPanelsにしたいかどうかはわかりません。彼らは本当にもっと似ているべきです

class Circle {
    double x,y,radius;
    void draw(Graphics g) {
        g.fillOval(...//etc/.
    }
}

次に、多数のCirclesを持つJComponentを作成し、それをJFrameに配置します。

そうは言っても、それを自分のやり方で行う必要がある場合は、JFrame contentPaneのレイアウトをnullに設定し、Circlesが不透明でないことを確認する必要があります。また、コンテナに合わせて各サークルのサイズを手動で変更する必要があります。

于 2010-01-07T20:08:22.113 に答える
0

各 Circle を JPanel として実装しています。BorderLayout のデフォルトの LayoutManager では、JFrame は で呼び出されたときに一度に 1 つのコンポーネントしか保持できませんadd(circle)。2 番目の円を追加すると、最初の円が削除されます。

これを解決するには、複数の円を描画する MultiCircle クラスを実装し、それを JFrame に 1 回だけ追加します。

于 2010-01-07T20:04:36.817 に答える