1

リスナーを含むJComponentがあります。JComponentで大きな画像を描画し、マウスリスナーがクリックが発生する場所に小さな画像を追加します(いくつかのドットを追加した1つの大きなマップ)。

paintComponentメソッドの外にプログラムで何かを描画するにはどうすればよいですか?

 public void paintComponent(Graphics g) {
   Graphics2D g2 = (Graphics2D) g;

   g2.drawImage(img1, 0, 0, this);
   g2.finalize();

 }

 private MouseListener listener; 

 public void initListener() {
   myCanvas = this;
   listener = new MouseAdapter() {
     public void mouseClicked(MouseEvent e) {
       myCanvas.getGraphics().drawImage(img,e.getX(),e.getY(), myCanvas);
     }
   };
   addMouseListener(listener);

 }

私の問題はこれにあります:

public void drawDot(int x, int y){
 myCanvas.getGraphics().drawImage(img, x, y, myCanvas);
}

何もしません。repaint()を試しました。

4

3 に答える 3

2

あなたはこれを行うことはできません。すべての描画はpaintComponent()メソッドで行われます。何をすべきかは、描画したいものを表すモデルを作成し、マウスリスナーでモデルを変更することです。次に、repaint()を呼び出して、モデルが変更されたときにこのコンポーネントを再描画するように依頼します。paint()メソッド内で、モデルから完全なペイントをレンダリングします。例えば:

List<Point> pointsToDrawSmallerImage = new ArrayList<Point>();

...

listener = new MouseAdapter() {
    public void mouseClicked(MouseEvent evt ) {
        pointsToDrawSmallerImage.add( evt.getPoint() );
        repaint();
    }
}
...

public void paintComponent(Graphics g) {
    g.clear();   // clear the canvas
    for( Point p : pointsToDrawSmallerImage ) {
       g.drawImage(img, p.x, p.y, myCanvas);           
    }
}
于 2011-10-24T20:33:55.950 に答える
2

paintComponentメソッド内で図面を管理する必要があります。Java Graphicsはステートフルではありません。メソッド内で必要なものを描画するために、実際に必要なものに注意を払う必要があります。paintメソッドが呼び出されるたびに、すべてを再度描画する必要があります。他のコンポーネントを追加している間、キャンバスに「とどまる」ものは何もありません。

これは、paintメソッドが描画するために注意を払う要素のリストを保存する必要があることを意味します。ArrayList<Point> points、次にペイントメソッドでそれらを繰り返す必要があります:

for (Point p : points)
  draw the point

リスナーを使用してポイントをリストに追加し、repaintを呼び出すだけです。Swing/AWT描画のガイドラインはここにあります。

特定のAPIには、希望する動作があります。これはCocos2Dと呼ばれ、Android/Java用のポートがあります。このポートはここにあります

于 2011-10-24T20:35:53.867 に答える
0

これは描画の仕組みではありません。描画メソッドは、再描画のたびにメソッド自体にあるすべてのものを描画します。つまり、メソッドを呼び出して何かを1回描画すると、1回の再描画サイクルでのみ描画されます。

クリックで何かを描画したい場合は、クリックでコレクションに追加し、すべてのペイントサイクルでコレクション全体を描画する必要があります。これにより、コレクションは永続的に保持されます。

于 2011-10-24T20:34:05.450 に答える