使用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上画任何东西。我会编辑我的帖子来更好地解释。谢谢,我想我知道我做错了什么。再次感谢;]