0

我是一个缺乏经验的(除非你算上 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() 方法重新绘制时不会发生更新。

所以两个问题:

  1. 我如何说服重绘工作(主要问题)和
  2. 如何确保所有点都留在屏幕上。
4

3 回答 3

1

我如何说服重绘工作(主要问题)

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

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

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

这通常由以下方式完成:

  1. 保留要绘制的所有圆圈的 ArrayList,然后遍历列表
  2. 将每个圆圈绘制到 BufferedImage 上,然后仅绘制图像。

有关每种方法的示例,请参阅自定义绘画方法。

于 2013-03-25T16:33:42.220 回答
0

尝试不带参数的repaint()repaint(int x, int y, int width, int height) ,仅重绘组件的指定矩形。

于 2013-03-25T16:27:11.780 回答
0

我认为您应该尝试添加一个新功能:

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);
}

这是我一直做的事情,它对我有用。

于 2014-01-19T06:21:20.640 回答