Я хочу нарисовать n прямоугольников на панели Swing Java.Когда я искал эту проблему, я нашел только варианты, которые требуют разделения прямоугольника (если я правильно понял).Я хочу иметь возможность устанавливать фиксированные ширину и высоту и только случайным образом выбирать координаты X и Y.Я написал некоторый код, который хорошо работает с небольшим количеством прямоугольников (<20), но как только я увеличиваю его, он перестает работать.Изображение, которое я включил, показывает, что я смог показать, какие прямоугольники пересекаются и сколько пересекаются. </p>
Это мой пользовательский интерфейс
Вот как яопределить «перестает работать»
Как видите, прямоугольники 18 и 2 перекрываются
Вот мой код для этого (только paintComponent () в JPanel):
Объяснить: правильный вход - это логическое значение, которое показывает, является ли мой Ввод правильным, и execOnce только для того, чтобы один раз запустить Код при нажатии кнопки.
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
if(!init) {
initialize();
repaint();
}
width = getWidth();
height = getHeight();
g2d.clearRect(0, 0, width, height);
g2d.drawLine(0, 0, width, 0);
if(var.correctInput && !var.exOnce) {
box = new Box[var.inputCount];
for(int i = 0; i < var.inputCount; i++){
box[i] = new Box(rng.nextInt(width - var.rectWidth), rng.nextInt(height - var.rectHeight), var.rectWidth, var.rectHeight);
for(int j = 0; j < i; j++) {
if(box[i].getRect().intersects(box[j].getRect()) ) {
box[i].setOverLap(true);
box[j].setOverLap(true);
//Here I would do something like: box[i] = new Box(random X, random Y, width, height); You get the Idea i hope ?
}
}
}
var.exOnce = true;
}
var.actualFilled = 0;
for(int i = 0; var.correctInput && i < var.inputCount; i++) {
box[i].update();
box[i].draw(g2d);
if(box[i].isFilled()) {
var.actualFilled ++;
}
}
g2d.setColor(new Color(150, 220, 255));
g2d.fillRect(0, 0, 50, 50);
g2d.setColor(Color.BLACK);
g2d.drawRect(0, 0, 50, 50);
drawMidString(g2d, Integer.toString(var.actualFilled), 25, 25, new Font("Futura", Font.PLAIN, 25));
}
И вот здесьClass Box (который в основном представляет собой класс Rectangle с некоторыми другими атрибутами, такими как цвет и т. Д.):
int x, y;
int width, height;
Rectangle rect;
boolean isHovered = false, isLeftClicked = false, isRightClicked = false, isFilled = false, isOverLap = false;
//Static
Color still = new Color(111, 111, 111);
Color hover = new Color(150, 150, 220);
Color left = new Color(255, 150, 150);
Color right = new Color(150, 255, 150);
Color currentColor = still;
Color currentHover = hover;
public void draw(Graphics2D g2d) {
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(currentColor);
if(isLeftClicked || isRightClicked || isOverLap) {
g2d.fill(rect);
g2d.setColor(still);
g2d.draw(rect);
isFilled = true;
}else {
g2d.draw(rect);
}
}
public Box(int x, int y, int width, int height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
rect = new Rectangle(this.x, this.y, this.width, this.height);
}
public void update() {
currentHover = isLeftClicked ? left : isRightClicked ? right : hover;
currentColor = isHovered ? currentHover : isLeftClicked ? left : isRightClicked ? right : isOverLap ? Color.RED : still;
isFilled = isLeftClicked || isRightClicked;
rect = new Rectangle(this.x, this.y, this.width, this.height);
}
Спасибо за помощь!