簡體   English   中英

您可以在paintComponent中為對象添加鼠標偵聽器嗎

[英]Can you add a mouse listener to an object in paintComponent

只是一個簡單的問題,我想知道是否有任何方法可以將鼠標偵聽器添加到繪圖組件? 例如,假設你畫了一個矩形,你能不能讓它當你點擊那個矩形時,它會做一些事情。

public void paintComponent(Graphics g) {
    g.drawRect(50, 50, 20, 20);
    //Do something when this rectangle is clicked on
}

要回答您的主題問題:

您可以在paintComponent中為對象添加鼠標偵聽器嗎

是的,有點。 您不能對在paintComponent 方法中聲明的對象做任何事情,因為它們的范圍僅限於該方法,但是您可以對在paintComponent 方法中繪制的類中聲明的對象做出反應,實際上這通常是這樣做的使用實現 Shape 接口的類的對象,例如 Rectangle2D。

例如,運行此程序,然后單擊其中的形狀:

package foo1;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.Stroke;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.*;

@SuppressWarnings("serial")
public class GraphicsEg extends JPanel {
    private static final int PREF_W = 400;
    private static final int PREF_H = PREF_W;
    private static final Color SELECTED_COLOR = Color.RED;
    private static final Stroke SELECTED_STROKE = new BasicStroke(8f);
    private List<Shape> shapes = new ArrayList<>();
    private Map<Shape, Color> shapeColorMap = new HashMap<>();
    private Shape selectedShape = null;

    public GraphicsEg() {
        Shape shape = new Ellipse2D.Double(10, 10, 90, 90);
        shapeColorMap.put(shape, Color.GRAY);
        shapes.add(shape);

        shape = new Rectangle2D.Double(140, 140, 200, 200);
        shapeColorMap.put(shape, Color.BLUE);
        shapes.add(shape);

        shape = new RoundRectangle2D.Double(200, 200, 80, 80, 10, 10);
        shapeColorMap.put(shape, Color.GREEN);
        shapes.add(shape);

        addMouseListener(new MyMouseListener());
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        for (Shape shape : shapes) {
            Color color = shapeColorMap.get(shape);
            g2.setColor(color);
            g2.fill(shape);
        }

        if (selectedShape != null) {
            Graphics2D newG2 = (Graphics2D) g2.create();
            newG2.setColor(SELECTED_COLOR);
            newG2.setStroke(SELECTED_STROKE);
            newG2.draw(selectedShape);
            newG2.dispose(); // because this is a created Graphics object
        }
    }

    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        return new Dimension(PREF_W, PREF_H);
    }

    private class MyMouseListener extends MouseAdapter {
        @Override
        public void mousePressed(MouseEvent e) {
            for (int i = shapes.size() - 1; i >= 0; i--) {
                if (shapes.get(i).contains(e.getPoint())) {
                    selectedShape = shapes.get(i);
                    repaint();
                    return;
                }
            }
        }
    }

    private static void createAndShowGui() {
        JFrame frame = new JFrame("GraphicsEg");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new GraphicsEg());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM