Java 当我滚动图像时,自创图形消失,它们';我被安置在

Java 当我滚动图像时,自创图形消失,它们';我被安置在,java,swing,Java,Swing,我知道以前也有人问过类似的问题。例如: 1- 和2- 但是,我仍然无法在代码中找到错误。我觉得我已经按照答案中的建议做了 我试图实现的是简单的;我想从JFileChoser中选择一个文件(png图像),然后在单击地图时能够向该地图添加位置。应该用三角形指出位置。图像大于其所在的边框,因此应可滚动 我已经设法做到了这一切,但问题与上面两个问题相同——当我在图像上滚动时,我在图像上放置的三角形消失了。我的代码中有几个要点: public PlaceMarker(int xCoordinate,

我知道以前也有人问过类似的问题。例如: 1- 和2-

但是,我仍然无法在代码中找到错误。我觉得我已经按照答案中的建议做了

我试图实现的是简单的;我想从JFileChoser中选择一个文件(png图像),然后在单击地图时能够向该地图添加位置。应该用三角形指出位置。图像大于其所在的边框,因此应可滚动

我已经设法做到了这一切,但问题与上面两个问题相同——当我在图像上滚动时,我在图像上放置的三角形消失了。我的代码中有几个要点:

public PlaceMarker(int xCoordinate, int yCoordinate){
    setBounds(xCoordinate, yCoordinate, 50, 50);
} //This class extends JComponent

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.fillPolygon(xValuesArray, yValuesArray, 3);

    repaint();
}
添加图像的按钮:

JMenuItem newImage = new JMenuItem("New Image");
    newMap.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            String directory = System.getProperty("user.dir");
            fileChooser = new JFileChooser(directory);
            int answer = fileChooser.showOpenDialog(MainFrame.this);
            if(answer != JFileChooser.APPROVE_OPTION)
                return;
            File file = fileChooser.getSelectedFile();
            String filePath = file.getAbsolutePath();
            if(image != null)
                remove(scrollPane);
            image = new ImageContainer(filePath);
            scrollPane = new JScrollPane(image);
            scrollPane.setMaximumSize(image.getPreferredSize());

            add(scrollPane, BorderLayout.CENTER);
            pack();
            validate();
            repaint();
        }
    });
我的ImageClass中也有此方法:

@Override
protected void paintComponent(Graphics g){
    super.paintComponent(g);
    g.drawImage(image.getImage(), 0, 0, this);
} //This class extends JPanel
然后,当我点击地图时,就可以在地图上添加位置

你只画过一个记号笔。paintComponent()将删除以前的标记

因此,您需要保留要绘制的这些自定义标记的列表,然后遍历该列表以绘制所有标记


查看中的
DrawOnComponent
示例,了解此方法的工作示例。

如果您不尝试使用
PlaceMarker
扩展
JComponent
,而是将其设置为一个只包含坐标的逻辑类,则会简化一些事情,然后直接在面板的
paintComponent
中进行绘制(
ImageContainer
?)。这样做的缺点是,它会使一些事情,如工具提示,变得更加复杂。更重要的是,你应该试着用一个复制问题的方法更新你的问题。此外,还需要删除对
PlaceMarker.paintComponent
中的
repaint()
的调用。
super.paintComponent(g);
g.fillPolygon(xValuesArray, yValuesArray, 3);