0

DrawingPanel に表示される Java BufferedImage があります。いわばその画像の特定の領域を「アクティブ化」して、特定のハイパーリンクが添付されたクリック可能な領域にする方法を教えてください。ありがとう。

4

1 に答える 1

1

あなたにはいくつかの選択肢があります...

  1. マップ イメージを使用して、イメージのクリック可能な場所を定義します。これには、最初の画像と同じサイズの 2 番目の画像が必要であり、実行時にクリック可能かどうかを判断できる領域がペイントされている必要があります。
  2. クリック可能な場所を表す一連の「形状」を定義します。これらは名前を付けてファイルに保存できるため、コードとは別にこれらの領域を定義できます。

次の例では、両方を使用しています。

「マスター」イメージ

ここに画像の説明を入力

「地図」イメージ

ここに画像の説明を入力

public class TestImageMap {

    private BufferedImage master;
    private BufferedImage masterMap;

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

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

                try {

                    master = ImageIO.read(getClass().getResource("/Master.png"));
                    masterMap = ImageIO.read(getClass().getResource("/MasterMap.png"));

                    JFrame frame = new JFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new GridLayout(2, 1));
                    frame.add(new MapPane());
                    frame.add(new CoordPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);

                } catch (Exception exp) {
                    exp.printStackTrace();
                    System.exit(0);
                }
            }
        });
    }

    public void sendMoney() {
        JOptionPane.showMessageDialog(null, "Sending money :D");
    }

    public void sendMoreMoney() {
        JOptionPane.showMessageDialog(null, "Sending ALL your money 8D");
    }

    public abstract class AbstractImagePane extends JPanel {

        public AbstractImagePane() {

            MouseAdapter handler = new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    doMouseClicked(e);
                }

                @Override
                public void mouseMoved(MouseEvent e) {
                    doMouseMoved(e);
                }
            };

            addMouseMotionListener(handler);
            addMouseListener(handler);
        }

        @Override
        public Dimension getPreferredSize() {
            return master == null ? super.getPreferredSize() : new Dimension(master.getWidth(), master.getHeight());
        }

        protected void doMouseClicked(MouseEvent evt) {
            if (evt.getButton() == MouseEvent.BUTTON1) {
                if (evt.getClickCount() == 1) {
                    Point p = evt.getPoint();
                    if (containsMoney(p)) {
                        sendMoney();
                    } else if (containsMoreMoney(p)) {
                        sendMoreMoney();
                    }
                }
            }
        }

        protected void doMouseMoved(MouseEvent evt) {
            Cursor cursor = Cursor.getDefaultCursor();
            Point p = evt.getPoint();
            if (containsMoney(p) || containsMoreMoney(p)) {
                cursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
            }
            setCursor(cursor);
        }

        protected abstract boolean containsMoney(Point p);
        protected abstract boolean containsMoreMoney(Point p);

        protected Point normalize(Point p) {
            Point offset = getImageOffset();
            Point norm = new Point();
            norm.x = p.x - offset.x;
            norm.y = p.y - offset.y;
            return norm;
        }

        protected Point getImageOffset() {
            int width = getWidth() - 1;
            int height = getHeight() - 1;
            int x = (width - master.getWidth()) / 2;
            int y = (height - master.getHeight()) / 2;

            return new Point(x, y);

        }

        @Override
        public void paint(Graphics g) {
            super.paint(g);
            if (master != null) {
                Point offset = getImageOffset();
                g.drawImage(master, offset.x, offset.y, this);
            }
        }
    }

    public class MapPane extends AbstractImagePane {

        private Rectangle moneyBounds = new Rectangle(16, 24, 139, 36);
        private Rectangle moreMoneyBounds = new Rectangle(16, 70, 139, 34);

        @Override
        protected boolean containsMoney(Point p) {
            return moneyBounds.contains(normalize(p));
        }

        @Override
        protected boolean containsMoreMoney(Point p) {
            return moreMoneyBounds.contains(normalize(p));
        }
    }

    public class CoordPane extends AbstractImagePane {

        protected boolean contains(Point p, int rgb) {
            Point norm = normalize(p);
            return masterMap.getRGB(norm.x, norm.y) == rgb;
        }

        @Override
        protected boolean containsMoney(Point p) {
            int white = new Color(255, 255, 255).getRGB();
            return contains(p, white);
        }

        @Override
        protected boolean containsMoreMoney(Point p) {
            int red = new Color(255, 0, 0).getRGB();
            return contains(p, red);
        }
    }
}
于 2012-11-22T23:28:16.210 に答える