2012-02-12 7 views
3

私は、ウィンドウをクリックすることができる場所にポイントを配置するプログラムを作っています。ユーザーが再度クリックすると、ポイントは削除されます。プログラム上、クリックするたびに、「要素」と呼ばれる別のクラスの新しいインスタンスが作成されます。このインスタンスには、単一点の(X、Y)位置が含まれています。マウスクリックによるグラフィックポイントの切り替え

これを実現するには、JPanelを拡張してMouseListenerを実装しています。ポイントを描画するには、paint()メソッドをオーバーライドします。ユーザがクリックするたびに、MouseListenerのmouseReleased()メソッドがArrayListに追加されるか、ArrayListから削除され、paint()が呼び出され、画面がクリアされ、ArrayListが再描画されます。

私が抱えている問題は、クリックするとポイントが消えないということです。私はそれがpaint()やArrayListと何かを理解していないかどうかはわかりません。ここで

)が(私の塗料です:

public void paint(Graphics g) 
{ 
    // Clear screen 
    g.setColor(Color.WHITE); 
    g.fillRect(0, 0, getWidth(), getHeight()); 

    // Display what elements will be drawn (for debugging) 
    System.out.println("About to draw the following elements:"); 
    for (Element e : elements) 
    { 
     System.out.println("\t" + e); 
    } 

    // Draw Elements 
    g.setColor(Color.BLACK); 
    for(int i=0; i < elements.size(); i++) 
    { 
     g.fillOval(elements.get(i).x, elements.get(i).y, 10, 10); 
    } 

} 

そしてここでは、マウスクリックの方法である:

public void mouseReleased(MouseEvent e) 
{ 
    // Rounds to the nearest grid space (spacing is currently 20px) 
    int roundX = (int) ((float)(Math.round(e.getX()/GRID_SPACING)) * GRID_SPACING); 
    int roundY = (int) ((float)(Math.round(e.getY()/GRID_SPACING)) * GRID_SPACING); 

    System.out.println("Clicked (" + roundX + ", " + roundY + ")"); 

    // Go through each element... 
    for (int i=0; i < elements.size(); i++) 
    { 
     // if an element exists at the coordinates clicked, 
     if (elements.get(i).getX() == roundX && elements.get(i).getY() == roundY) 
     { 
      // remove it from the elements list 
      elements.remove(i); 
      i--; 
      System.out.println("\tElement exists at (" + roundX + ", " + roundY + "). Removing it."); 
     } 
    } 

    elements.add(new Element(roundX, roundY)); 

    repaint(); 
} 

次のようにこれの出力は次のとおりです。

About to draw the following elements: (None) 

Clicked (140, 100) 
About to draw the following elements: 
    This element's coordinates are (140, 100) 

Clicked (160, 100) 
About to draw the following elements: 
    This element's coordinates are (140, 100) 
    This element's coordinates are (160, 100) 

Clicked (140, 100) 
    Element exists at (140, 100). Removing it. 
About to draw the following elements: 
    This element's coordinates are (160, 100) 
    This element's coordinates are (140, 100) 
+0

'mouseReleased'メソッドでは、単に要素を削除したとしても、常に' add'を行います。そのため、同じ場所に別の要素を追加しただけで、それを削除しても描画されます – Robin

+0

すぐに役立つように、[SSCCE](http://sscce.org/)を投稿してください。 –

答えて

4

あなたはすべきです要素が前のループで削除された場合はadd(new Element(roundX, roundY))ではありません

+0

ああ、私の愚かな方法!私はその日のとても遅いことにそれを責めます。今は素晴らしい作品です。ありがとうございます。 – Derek

2

スウィングパネルでpaint(Graphics)を上書きしないでください。代わりにpaintComponent(Graphics)を使用してください。

+1

ありがとう、私はこれを私のコードで変更しました。 – Derek

+0

なぜですか?なぜ、それは彼が尋ねた問題を修正するつもりはないので、それを行う理由の説明を追加する必要があると思いませんか? – CajunLuke