java - 将 'markers' 放在 ImageIcon Java Swing 上的最佳方式?

标签 java swing imageicon

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

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

如果有人能够为我指明正确的方向,或者给我一些 SSCCE 代码供我使用,我将不胜感激。

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

最佳答案

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

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

enter image description here enter image description here enter image description here

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

关于java - 将 'markers' 放在 ImageIcon Java Swing 上的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13924884/

相关文章:

java - 将 AngularJS 与 JSP 页面集成

java添加dns缓存记录

java - JTree 中的桌面 View - Swing - 仅限 Windows

游戏循环的 Java TimerTick 事件

java - 为什么我的 JTable 不允许我插入 ImageIcon?

java - 将 imagicon 转换为图像

java - 当我执行 ObjectList = StringList 时 ClassCastException

java - 无法从 Sbt-Assembly 找到运行 .jar 的主类

java - JTable 和自定义 TableModel 未按预期运行

java - 在 do-while 循环中更新定时器上的 JButton