2016-10-24 14 views
1

JFrameウィンドウに表示される図形の位置を設定しようとしています。たとえば、四角形の場合、移動する必要があります。左上の点は10ピクセル、右下のピクセルは10ピクセル下になります。私はこのようにやろうとしたが、それはうまくいきませんでしたPointクラスを使用してポイントの位置を設定する方法は?

public void relocate(ArrayList<MyShape> newShape){ 

    int x1, x2, y1 , y2; 

    for(int i = 0; i < newShape.size(); i++){ 

     x1 = (int)newShape.get(i).p1.getX(); 
     y1 = (int)newShape.get(i).p1.getY(); 

     x2 = (int)newShape.get(i).p2.getX(); 
     y2 = (int)newShape.get(i).p2.getY(); 


     newShape.get(i).setLocation(x1 + 10, y1); 
     newShape.get(i).setP1(newShape.get(i).getP1()); 
     newShape.get(i).setLocation(x2, y2 + 10); 
     newShape.get(i).setP2(newShape.get(i).getP2()); 


     if(newShape.get(i).getCol() != null){ 
      newShape.get(i).setCol(Color.BLUE); 
     } 


    } 

    repaint(); 
} 
+1

"それはうまくいかなかった"ことについて詳しく説明できますか?ここでは正確に何が起こり、あなたの希望する結果とどのように違うのですか? – Mureinik

+0

ヒント:MyShapeとは何ですか?注意してください:ここにウィザードはありません。あなたのコードが何をしているのかわからない。あなたが私たちとそれを共有しない限り! – GhostCat

+0

幾何学的形状の点は、左に10ピクセル、左に10ピクセル移動しません。 – user3225609

答えて

1

あなたのコードは動作するはずです - それは、画面上のオブジェクトの位置を変更するという意味で。それで、ここで何が起こっているのですか?あなたのソリューションに何が問題なのですか?

でも、私はあなたにいくつかのヒントを与えることができます。

をあなたは、コードの他の部分は、場所の設定をいじっているかどうかを確認することができます。設定が上書きされる可能性があります。

このコードは、AWTスレッドの外側で実行されることがあります。 SwingUtilities.isEventDispatchThread()で確認できます。

スイングでPoint -sを再利用することができます。ポイントは可変オブジェクトです。これはとてもきれいではないコードにつながりますが、パフォーマンスは、この場合に重要である:

MyShape shape = newShape.get(i); 
Point p = shape.getP1(); 
p.setLocation(p.x, p.y + 10); 

たぶんrevalidate()呼び出しがあまりにも助けることができる:

public void relocate(ArrayList<MyShape> newShape) { 
    // some code changing locations 
    revalidate(); // this is it 
    repatint(); 
} 
+1

revalidate()は必要ありません。 revalidate()は、レイアウトマネージャを呼び出すためにのみ使用されます。 – camickr

1

以下の分析はMyShapeがあるためどのように機能するかについての仮定に基づいていますあなたがそれらの質問をしたときにそれらの詳細を提供することを拒否しました。

あなたのアルゴリズムを見てください。各形状について:

1)P1とP2の元の値をキャプチャしています。ここまでは順調ですね。

2)形状のsetLocation()メソッドをP1の調整値と呼びます。 今、setLocation()は何をしていますか?これは、MyShapeクラスについて質問された理由の一部であり、すべての図形のスーパークラスでは役に立たないと言っています。

3)P1に問い合せることによって得られる値にP1を設定するように形状を指示します。 getterとsetterが何か合理的なことを行うなら、これは何もしません。

4)今度はsetLocation()に電話し、今回はP2の調整値を指定してください。 もう一度、これは何をしますか?手順2で成し遂げたものは、おそらく元に戻します。

5)P2を照会して得た値にP2を設定するように図形に指示します。繰り返しますが、これはおそらく何もしません。

手順2で計算した調整値に基づいて、P1を設定します。手順4で調整した値に基づいてP2を設定します。ただし、secLocation、getP1、およびgetP2がすべて非常に不自然なことをしない限り、コードには言いません。

1

MyShapeの内容はわかりませんが、newShape.get(i).setP1はすぐ前にnewShape.get(i).setLocationを上書きしているようです。

//Change this 
newShape.get(i).setLocation(x1 + 10, y1); 
newShape.get(i).setP1(newShape.get(i).getP1()); 
newShape.get(i).setLocation(x2, y2 + 10); 
newShape.get(i).setP2(newShape.get(i).getP2()); 
//To this 
newShape.get(i).getP1().setLocation(x1 + 10, y1); 
newShape.get(i).getP2().setLocation(x2, y2 + 10); 

このようにコードを調整してみてください。

+0

(1-)は15分早くTamasによって提案されました。提案を繰り返す必要はありません。 – camickr

+0

公平になるために、私はさらに詳しいことはしませんでしたが、OPのコードに合わせて調整しました。私はPointクラス全体を紹介しなかったし、スイングの構造にさらに進んでいました。しかし、あなたがそれをあまりにも似ていると思うかどうか分かります – Voltboyy

関連する問題