Проблема в основном в том, что вы используете два разных уровня абстракции здесь.
Во-первых, вы добавляете компонент в свой JFrame, что в какой-то момент нормально.
Вы добавляете свой экземпляр DrawRectangle, точно так же, как вы добавляете новую кнопку, метку или другую панель. Проблема возникает, когда вы добавляете компоненты в одну и ту же позицию. Главная панель JFrame (панель содержимого) использует Менеджер макета «Граница» , который помещает компонент в середину, если вы не добавляете никаких ограничений.
Для удобства BorderLayout интерпретирует отсутствие спецификации строки так же, как константа CENTER
Итак, эта строка:
powZawartosci.add(rect);
Всегда добавляет ваш компонент в «центр», переопределяя предыдущий. Вот почему вы видели только один прямоугольник.
Второй уровень абстракции, используемый здесь, это рисование компонента самостоятельно. Это низкий уровень, и вы должны указать компоненту, кто и где будет рисовать каждую линию.
Это нормально, но если вы хотите нарисовать несколько прямоугольников в одном и том же компоненте, вы должны хранить ссылки для каждого из них (используя коллекцию, подобную списку), а затем выполнить итерацию этой коллекции и нарисовать их все.
Как это:
много http://img40.imageshack.us/img40/8125/capturadepantalla201001nd.png
Я взял твой код и изменил его, чтобы отразить то, что я говорю. В конечном результате используется тот же компонент, но этот компонент, в свою очередь, рисует все прямоугольники.
Обратите внимание также на стиль именования / фигурных скобок, хотя он не является обязательным, он распространен при программировании на Java
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
import java.util.*;
class Ramka extends JFrame {
public static final int SZEROKOSC = 800;
public static final int WYSOKOSC = 600;
Container powZawartosci = getContentPane();
DrawRectangle rectangle = new DrawRectangle();
public Ramka() {
setSize(SZEROKOSC, WYSOKOSC);
setTitle("Siatka bryły by Paweł Mysior");
powZawartosci.add( new JLabel("Several rectangles are being displayed"), BorderLayout.NORTH );
powZawartosci.add(rectangle);
}
public void addRectangle(int startX, int startY, int sizeX) {
this.rectangle.addRectangle( startY, startY, sizeX );
}
}
class DrawRectangle extends JPanel {
private java.util.List<Rectangle2D> squares;
//private int a, startX, startY;
public DrawRectangle(){
squares = new ArrayList<Rectangle2D>();
}
public void addRectangle(int startX, int startY, int a) { // square
squares.add( new Rectangle2D.Double(startX, startY, a, a) ) ;
//this.a = a;
//this.startX = startX;
//this.startY = startY;
}
public void paintComponent(Graphics g) {
Graphics2D g1 = (Graphics2D) g;
for( Rectangle2D rect : squares ) {
g1.draw(rect);
}
}
}
public class Main {
public static void main(String[] args) {
Ramka ramka = new Ramka();
//ramka.addRectangle(200, 200, 50);
//ramka.addRectangle(100, 100, 100);
//ramka.addRectangle(300, 300, 150);
for( int i = 0 ; i < 20 ; i++ ){
ramka.addRectangle( i * 10 , i * 10 , i * 20 );
}
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ramka.setVisible(true);
}
}