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

}

この Panel を別の Frame に作成し、アプリ本体から DpPlotEcho() メソッドを呼び出します。

マップと画面中央の小さな赤い点は正しく表示されますが、DpPlotEcho() メソッドを使用して再描画を試みても更新は行われません。

2つの質問:

  1. 再描画を機能させるにはどうすればよいですか (主な問題) と
  2. すべてのドットが画面上にとどまるようにするにはどうすればよいですか?
4

3 に答える 3

1

再描画を機能させるにはどうすればよいですか (主な問題)

コンポーネントに描画するデータを変更するたびに、コンポーネントで repaint() を呼び出すだけです。次に、paintComponent() メソッドがコンポーネント全体を再描画します。

すべてのドットが画面上にとどまるようにするにはどうすればよいですか?

paintComponent() メソッドが呼び出されるたびに、すべての円を再描画する必要があります。

これは通常、次の方法で行われます。

  1. ペイントするすべての円の ArrayList を保持し、リストを反復処理するだけです
  2. 各円を BufferedImage にペイントしてから、イメージをペイントします。

各アプローチの例については、カスタム ペイント アプローチを参照してください。

于 2013-03-25T16:33:42.220 に答える
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 に答える
0

引数なしでrepaint()を試すrepaint(int x, int y, int width, int height)と、コンポーネントの指定された長方形のみが再描画されます。

于 2013-03-25T16:27:11.780 に答える