2015-12-09 34 views
1

只是一個簡單的問題,我想知道是否有任何方法將鼠標監聽器添加到paint組件中?例如,假設你繪製了一個矩形,當你點擊矩形時,你可以做到這一點,它會做一些事情。您可以添加一個鼠標監聽器到paintComponent中的對象

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

回答

4

要回答你的話題的問題:

你可以添加一個鼠標監聽到的對象的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(); 
      } 
     }); 
    } 
} 
+0

感謝,這正是我想要的。我仍然需要解釋代碼以及如何將它用於我需要的內容,但這是一個非常了不起的起點。我找不到任何可用的代碼,所以這正是我所需要的。 – Ryan

+1

@Ryan:我實際上偷了代碼 - 從**自己**。 [鏈接](http://stackoverflow.com/a/31663897/522444)。 –

+1

@HovercraftFullOfEels啊,重新定義的代碼,我的存在的主食;) – MadProgrammer