2010-01-07 2 views
2

Я пытаюсь использовать Java2D для выполнения простого программирования графики. Я начал легко, просто пытаясь отобразить пару кругов в JFrame. Мне удалось отобразить один круг, но при добавлении второго круга отображается только последний круг, добавленный в JFrame. Я использую класс Circle для определения моего круга и переопределения метода paintComponent, используемого для его отображения. Любые предложения о том, что я могу делать неправильно, будут очень признательны. Код для моих классов Circle и DancingCircles приведен ниже для справки.Рисование нескольких кругов с помощью Java2D

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 
} 

Спасибо!

Paul

ответ

0

Вы реализуете каждый круг как JPanel. С помощью LayoutManager по умолчанию BorderLayout JFrame может удерживать только один компонент за раз, когда вызывается с add(circle). Когда вы добавляете второй круг, первый из них удаляется.

Чтобы решить эту проблему, вы можете реализовать класс MultiCircle, который рисует несколько кругов и только один раз добавляет его в JFrame.

+0

Спасибо за объяснение. Это имеет смысл сейчас! Paul – Paul

0

Я не уверен, что вы действительно хотите, чтобы ваши круги были JPanels. Они действительно должны выглядеть как

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

Тогда есть JComponent, который имеет кучу кругов, и положить, что в вашем JFrame.

Сказав это, если вы должны сделать это так, как вы его получили, тогда вы должны установить для макета JPrame contentPane значение null и убедиться, что ваши круги не непрозрачны. Вам также придется вручную изменять размер каждого круга, чтобы он соответствовал его контейнеру.

+0

Хорошие баллы также! Спасибо за вашу помощь! Paul – Paul

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); 
     } 
    } 
} 
+0

Спасибо! Теперь я вижу ошибку моих путей! Спасибо за вашу помощь. Paul – Paul

Смежные вопросы