Линия соединения между фигурами находится в неправильном месте - PullRequest
0 голосов
/ 30 августа 2018

Вот сценарий: я могу нарисовать круги и прямоугольники в 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]
  • Форма: Линия

Пожалуйста, не стесняйтесь спрашивать больше кода, если я не прояснил.

Спасибо!

РЕДАКТИРОВАТЬ: Вот скриншот, который показывает именно то, что я говорю. Посмотри на красную линию. Высота и ширина верны, но начальные координаты - нет. Линия должна начинаться в центре первого выбранного прямоугольника и должна заканчиваться в центре второго выбранного прямоугольника.

An example

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...