Java 摆动,在 JPanel 中的图像上的某个位置放置标记

Java swing, place marker at a location on an image in JPanel

我正在尝试使用 Java Swing 为学校项目创建地图应用程序。有几个地图(jpg 格式)将使用 JComboBox 选择,所以我有一种方法可以在 JPanel(在 JScrollPane 中)中显示图像,该图像路径会根据 JComboBox 选择而变化。

现在,我有基于另一个 JComBoBox 选择的全局变量 x 和 y 坐标,我需要在图像的坐标处放置一个标记。我该怎么做?

public static void displayImage(String path, JPanel panel, JLabel label) {
    try {
        image = ImageIO.read(new File(path));
    } catch (IOException e1) {
        e1.printStackTrace();
    }

    panel.removeAll();

    panel.add(new JLabel(new ImageIcon(new ImageIcon(image).getImage().getScaledInstance(1920, 1080, Image.SCALE_SMOOTH))));
    panel.revalidate();
    panel.repaint();
}

在 JscrollPane 和 JPanel 的主要函数中:

    JScrollPane scrollPane = new JScrollPane();
    scrollPane.setBounds(245, 11, 1010, 659);
    frame.getContentPane().add(scrollPane);
    JPanel panel = new JPanel();
    panel.setLayout(new BorderLayout());
    label = new JLabel();

    scrollPane.setViewportView(panel);

我试过制作自定义视口并在其上绘制标记,但它不随图像滚动(图像滚动时标记保持在同一位置)

I need to place a marker at the coordinates on the image.

您发布的代码与您所说的 "marker" 无关。

I have tried making a custom viewport and painting a marker on that, but it does not scroll with the image

如果要自定义绘制,需要在label(不是scroll pane)上自定义绘制。

  1. 首先,您将创建一个具有两个属性的自定义对象(标记):a) 图像 b) 点。
  2. 然后您将扩展 JLabel 并添加类似 addMarker(Marker) 的方法。 Marker 对象将存储在 ArrayList
  3. 然后您将覆盖标签的 paintComponent() 方法以 a) 调用 super.paintComponent(...) 来绘制图像。 b) 然后遍历 ArrayList 来绘制每个 Marker 对象。

或者另一种方法是将每个标记图像的 JLabel 对象添加到主 JLabel。基本步骤是:

  1. 使用图像创建 JLabel
  2. 使用 setSize( markerLabel.getPreferredSize() );
  3. 设置标记标签的边界
  4. 将标记标签添加到背景图像标签中。