Как стереть фигуру, нарисованную на изображении? - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть изображение, и когда я щелкаю левой кнопкой, оно рисует Rectangle. Я надеваю LinkedList каждую нарисованную фигуру, чтобы потом можно было стереть ее, когда захочу (на самом деле, когда я щелкну правой кнопкой мыши). Когда вызывается метод paint() или repaint(), он должен включать или удалять форму. В том числе нормально, но не удаляя: (.

Вот краткий обзор проблемы

package classes;

import java.awt.HeadlessException;
import javax.swing.JFrame;
import views.ImagePanel;

/**
 *
 * @author Luis
 */
public class Test extends JFrame{

    private ImagePanel imgPanel;

    public Test() throws HeadlessException {

        imgPanel = new ImagePanel();
        imgPanel.addMouseListener(imgPanel);
        imgPanel.addMouseWheelListener(imgPanel);

        setTitle("Test frame");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(500, 500);

        add(imgPanel);

    }

    public static void main(String[] args) {
        Test test = new Test();
        test.setVisible(true);
    }

}

И ImagePanel class

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.LinkedList;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.LineBorder;

/**
 *
 * @author Luis
 */
public class ImagePanel extends JPanel implements MouseListener,MouseWheelListener{

    private BufferedImage imagem = null; 

    private double txi=0;   //Series of variables to do some transformations
    private double tyi=0;   //
    private double txf=0;   //
    private double tyf=0;   //

    private double final_translx=0; //
    private double final_transly=0; //

    private double zoomFactor = 1;  //

    private LinkedList<Shape> shapes; //List of all shapes added

    private boolean zoomer = false; //

    public ImagePanel() {
        //Initializing the list and doing some config.
        shapes = new LinkedList<>();

        setBorder(new LineBorder(Color.BLACK,1));
        setLayout(new BorderLayout());
        setCursor(new java.awt.Cursor(java.awt.Cursor.MOVE_CURSOR));
        try {
            //This image has 981x651, but you can replace by any other
            imagem = ImageIO.read(getClass().getResource("/sources/image.png"));
        } catch (IOException ex) {
        }
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g); //To change body of generated methods, choose Tools | Templates.

        //Doing the transformations of the jPanel inside the jFrame (possibly)
        Graphics2D panelGraphics = (Graphics2D) g;

        AffineTransform at = AffineTransform.getScaleInstance(zoomFactor, zoomFactor);
        panelGraphics.drawImage(imagem, at, this);

        //Adding shapes in the image
        Graphics2D imageGraphics = (Graphics2D)imagem.getGraphics();

        imageGraphics.setColor(Color.red);
        for (Shape s : shapes){
            //This is where i think it should overwrite all the shapes
            imageGraphics.draw(s);
        }

    }

    @Override
    public void mouseClicked(MouseEvent e) {
        if(SwingUtilities.isLeftMouseButton(e)){    
            //creating a new shape when i left click the mouse
            shapes.add(new Rectangle(Math.toIntExact((long) (e.getX()/zoomFactor-final_translx)),Math.toIntExact((long) (e.getY()/zoomFactor-final_transly)), 100, 100));
        }
        else{
            if(shapes.size()>0){
                //the part when it should remove;
                shapes.removeLast();
            }
        }
        repaint();
    }

    @Override
    public void mousePressed(MouseEvent e) {
        //Initial point to calculate the translation
        if(SwingUtilities.isLeftMouseButton(e)){
            txi = e.getX()/zoomFactor;
            tyi = e.getY()/zoomFactor; 
        }
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        if(SwingUtilities.isLeftMouseButton(e)){
            txf = e.getX()/zoomFactor;
            tyf = e.getY()/zoomFactor;
            final_translx += txf-txi;
            final_transly += tyf-tyi;
            //final translation
            repaint();
        }
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        //do nothing
    }

    @Override
    public void mouseExited(MouseEvent e) {
        //do nothing
    }

    @Override
    public void mouseWheelMoved(MouseWheelEvent e) {
        zoomer=true;
        zoomFactor += e.getWheelRotation()*0.01;
        repaint();
    }
}

Конечная цель этого состоит в том, чтобы в будущем добавлять воздушные шары и вставлять информацию в области, которые пользователь хочет! Любые идеи о том, как правильно удалить эти фигуры? Я открыт для любых других предложений!

спасибо заранее

1 Ответ

0 голосов
/ 09 апреля 2019

Самый простой способ - перекрасить (загрузить) исходное изображение, снова нарисовать все фигуры и опустить фигуру, которую вы хотите удалить.

...