Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.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 如何确定JPanel上下一个矩形的坐标_Java_Graphics_Rect_Coordinate - Fatal编程技术网

Java 如何确定JPanel上下一个矩形的坐标

Java 如何确定JPanel上下一个矩形的坐标,java,graphics,rect,coordinate,Java,Graphics,Rect,Coordinate,我有一个对象的arraylistRecArray,每个对象包含两个int值,一个表示矩形的宽度,一个表示矩形的高度。每个矩形的高度和宽度是十的倍数。矩形必须按照RecArray中的给定顺序从左到右、从上到下传递到曲面上。我的问题是我找不到下一个矩形的x,y坐标。我想做的是,从生成第一个矩形的坐标(0,0)开始,将其添加到arraylistRecList。然后我设置x和y坐标。x变为x=x+RecArray.get(0).getLength1()+1。如果x大于jpanel曲面的宽度,则它变为0,

我有一个对象的arraylist
RecArray
,每个对象包含两个int值,一个表示矩形的宽度,一个表示矩形的高度。每个矩形的高度和宽度是十的倍数。矩形必须按照
RecArray
中的给定顺序从左到右、从上到下传递到曲面上。我的问题是我找不到下一个矩形的x,y坐标。我想做的是,从生成第一个矩形的坐标(0,0)开始,将其添加到arraylist
RecList
。然后我设置x和y坐标。x变为
x=x+RecArray.get(0).getLength1()+1
。如果x大于jpanel曲面的宽度,则它变为0,y变为
y=y+10
。从RecArray中的第二个对象开始,我尝试生成具有给定坐标以及宽度和高度的矩形。然后我尝试将它们与前面的所有矩形进行比较,看看是否有重叠。如果没有重叠,将绘制矩形,如果有重叠,rec的x坐标将变为
x=RecList.get(j).width+1
,如果超过宽度,则x变为0,y为
y=y+10
。然后,我用新的坐标重新生成当前矩形,并再次与
RecList
中的其他矩形进行比较,直到找到当前矩形的正确位置。我将非常感谢任何提示。请对我耐心点。我还在学习编程

super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;     
Rectangle rec = new Rectangle(x, y, RecArray.get(0).getWidth(),
              RecArray.get(0).getHeight());
RecList.add(rec);
recPaint(g2,RecArray.get(0)); 
x = x + RecArray.get(0).getWidth() + 1;
int i;
for (i = 1; i < RecArray.size(); i++) {
  if (x >= this.getArea().getWidth()) {
        x = 0;
        y = y + 10;
  }     
  Rectangle rec1 = new Rectangle(x, y, RecArray.get(i)
              .getWidth(), RecArray.get(i).getheight());
  for (int j= 0; j < RecList.size(); j++) {
      if (!recIntersect(rec1, RecList.get(j))) {
         RecList.add(rec1);
         recPaint(g2,RecArray.get(i));
         break;
      } 
      else {
           x = RecList.get(j).width;
           if (x >= this.getFlaeche().getLength1()) {
               x = 0;
               y = y + 10;
           }
           rec1 = new Rectangle(x, y,RecArray.get(i).  .getWidth(),  
                 RecArray.get(i).getHeight());
      }
      x = x + RecArray.get(i).getWidth();
 } 
 //With this method using the given rec parameter a rectangle  will be drawn on the g2 and filled in blue colour
private void recPaint (Graphics2D g2, RecType rec){
      g2.setColor(Color.BLUE);  
      g2.fillRect(x, y, rec.getWidth(),
      rec.getLength2());
      g2.setColor(Color.BLACK);
      g2.drawRect(x, y, rec.getHeight(),
      rec.getLength2());
}
// returns true, if two rectangles overlap
private boolean recIntersect(Rectangle rec1, Rectangle rec2) {
   if( rec1.intersects(rec2)){
         return true;
    }
    return false;
}
super.paintComponent(g);
图形2d g2=(图形2d)g;
Rectangle rec=新矩形(x,y,RecArray.get(0).getWidth(),
RecArray.get(0.getHeight());
重新登录。添加(记录);
recPaint(g2,RecArray.get(0));
x=x+RecArray.get(0.getWidth()+1;
int i;
对于(i=1;i=this.getArea().getWidth()){
x=0;
y=y+10;
}     
矩形rec1=新矩形(x,y,RecArray.get(i)
.getWidth(),RecArray.get(i.getheight());
对于(int j=0;j=this.getFlaeche().getLength1()){
x=0;
y=y+10;
}
rec1=新矩形(x,y,RecArray.get(i)…getWidth(),
RecArray.get(i.getHeight());
}
x=x+RecArray.get(i).getWidth();
} 
//使用此方法,使用给定的rec参数,将在g2上绘制一个矩形,并用蓝色填充
私有void recPaint(Graphics2D g2,rec重类型){
g2.setColor(颜色为蓝色);
g2.fillRect(x,y,rec.getWidth(),
记录getLength2());
g2.设置颜色(颜色为黑色);
g2.drawRect(x,y,rec.getHeight(),
记录getLength2());
}
//如果两个矩形重叠,则返回true
专用布尔recIntersect(矩形rec1,矩形rec2){
if(rec1.相交(rec2)){
返回true;
}
返回false;
}

编辑:显然我还没有明确说明我的问题是什么。我的问题是,我生成(x,y)的方式矩形的坐标显然是错误的。我的算法的工作方式没有得到我想要的结果。我希望我的矩形整齐地排列在彼此的旁边/上面/下面,没有重叠,但事实并非如此。

分离出矩形列表。计算X,Y坐标一次

因为我没有对象类,所以我使用了Dimension类,它包含宽度和长度。我使用Rectangle类保存最终将在Swing GUI中绘制的对象

分而治之。将您的GUI模型、视图和控制器分离出来。这样,您可以一次只关注一块拼图

下面是我在绘图区域为500400的情况下运行测试代码的结果

java.awt.Rectangle[x=0,y=0,width=100,height=100]
java.awt.Rectangle[x=100,y=0,width=20,height=10]
java.awt.Rectangle[x=120,y=0,width=40,height=20]
java.awt.Rectangle[x=160,y=0,width=60,height=40]
java.awt.Rectangle[x=220,y=0,width=80,height=60]
java.awt.Rectangle[x=300,y=0,width=20,height=10]
java.awt.Rectangle[x=320,y=0,width=120,height=110]
下面是我在绘图区域为200200的情况下运行测试代码的结果

java.awt.Rectangle[x=0,y=0,width=100,height=100]
java.awt.Rectangle[x=100,y=0,width=20,height=10]
java.awt.Rectangle[x=120,y=0,width=40,height=20]
java.awt.Rectangle[x=0,y=100,width=60,height=40]
java.awt.Rectangle[x=60,y=100,width=80,height=60]
java.awt.Rectangle[x=140,y=100,width=20,height=10]
下面是代码。我在X轴上拟合矩形,直到无法拟合另一个矩形。然后我将最大高度添加到Y,将X重置为零,重置最大高度,然后拟合下一行矩形

像我在这里做的那样创建测试应用程序,并确保在创建GUI视图和GUI控制器之前很久就可以创建GUI模型

package com.ggl.testing;

import java.awt.Dimension;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.List;

public class CalculatingRectangles {

    public static void main(String[] args) {
        CalculatingRectangles calculatingRectangles = new CalculatingRectangles();
        Dimension drawingArea = new Dimension(200, 200);

        List<Dimension> dimensions = new ArrayList<>();
        dimensions.add(new Dimension(100, 100));
        dimensions.add(new Dimension(20, 10));
        dimensions.add(new Dimension(40, 20));
        dimensions.add(new Dimension(60, 40));
        dimensions.add(new Dimension(80, 60));
        dimensions.add(new Dimension(20, 10));
        dimensions.add(new Dimension(120, 110));

        List<Rectangle> rectangles = calculatingRectangles
                .calculatingRectangles(drawingArea, dimensions);
        System.out.println(displayRectangles(rectangles));
    }

    private static String displayRectangles(List<Rectangle> rectangles) {
        StringBuilder builder = new StringBuilder();
        for (Rectangle r : rectangles) {
            builder.append(r);
            builder.append(System.getProperty("line.separator"));
        }

        return builder.toString();
    }

    public List<Rectangle> calculatingRectangles(Dimension drawingArea,
            List<Dimension> dimensions) {
        int width = drawingArea.width;
        int height = drawingArea.height;
        int x = 0;
        int y = 0;
        int index = 0;
        int maxHeight = 0;

        boolean hasRoom = dimensions.size() > index;

        List<Rectangle> rectangles = new ArrayList<>();

        while (hasRoom) {
            Dimension d = dimensions.get(index);
            maxHeight = Math.max(maxHeight, d.height);

            if ((x + d.width) <= width && (y + maxHeight) <= height) {
                Rectangle r = new Rectangle(x, y, d.width, d.height);
                x += d.width;
                rectangles.add(r);

                index++;
                if (index >= dimensions.size()) {
                    hasRoom = false;
                }

            } else {
                y += maxHeight;
                if (y > height) {
                    hasRoom = false;
                }
                x = 0;
            }

        }

        return rectangles;
    }

}
package com.ggl.testing;
导入java.awt.Dimension;
导入java.awt.Rectangle;
导入java.util.ArrayList;
导入java.util.List;
公共类计算矩形{
公共静态void main(字符串[]args){
计算矩形计算矩形=新的计算矩形();
尺寸图面积=新尺寸(200200);
列表维度=新的ArrayList();
尺寸。添加(新尺寸(100100));
尺寸。添加(新尺寸(20,10));
尺寸。添加(新尺寸(40,20));
尺寸。添加(新尺寸(60,40));
尺寸。添加(新尺寸(80,60));
尺寸。添加(新尺寸(20,10));
尺寸。添加(新尺寸(120110));
列表矩形=计算矩形
.计算矩形(绘图区域、尺寸);
System.out.println(显示矩形(rectangles));
}
私有静态字符串显示矩形(列表矩形){
StringBuilder=新的StringBuilder();
用于(矩形r:矩形){
附加(r);
append(System.getProperty(“line.separator”);
}
返回builder.toString();
}
公共列表计算矩形(尺寸绘图区域,
列表维度){
int width=绘图区域宽度;
内部高度=图纸区域高度;
int x=0;