如何在只有指定区域的JPanel中记录鼠标点击?

问题描述:

我尝试创建一个可以添加另一个JComponnent并在右上角创建可点击的设置图标的类。如何在只有指定区域的JPanel中记录鼠标点击?

我喜欢添加某种ActionListener,当用户点击g.drawImage(image, getWidth() - widgetSize, 0, widgetSize, widgetSize, imageObserver)的区域时引发。

这是解决此问题的正确方法吗?或者有更好的方法吗?

package de.display; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.event.ActionListener; 
import java.awt.image.ImageObserver; 

import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JLayeredPane; 
import javax.swing.JPanel; 

public class JWidget extends JPanel { 

    private int widgetSize = 50; 
    private boolean showWidgetIcon = true; 

    Image image; 
    ImageObserver imageObserver; 

    public JWidget() { 
     this(new ImageIcon("src/main/resources/Icon-Settings.png")); 
    } 

    public JWidget(String filename) { 
     super(); 
     ImageIcon icon = new ImageIcon(filename); 
     image = icon.getImage(); 
     imageObserver = icon.getImageObserver(); 
    } 

    public JWidget(ImageIcon icon){ 
     super(); 
     image = icon.getImage(); 
     imageObserver = icon.getImageObserver(); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     if(showWidgetIcon) 
     { 
      g.drawImage(image, getWidth() - widgetSize, 0, widgetSize, widgetSize, imageObserver); 
     } 
    } 

    public int getWidgetSize() { 
     return widgetSize; 
    } 

    public void setWidgetSize(int widgetSize) { 
     this.widgetSize = widgetSize; 
    } 

    public void setImageIcon(ImageIcon icon) { 
     image = icon.getImage(); 
     imageObserver = icon.getImageObserver(); 
    } 

    public boolean isWidgetIconVisible() { 
     return showWidgetIcon; 
    } 

    public void setShowWidgetVisibility(boolean showWidgetIcon) { 
     this.showWidgetIcon = showWidgetIcon; 
    } 

    public void addPressSettingsActionListener(ActionListener actionListener) 
    { 
     listenerList.add(ActionListener.class, actionListener); 
    } 
} 
+0

添加'MouseListener'。 ['MouseEvent'](http://docs.oracle.com/javase/8/docs/api/java/awt/event/MouseEvent.html)包含所有必要的细节。 –

+0

'新的ImageIcon(“src/main/resources/Icon-Settings.png”)应用程序资源在部署时将成为嵌入式资源,所以现在开始访问它们是明智的。 [tag:embedded-resource]必须通过URL而不是文件访问。请参阅[信息。页面为嵌入式资源](http://*.com/tags/embedded-resource/info)如何形成的URL。 –

最好的办法是用给定的图标和没有文本(IMHO),其被放置在板的给定区域中添加一个按钮。如果您只想绘制图标,也可以将按钮的边框设置为空(或EmptyBorder)。对于某些L & F,您还需要调用参数为false的方法AbstractButton.setContentAreaFilled(boolean)。 方法addActionListener可以将呼叫转发到所附按钮的相应方法。

这里是我的代码

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.event.ActionListener; 

import javax.swing.Icon; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JPanel; 
import javax.swing.plaf.basic.BasicButtonUI; 

public class JWidget extends JPanel { 

    private boolean showWidgetIcon = true; 

    private BasicButton button = new BasicButton(null, 50); 

    public JWidget() { 
     this(new ImageIcon("src/main/resources/Icon-Settings.png")); 
    } 

    public JWidget(String filename) { 
     super(new BorderLayout()); 

     ImageIcon icon = new ImageIcon(filename); 
     button.setIcon(icon); 
     initLayout(); 
    } 

    public JWidget(ImageIcon icon) { 
     super(new BorderLayout()); 
     button.setIcon(icon); 
     initLayout(); 
    } 

    private void initLayout() { 
     removeAll(); 
     if (showWidgetIcon) { 
      JPanel rightLayoutPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 0, 0)); 
      add(rightLayoutPanel, BorderLayout.NORTH); 
      rightLayoutPanel.add(button); 
     } 
    } 

    public int getWidgetSize() { 
     return button.getButtonSize(); 
    } 

    public void setWidgetSize(int widgetSize) { 
     button.setButtonSize(widgetSize); 
     revalidate(); 
     repaint(); 
    } 

    public void setImageIcon(ImageIcon icon) { 
     button.setIcon(icon); 
    } 

    public boolean isWidgetIconVisible() { 
     return showWidgetIcon; 
    } 

    public void setShowWidgetVisibility(boolean showWidgetIcon) { 
     this.showWidgetIcon = showWidgetIcon; 
     initLayout(); 
    } 

    public void addActionListener(ActionListener al) { 
     button.addActionListener(al); 
    } 

    private static class BasicButton extends JButton { 
     private int buttonSize; 

     /** 
     * 
     */ 
     public BasicButton(Icon anIcon, int aSize) { 
      super(anIcon); 
      buttonSize = aSize; 
     } 

     @Override 
     public void updateUI() { 
      setUI(new BasicButtonUI()); 
      setBorder(null); 
      setContentAreaFilled(false); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(buttonSize, buttonSize); 
     } 

     public int getButtonSize() { 
      return buttonSize; 
     } 

     public void setButtonSize(int size) { 
      this.buttonSize = size; 
     } 
    } 
}