0

我有一个 Java swing 应用程序,我在其中创建了ImageIcon一张图片并将其显示到屏幕上。我通过将 URL 加载为 anImageIcon并将其作为标签放置在 Java Swing 窗口中来做到这一点。

现在我需要用其他图像在图像上放置“标记”。在上下文中:将眼睛的照片放在某人的脸上,放在他们的眼睛上。

我很感激任何能指出我正确方向或给我一些 SSCCE 代码的人。

ImageIcon在Java Swing上放置“标记”的最佳方式是什么?

4

1 回答 1

1

基本概念是,您需要一个临时图像,您可以在其上绘制主/基本图像和标记。

  1. 创建一个新的BufferedImage. 这通常与主图像大小相同,但并非必须如此。
  2. 将主图像绘制到BufferedImage
  3. 将记号笔涂在BufferedImage
  4. 使用创建一个新ImageIconBufferedImage
  5. 应用ImageIcon到标签...

在此处输入图像描述在此处输入图像描述在此处输入图像描述

public class PaintIcon {

    public static void main(String[] args) {
        new PaintIcon();
    }

    public PaintIcon() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new PaintPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class PaintPane extends JPanel {

        private JLabel label;
        private int state = 0;

        private BufferedImage disk;
        private BufferedImage play;
        private BufferedImage pause;
        private BufferedImage stop;

        public PaintPane() {

            setLayout(new GridBagLayout());
            add((label = new JLabel()));

            try {
                disk = ImageIO.read(getClass().getResource("/cd.png"));
                play = ImageIO.read(getClass().getResource("/media_play.png"));
                pause = ImageIO.read(getClass().getResource("/media_pause.png"));
                stop = ImageIO.read(getClass().getResource("/media_stop.png"));
            } catch (Exception e) {
                e.printStackTrace();
            }

            updateState();

            label.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    state++;
                    if (state > 2) {
                        state = 0;
                    }
                    updateState();
                }
            });
        }

        protected void updateState() {
            BufferedImage base = new BufferedImage(disk.getWidth(), disk.getHeight(), BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2d = base.createGraphics();
            g2d.drawImage(disk, 0, 0, this);
            BufferedImage marker = null;
            switch (state) {
                case 0:
                    marker = stop;
                    break;
                case 1:
                    marker = play;
                    break;
                case 2:
                    marker = pause;
                    break;
            }
            int x = disk.getWidth() - marker.getWidth();
            int y = disk.getHeight() - marker.getHeight();
            g2d.drawImage(marker, x, y, this);
            g2d.dispose();

            label.setIcon(new ImageIcon(base));
        }
    }
}
于 2012-12-18T01:51:31.600 回答