如何在只有指定区域的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);
}
}
答
最好的办法是用给定的图标和没有文本(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;
}
}
}
添加'MouseListener'。 ['MouseEvent'](http://docs.oracle.com/javase/8/docs/api/java/awt/event/MouseEvent.html)包含所有必要的细节。 –
'新的ImageIcon(“src/main/resources/Icon-Settings.png”)应用程序资源在部署时将成为嵌入式资源,所以现在开始访问它们是明智的。 [tag:embedded-resource]必须通过URL而不是文件访问。请参阅[信息。页面为嵌入式资源](http://*.com/tags/embedded-resource/info)如何形成的URL。 –