У меня есть изображение, и когда я щелкаю левой кнопкой, оно рисует 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();
}
}
Конечная цель этого состоит в том, чтобы в будущем добавлять воздушные шары и вставлять информацию в области, которые пользователь хочет!
Любые идеи о том, как правильно удалить эти фигуры?
Я открыт для любых других предложений!
спасибо заранее