Java 如何确定JPanel上下一个矩形的坐标
我有一个对象的arraylistJava 如何确定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,
RecArray
,每个对象包含两个int值,一个表示矩形的宽度,一个表示矩形的高度。每个矩形的高度和宽度是十的倍数。矩形必须按照RecArray
中的给定顺序从左到右、从上到下传递到曲面上。我的问题是我找不到下一个矩形的x,y坐标。我想做的是,从生成第一个矩形的坐标(0,0)开始,将其添加到arraylistRecList
。然后我设置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;