Java JPanel中的重绘查询

Java JPanel中的重绘查询,java,swing,graphics,jpanel,repaint,Java,Swing,Graphics,Jpanel,Repaint,我是一个缺乏经验的程序员(除非你把70年代早期的PDP-8计算在内),在封闭的类中努力使用重新绘制方法 这门课的目的是展示当地的航空地图,然后在地图上画一些小圆圈来描绘飞机的飞行路线。随着时间的推移,地图将显示飞机在当地机场着陆后最常用的路径 问题是,经过一天的努力,我仍然无法重新油漆工作 与图形相关的类别为: package com.slatter.radarboxconnect; import java.awt.*; import java.awt.image.BufferedImage;

我是一个缺乏经验的程序员(除非你把70年代早期的PDP-8计算在内),在封闭的类中努力使用重新绘制方法

这门课的目的是展示当地的航空地图,然后在地图上画一些小圆圈来描绘飞机的飞行路线。随着时间的推移,地图将显示飞机在当地机场着陆后最常用的路径

问题是,经过一天的努力,我仍然无法重新油漆工作

与图形相关的类别为:

package com.slatter.radarboxconnect;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;

/**
* A RADAR Plotting Frame 
*/
public class DrawPanel extends JPanel {

    public static BufferedImage img = null; // Create a BufferedImage object
    public int cx = 700,cy = 500,cdia = 70; // Aircraft Echo parameters

    public DrawPanel() {

        // Create Graphic of map
        try {
            img = ImageIO.read(new File("full.jpeg"));  //Get the map
        } catch (IOException e){
        }
    }

    @Override 
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        //Draw the Map and a sample red dot
        g.drawImage(img, 0, 0, 1400, 1000, 0, 0, 1400, 1000, null);
        g.setColor(Color.red);
        g.drawOval(cx,cy, cdia, cdia);
        g.fillOval(cx,cy, cdia, cdia);
    }

    public void DpPlotEcho(int x, int y, int pdia) {

         cx=x;
         cy=y;
         cdia=pdia;
         repaint(cx,cy,cdia,cdia);
    }

}
我在一个单独的框架中创建这个面板,并从应用程序的主体调用DpPlotEcho()方法

通过DpPlotEcho()方法重新绘制时,地图和屏幕中心的一个小红点显示正确,但不会发生更新

所以有两个问题:

  • 我如何说服重新粉刷工作(主要问题)以及
  • 如何确保所有的点都留在屏幕上
  • 尝试不带参数,
    重新绘制(int x,int y,int width,int height)
    仅重新绘制组件的指定矩形

    我如何说服重新粉刷工作(主要问题)

    每次更改要为组件绘制的数据时,只需在组件上调用repaint()。然后,paintComponent()方法将重新绘制整个组件

    如何确保所有的点都留在屏幕上

    每次调用paintComponent()方法时,都需要重新绘制所有圆

    这通常由以下人员完成:

  • 保留所有要绘制的圆的ArrayList,然后在列表中迭代
  • 在BuffereImage上绘制每个圆,然后只绘制图像

  • 有关每种方法的示例,请参见。

    我认为您应该尝试添加一个新函数:

    public void paint(Graphics g){
        super.paint(g);
        g.drawImage(img, 0, 0, 1400, 1000, 0, 0, 1400, 1000, null);
        g.setColor(Color.red);
        g.drawOval(cx,cy, cdia, cdia);
        g.fillOval(cx,cy, cdia, cdia);
    }
    
    这是我经常做的事,对我来说很有用