2013-01-10 18 views
3

請能夠從Icon/ImageIcon偵聽MouseEvents(在API沒有實現任何通知器),而不脫離容器(JPanelJLabel)收聽或通過轉化事件通過使用SwingUtilities,執行併到添加XxxListener到普通的香草Icon/ImageIconMouseEvents和圖標/ ImageIcon的

編輯

類似的code (@pietblok),但也許沒有回答我的問題,我不知道如果創建一個圖形對象,BufferedImage的和的paintIcon是最後Ø f性質

(我看見幾個similair代碼,這是SSCCE形式)

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.image.BufferedImage; 
import java.util.Map; 
import java.util.WeakHashMap; 

import javax.swing.Icon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 

public class TestMouseAwareIcon { 

    public static class MouseAwareIcon extends MouseAdapter implements Icon { 

     private static final long serialVersionUID = 1L; 
     private int size = 80, halfSize = 40; 
     private final BufferedImage image; 
     private Map components = new WeakHashMap(); 

     public MouseAwareIcon() { 
      super(); 
      image = createImage(); 
     } 

     @Override 
     public int getIconHeight() { 
      return image.getHeight(); 
     } 

     @Override 
     public int getIconWidth() { 
      return image.getWidth(); 
     } 

     @Override 
     public void mouseClicked(MouseEvent event) { 
      Object source = event.getSource(); 
      if (source instanceof Component) { 
       Component component = (Component) source; 
       Point paintPoint = (Point) components.get(component); 
       if (paintPoint == null) { 
        System.out.println("unknown component"); 
       } else { 
        Point mousePoint = event.getPoint(); 
        int imageX = mousePoint.x - paintPoint.x; 
        int imageY = mousePoint.y - paintPoint.y; 
        if (imageX >= 0 && imageX < this.getIconWidth() && imageY >= 0 
          && imageY < this.getIconHeight()) { 
         int argb = image.getRGB(imageX, imageY); 
         int alpha = (argb << 0) >>> 24; 
         int red = (argb << 8) >>> 24; 
         int green = (argb << 16) >>> 24; 
         int blue = (argb << 24) >>> 24; 
         System.out.println("Color clicked on " 
           + component.getName() + ": " + alpha + "," 
           + red + "," + green + "," + blue); 
         int fillX = halfSize * (imageX/halfSize); 
         int fillY = halfSize * (imageY/halfSize); 
         Graphics2D g2 = image.createGraphics(); 
         g2.setColor(new Color(255 - red, 255 - green, 
           255 - blue, alpha)); 
         g2.fill3DRect(fillX, fillY, halfSize, halfSize, true); 
         g2.dispose(); 
         component.repaint(); 
        } else { 
         System.out.println("Clicked outside image area"); 
        } 
       } 
      } 
     } 

     @Override 
     public void paintIcon(Component component, Graphics g, int x, int y) { 
      ((Graphics2D) g).drawImage(image, null, x, y); 
      if (!components.containsKey(component)) { 
       component.addMouseListener(this); 
      } 
      components.put(component, new Point(x, y)); 
     } 

     private BufferedImage createImage() { 
      BufferedImage image1 = new BufferedImage(size, size, 
        BufferedImage.TYPE_INT_ARGB); 
      Graphics2D g2 = image1.createGraphics(); 
      Color[] colors = new Color[]{Color.BLACK, Color.RED, Color.GREEN, 
       Color.BLUE}; 
      int colorIndex = 0; 
      for (int x = 0; x < size; x += halfSize) { 
       for (int y = 0; y < size; y += halfSize) { 
        g2.setColor(colors[colorIndex]); 
        g2.fill3DRect(x, y, halfSize, halfSize, true); 
        colorIndex++; 
       } 
      } 
      g2.dispose(); 
      return image1; 
     } 
    } 

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

      @Override 
      public void run() { 
       final JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       JLabel label = new JLabel(new MouseAwareIcon()); 
       label.setName("label"); 
       frame.getContentPane().add(label); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     });  
    } 
} 
+2

只有兩種方法來渲染Icon/ImageIcon,可以通過附加到支持圖標渲染的組件(比如'JLabel'和/或'JButton'),或者將它繪製到自己的位置......所以不需要。 – MadProgrammer

+2

爲什麼不使用未裝飾的按鈕? –

回答

1

不,這是不可能的,你必須使用現有的JComponent喜歡的JPanel或JLabel的或實現的ad-hoc JComponent做你想做的事。