java - 如何为 jLabel 图标的某个区域(知道坐标)着色
问题描述
我已经在 jFrame 上将 png 图像设置为 jLabel 图标,但我想为图片的某些部分着色。我能做些什么?
代码片段(jFrame 上的 jLabel):
private javax.swing.JLabel jLabel2;
jLabel2 = new javax.swing.JLabel();
jLabel2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/planimavo/planimetrie/Planimetria AVO piano terra 2017-1.png"))); // NOI18N
jLabel2.setText("jLabel2");
jLabel2.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jLabel2MouseClicked(evt);
}
});
解决方案
您需要一个特殊的图标实现。这是一个示例,如何在鼠标单击点处绘制正方形。(左键单击 - 在鼠标单击点绘制白色矩形,右键单击 - 停止绘制白色矩形)。
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
/**
* <code>OverlayIconExample</code>.
*/
public class OverlayIconExample {
private static final int OVERPAINT_RECT_SIZE = 100;
private final Icon icon = new ImageIcon("C:\\Users\\Public\\Pictures\\Sample Pictures\\Koala.jpg");
private final OverpaintIcon overIcon = new OverpaintIcon(icon);
public static void main(String[] args) {
SwingUtilities.invokeLater(new OverlayIconExample()::startUp);
}
private void startUp() {
JFrame frm = new JFrame("Icon overpaint");
JLabel label = new JLabel(overIcon);
label.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
overIcon.setPoint(e.getPoint());
} else {
overIcon.setPoint(null);
}
label.repaint();
}
});
frm.add(label);
frm.pack();
frm.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frm.setLocationRelativeTo(null);
frm.setVisible(true);
}
private static class OverpaintIcon implements Icon {
private final Icon backgroundIcon;
private Point point;
/**
* @param backgroundIcon
*/
public OverpaintIcon(Icon backgroundIcon) {
this.backgroundIcon = backgroundIcon;
}
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
backgroundIcon.paintIcon(c, g, x, y);
g.setColor(Color.WHITE);
if (point != null) {
g.fillRect(point.x, point.y, OVERPAINT_RECT_SIZE, OVERPAINT_RECT_SIZE);
}
}
@Override
public int getIconWidth() {
return backgroundIcon.getIconWidth();
}
@Override
public int getIconHeight() {
return backgroundIcon.getIconHeight();
}
public Point getPoint() {
return point;
}
public void setPoint(Point point) {
this.point = point;
}
}
}
推荐阅读
- arrays - 数组中出现错误,R中未使用的参数
- javascript - 如何区分用户点击和 .click()?
- python - 树莓派上的闪屏显示错误
- api - 如何在golang中通过重定向发送cookie?
- python - 如何创建 Matplotlib 轴的新实例?
- c# - Custom web app login page using ADAL.net to validate Azure AD credentials
- r - 将所有分类变量的缺失替换为“无”
- matlab - 使用drawfreehand绘制感兴趣区域后如何裁剪图像?
- javascript - 为什么 React 随机(看起来)重新加载缓存的图像?
- ambari - 通过 Ambari 安装 Ranger 数据库时,“不允许主机 'xxxx 连接到此 MySQL 服务器”