Вот сценарий: я могу нарисовать круги и прямоугольники в JFrame, и я могу выбрать их тоже (по одному или два по два).
Эти фигуры хранятся в ArrayList of Shapes (есть 3 класса, Line, Rectangle и Circle, которые расширяют суперкласс, Shape).
Работало отлично, но мне нужно добавить еще одну функцию. Когда я выбираю 2 фигуры, между ними должна быть нарисована линия, соединяющая их.
Проблема в том, что линия не рисуется, даже когда я вызываю repaint()
метод.
Коды, связанные с проблемой:
Класс Shape (суперкласс):
import java.awt.*;
import java.io.Serializable;
import java.util.HashMap;
import javax.swing.*;
import com.thoughtworks.xstream.annotations.XStreamOmitField;
public class Shape extends JPanel implements Serializable {
protected Point begin;
protected Point end;
protected int width;
protected int height;
protected int id;
@XStreamOmitField protected boolean full;
protected Color color;
protected String shape;
@XStreamOmitField protected boolean isSelected;
public int getId(){
return id;
}
public void setId(int id){
this.id = id;
}
public boolean getIsSelected(){
return isSelected;
}
public void setIsSelected(boolean isSelected){
this.isSelected = isSelected;
}
public Point getBegin() {
return begin;
}
public void setBegin(Point begin) {
this.begin = begin;
}
public Point getEnd() {
return end;
}
public void setEnd(Point end) {
this.end = end;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height){
this.height = height;
}
public boolean getIsFull(){
return full;
}
public void setFull(boolean full){
this.full = full;
}
public Color getColor(){
return color;
}
public void setColor(Color color){
this.color = color;
}
public void setShape(String shape){
this.shape = shape;
}
public String getShape(){
return shape;
}
@Override
public String toString() {
return "ID: " + getId() + java.lang.System.lineSeparator() + "Begin x: " + begin.x + java.lang.System.lineSeparator() + "Begin y: " + begin.y + java.lang.System.lineSeparator() + "End x: " + end.x + java.lang.System.lineSeparator() + "End y: " + end.y + java.lang.System.lineSeparator() + "Width: " + width + java.lang.System.lineSeparator() + "Height: " + height + java.lang.System.lineSeparator() + "Color: " + color + java.lang.System.lineSeparator() + "Shape: " + shape + java.lang.System.lineSeparator() + java.lang.System.lineSeparator();
//return "ID: " + getId() + java.lang.System.lineSeparator() + "Begin x: " + begin.x + java.lang.System.lineSeparator() + "Begin y: " + begin.y + java.lang.System.lineSeparator() + "End x: " + end.x + java.lang.System.lineSeparator() + "End y: " + end.y + java.lang.System.lineSeparator() + "Width: " + width + java.lang.System.lineSeparator() + "Height: " + height + java.lang.System.lineSeparator() + "Color: " + color + java.lang.System.lineSeparator() + "Shape: " + shape + java.lang.System.lineSeparator() + java.lang.System.lineSeparator() + "New Fields: " + newFields + java.lang.System.lineSeparator();
//return "Begin: " + getBegin() + "\nEnd: " + "\nWidth: " + getWidth() + "\nHeight: " + getHeight() + "\nFull: " + isFull() + "\nColor: " + getColor();
}
//Constructors
public Shape(Point begin, Point end, int width, int height, boolean full, Color color, String shape) {
this();
this.begin = begin;
this.end = end;
this.width = width;
this.height = height;
this.full = full;
this.color = color;
this.shape = shape;
}
public Shape(Point begin, Point end, int width, int height, boolean full, Color color, String shape, HashMap newFields) {
this();
this.begin = begin;
this.end = end;
this.width = width;
this.height = height;
this.full = full;
this.color = color;
this.shape = shape;
this.newFields = newFields;
}
public Shape(Point begin, Point end, int width, int height, boolean full, Color color, String shape, boolean isSelected) {
this();
this.begin = begin;
this.end = end;
this.width = width;
this.height = height;
this.full = full;
this.color = color;
this.shape = shape;
this.isSelected = isSelected;
}
public Shape(Point begin, Point end, int width, int height, boolean full, Color color, String shape, boolean isSelected, HashMap newFields) {
this();
this.begin = begin;
this.end = end;
this.width = width;
this.height = height;
this.full = full;
this.color = color;
this.shape = shape;
this.isSelected = isSelected;
this.newFields = newFields;
}
public Shape(Point begin, Point end, boolean full, Color color, String shape) {
this();
this.begin = begin;
this.end = end;
this.full = full;
this.color = color;
this.shape = shape;
}
public Shape(Point begin, Point end, boolean full, Color color, String shape, boolean isSelected) {
this();
this.begin = begin;
this.end = end;
this.full = full;
this.color = color;
this.shape = shape;
this.isSelected = isSelected;
}
public Shape() {
super();
setOpaque(false);
}
}
Класс линии:
import java.awt.*;
import java.io.Serializable;
public class Line extends Shape implements Serializable{
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setStroke(s);
g2d.setColor(Color.RED);
if((begin.x > end.x) && (begin.y < end.y)) {
g2d.drawLine(0, height, width, 0);
}
else if((begin.x < end.x) && (begin.y > end.y)){
g2d.drawLine(0, height, width, 0);
}
else g2d.drawLine(0, 0, width, height);
}
//Constructors
public Line() {
super();
}
public Line(Point begin, Point end, int width, int height, boolean full, Color color, String shape) {
super(begin, end, width, height, full, color, shape);
}
}
Кусок кода (рабочий), который печатает круги (внутри mouseListener):
c.setShape("Circle");
//Axis
x1 = Math.min(mousePressed.x, mouseReleased.x);
y1 = Math.min(mousePressed.y, mouseReleased.y);
begin.setLocation(x1, y1);
c.setBegin(mousePressed);
c.setEnd(mouseReleased);
c.setId(count);
c.setWidth(Math.abs(mouseReleased.x - mousePressed.x));
c.setHeight(Math.abs(mouseReleased.y - mousePressed.y));
c.setColor(choosenColor);
c.setLocation(begin);
c.setSize(c.getWidth(), c.getHeight());
c.setFull(full);
for(int i=0; i<images.size(); i++){
if(c.getBounds().intersects(images.get(i).getBounds())){
flag = false;
}
}
if(flag == true){
drawPanel.add(c);
drawPanel.repaint();
images.add(c);
colors.add(choosenColor);
count++;
}
И эта часть кода нарушена:
public void mouseClicked(MouseEvent e){
boolean found = false;
int counter = 0;
Line line = new Line();
//TRYING TO DEBUG PRINTING THE LINE, BUT IT DOES NOT PRINT
line.setColor(Color.RED);
JOptionPane.showMessageDialog(null, line);
for(int i=0; i<images.size(); i++){
//CHECKING IF CLICK IS INSIDE A SHAPE
if((images.get(i).getLocation().getX() < e.getX() && images.get(i).getLocation().getY() < e.getY() && images.get(i).getX() + images.get(i).getWidth() > e.getX() && images.get(i).getLocation().getY() + images.get(i).getHeight() > e.getY())){
images.get(i).setColor(Color.BLUE);
images.get(i).setIsSelected(true);
found = true;
}
if(images.get(i).getColor() == Color.BLUE){
counter++;
}
if(counter > 2){
images.get(i).setColor(colors.get(i));
images.get(i).setIsSelected(false);
found = false;
selectedImages.clear();
}
}
if (!found){
counter = 0;
selectedImages.clear();
for(int j=0; j<images.size(); j++){
images.get(j).setColor(colors.get(j));
images.get(j).setIsSelected(false);
}
}
repaint();
if(counter == 2){
for(Shape s : images){
if(s.getIsSelected() == true){
selectedImages.add(s);
}
}
if(selectedImages.size() == 2){
Point p1 = new Point();
Point p2 = new Point();
p1.x = selectedImages.get(0).getWidth()/2;
p1.y = selectedImages.get(0).getHeight()/2;
p2.x = selectedImages.get(1).getWidth()/2;
p2.y = selectedImages.get(1).getHeight()/2;
line.setShape("Line");
line.setBegin(p1);
line.setEnd(p2);
line.setId(count);
line.setFull(full);
line.setWidth(Math.abs(p2.x - p1.x));
line.setHeight(Math.abs(p2.y - p1.y));
line.setColor(Color.RED);
drawPanel.add(line);
repaint();
JOptionPane.showMessageDialog(null, line);
JOptionPane.showMessageDialog(null, line.toString());
}
}
selectedImages.clear();
PS: когда я печатаю line.toString (), он показывает мне все нужные атрибуты .. странно .. например:
- ID: 2
- Начало x: 68
- Начало y: 45
- Конец х: 73
- Конец у: 37
- Ширина: 5
- Высота: 8
- Цвет: java.awt.Color [r = 255, g = 0, b = 0]
- Форма: Линия
Пожалуйста, не стесняйтесь спрашивать больше кода, если я не прояснил.
Спасибо!
РЕДАКТИРОВАТЬ: Вот скриншот, который показывает именно то, что я говорю. Посмотри на красную линию. Высота и ширина верны, но начальные координаты - нет. Линия должна начинаться в центре первого выбранного прямоугольника и должна заканчиваться в центре второго выбранного прямоугольника.