Java 如何在JPanel中仅在指定区域识别鼠标点击?
我试图创建一个可以添加另一个JComponent的类,并在右上角创建一个可单击的设置图标 我喜欢添加某种ActionListener,当用户单击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
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的信息,请参见。