0

私は、画像を作成しImageIconて画面に表示したJavaスイングアプリケーションを持っています。これは、URL を としてロードし、ImageIconそれを Java Swing ウィンドウにラベルとして配置することで実現しました。

ここで、他の画像と一緒に画像に「マーカー」を配置する必要があります。コンテキスト: 誰かの顔の目の写真を目の上に置きます。

私を正しい方向に向けることができる人、または作業するSSCCEコードを教えてくれる人に感謝します。

ImageIconJava Swingに「マーカー」を配置する最良の方法は何ですか?

4

1 に答える 1

1

基本的な概念は、マスター/ベース イメージとマーカーをペイントできる一時的なイメージが必要だということです。

  1. 新しい を作成しますBufferedImage。これは通常、マスター イメージと同じサイズですが、そうである必要はありません。
  2. マスター イメージをペイントします。BufferedImage
  3. にマーカーをペイントします。BufferedImage
  4. ImageIconを使用して新規作成します。BufferedImage
  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 に答える