Java 如何在JPanel中仅在指定区域识别鼠标点击?

Java 如何在JPanel中仅在指定区域识别鼠标点击?,java,swing,user-interface,Java,Swing,User Interface,我试图创建一个可以添加另一个JComponent的类,并在右上角创建一个可单击的设置图标 我喜欢添加某种ActionListener,当用户单击g.drawImage(image,getWidth()-widgetSize,0,widgetSize,widgetSize,imageObserver)的区域时,它会引发 这是解决这个问题的正确方法吗?还是有更好的方法 package de.display; import java.awt.Color; import java.awt.Graphi

我试图创建一个可以添加另一个JComponent的类,并在右上角创建一个可单击的设置图标

我喜欢添加某种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);
    }
}

最好的方法是添加一个带有给定图标和无文本(IMHO)的按钮,该按钮位于面板的给定区域。如果只想绘制图标,还可以将按钮的边框设置为null(或EmptyBorder)。对于某些L&F,还需要使用参数false调用方法
AbstractButton.setContentAreaFilled(布尔)
。 方法
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;
        }
    }
}

添加一个
鼠标侦听器
。包含所有必要的详细信息。
新的ImageIcon(“src/main/resources/Icon Settings.png”)
应用程序资源将在部署时成为嵌入式资源,因此明智的做法是现在就开始访问它们。必须通过URL而不是文件访问。有关如何形成URL的信息,请参见。