Как сделать так, чтобы фигура появлялась поверх изображения при нажатии мыши - PullRequest
2 голосов
/ 20 ноября 2011

Я стремлюсь к появлению прямоугольника при щелчке мыши. Вот фрагмент моего текущего кода:

    try{
            image = ImageIO.read(file);
            g.setColor(new Color(255,0,0));
            g.drawRect(x, y, 100, 100);
            }

    icon = new ImageIcon(image);
    label = new JLabel(icon);
    label.addMouseListener(this);

     public void mouseReleased(MouseEvent event) {
            // TODO Auto-generated method stub

            if(event.getSource() == label){

                x = event.getX();
                y = event.getY();

                repaint();

                input = JOptionPane.showInputDialog("Something:");
                System.out.println(input);
            }
        }

1 Ответ

3 голосов
/ 20 ноября 2011

Вы можете расширить JPanel для выполнения именно того, что вы хотите:

class MyPanel extends JPanel{
    //....
    private java.awt.Rectangle rectangle = null;
    private Image imageToDraw;
    private Point imageLocation;
    public setImageToDraw(Image toDraw,Point p){
      imageToDraw=toDraw;
      imageLocation = p;
    }
    public void setRectangle(java.awt.Rectangle rectangle overlayRect){
       rectangle = overlayRect;
    }
    // Override paintComponent to draw image and rectangle
    @Override
    public void paintComponent(Graphics g) {
      g.drawImage(imageToDraw,imageLocation.getX(),imageLocation.getY(),this);
      if(rectangle != null) {
         // Draw your rectangle here...
      }
    }
}

В вашем прослушивателе мыши выполните следующие действия:

// Declare a field of type MyPanel
private MyPanel drawingPanel = new MyPanel
// ... Initialization stuff...
drawingPanel.setImageToDraw(toDraw,p);
public void mouseReleased(MouseEvent event) {
        // TODO Auto-generated method stub
        if(event.getSource() == label){
           // Compute rectangle boundaries
           drawingPanel.setRectangle(overlayRect);
        }
        drawingPanel.repaint();
}

По существу, объект MyPanel будетвсегда есть изображение для рисования.Таким образом, изображение постоянно отображается на панели.Если вам нужен оверлейный прямоугольник, все, что вам нужно сделать, это установить поле MyPanel.rectangle и обновить ваш экземпляр MyPanel.Это сначала перерисовает изображение, а затем нарисует оверлейный прямоугольник поверх изображения.

...