使用Java绘制多个矩形(awt)

时间:2010-01-15 19:52:53

标签: java drawing awt

这是我的代码:

class Ramka extends JFrame
    {
    public static final int SZEROKOSC = 800;
    public static final int WYSOKOSC = 600;
    Container powZawartosci = getContentPane();
    public Ramka()
        {
        setSize(SZEROKOSC, WYSOKOSC);
        setTitle("Siatka bryły by Paweł Mysior");
        }
    public void addRectangle(int startX, int startY, int sizeX)
        {
        drawRectangle rect = new drawRectangle(startX, startY, sizeX);
        powZawartosci.add(rect);
        }  

class drawRectangle extends JPanel
    {
    private int a, startX, startY;
    public drawRectangle(int startX, int startY, int a) // square
        {
        this.a = a;
        this.startX = startX;
        this.startY = startY;
        }
    public void paintComponent(Graphics g)
        {
        Rectangle2D rect = new Rectangle2D.Double(startX, startY, a, a);
        Graphics2D g1 = (Graphics2D) g;
        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);
        ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ramka.setVisible(true);
        }
    }

我想要它做的是绘制三个矩形(抛开功能和感觉这样做,我还在学习)。

但是它只绘制了最后一个,从300和300开始。我真的不了解paintComponent的事情......

提前感谢您的帮助, 保罗

2 个答案:

答案 0 :(得分:1)

我相信你要在彼此之上添加三个JPanel。这似乎是绘制矩形的奇怪方法,但是使用此设计,您需要使用LayoutManager

查看this链接,然后尝试学习。下面的代码应该可以解决这个问题。

...
Container powZawartosci = getContentPane();
public Ramka()
    {
    setSize(SZEROKOSC, WYSOKOSC);
    setTitle("Siatka bryły by Paweł Mysior");
    setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));//Only this line is inserted.
    }
public void addRectangle(int startX, int startY, int sizeX)
    {
    drawRectangle rect = new drawRectangle(startX, startY, sizeX);
    powZawartosci.add(rect);
    }  
...

JPanel衍生品中,您可以跟踪需要绘制的Rectangle。我正在编写下面的代码,所以首先检查错误。

class RectangleDrawer extends JPanel{
    ArrayList<Rectangle> rList = new ArrayList()<Rectangle>;
    public void addRectangle(Rectangle rect){
        rList.add(rect);
    }
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        for(int i=0; i<rList.size(); r++){
            g.drawRectangle(rList.get(i));
        }
    }
}

答案 1 :(得分:1)

问题主要在于你在这里使用两种不同的抽象层次。

首先,您要在JFrame中添加一个组件,这在某些方面很好。

您正在添加“DrawRectangle”实例,就像添加新按钮,标签或其他面板一样。在相同位置添加组件时会出现问题。 JFrame的主面板(内容窗格)使用"Border" layout manager,如果您不添加任何约束,则将组件置于中间。

  

为方便起见,BorderLayout解释缺少字符串规范与常量CENTER相同

alt text http://java.sun.com/javase/6/docs/api/java/awt/doc-files/BorderLayout-1.gif

所以,这一行:

powZawartosci.add(rect);

始终将您的组件添加到“中心”,覆盖前一个组件。这就是你只看到一个矩形的原因。

这里使用的第二级抽象是自己绘制组件。这是低级别的,你必须告诉组件谁绘制每一行和在哪里。

没关系,但是如果你想在同一个组件中绘制几个矩形,你必须保存每个矩形的引用(使用像列表一样的集合),然后迭代该集合并将它们全部绘制出来。

像这样:

many 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);
    }
}