首页 > 解决方案 > 如何为 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);
}
});

标签: javaswing

解决方案


您需要一个特殊的图标实现。这是一个示例,如何在鼠标单击点处绘制正方形。(左键单击 - 在鼠标单击点绘制白色矩形,右键单击 - 停止绘制白色矩形)。

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;
        }

    }
}

推荐阅读