Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java(awt)绘制多个矩形_Java_Drawing_Awt - Fatal编程技术网

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

使用Java(awt)绘制多个矩形,java,drawing,awt,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);

这是我的密码:

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开始。我真的不明白油漆组件的事

提前感谢您的帮助,
Paul

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

查看链接,并尝试学习。下面的代码应该可以做到这一点

...
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
导数中,可以跟踪需要绘制的
矩形。我正在自发地编写下面的代码,所以首先检查错误

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));
        }
    }
}
类矩形抽屉扩展了JPanel{
ArrayList rList=新的ArrayList();
公共void addRectangle(矩形rect){
rList.add(rect);
}
公共组件(图形g){
超级组件(g);

对于(inti=0;i来说,问题基本上是在这里使用两种不同的抽象级别

在第一个示例中,您将向JFrame添加一个组件,这在某种程度上是好的

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

为了方便起见,BorderLayout将字符串规范的缺失解释为常数中心

因此,这一行:

powZawartosci.add(rect);
始终将组件添加到“中心”,覆盖上一个。这就是为什么您只看到一个矩形

这里使用的第二个抽象层次是自己绘制组件。这是一个较低的层次,您必须告诉组件绘制每条线的人和位置

这很好,但是如果要在同一个组件中绘制多个矩形,则必须保留每个矩形的引用(使用类似列表的集合),然后迭代该集合并绘制所有矩形

像这样:

我使用了你的代码,并对其进行了修改,以反映我所说的。最终的结果是,使用相同的组件,但该组件反过来绘制所有的矩形

还请注意命名/大括号样式,虽然它不是强制性的,但在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);
    }
}
import javax.swing.*;
导入java.awt.*;
导入java.awt.geom.*;
导入java.util.*;
类Ramka扩展了JFrame{
公共静态最终int SZEROKOSC=800;
公共静态最终int WYSOKOSC=600;
容器powZawartosci=getContentPane();
DrawRectangle矩形=新的DrawRectangle();
公共拉姆卡(){
设置大小(SZEROKOSC、WYSOKOSC);
片名(“PawełMysior的Siatka bryły”);
添加(新的JLabel(“正在显示多个矩形”)、BorderLayout.NORTH;
添加(矩形);
}
公共void addRectangle(int-startX、int-startY、int-sizeX){
this.rectangle.addRectangle(startY、startY、sizeX);
}
}  
类DrawRectangle扩展了JPanel{
私有java.util.List方块;
//私人INTA、startX、startY;
公共提款权(){
squares=新的ArrayList();
}
公共void addRectangle(intstartx,intstarty,inta){//square
添加(新矩形2D.Double(startX,startY,a,a));
//这个a=a;
//this.startX=startX;
//this.startY=startY;
}
公共组件(图形g){
图形2d g1=(图形2d)g;
用于(矩形2D矩形:正方形){
g1.绘制(rect);
}
}
}
公共班机{
公共静态void main(字符串[]args){
拉姆卡拉姆卡=新拉姆卡();
//ramka.addRectangle(20020050);
//ramka.addRectangle(100100100);
//ramka.addRectangle(300300150);
对于(int i=0;i<20;i++){
ramka.addRectangle(i*10,i*10,i*20);
} 
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ramka.setVisible(真);
}
}

好的,假设我只想画这三个矩形,不一定要用JPanel,那么你会推荐什么?我能在一个JPanel中画三个矩形吗?是的,你可以在一个JPanel上画任何东西。我会编辑我的帖子来更好地解释。谢谢,我想我知道我做错了什么。再次感谢;]