首页 > 解决方案 > Java swing,将标记放置在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);

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

标签: javaswingjpaneljscrollpane

解决方案


我需要在图像上的坐标处放置一个标记。

您发布的代码与您正在谈论的这个“标记”无关。

我尝试制作自定义视口并在其上绘制标记,但它不会随图像滚动

如果要进行自定义绘画,则需要在标签(而不是滚动窗格)上进行自定义绘画。

  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. 将标记标签添加到背景图像标签。

推荐阅读