現在取り組んでいるゲームで問題が発生しています。このコードの目的は、ウィンドウ上の JComponent の位置を変更することです。これが私がそれをどのように実行したいかです:
1: プログラムが開始され、JFrame が 640x640 ピクセルで作成されます。JComponent は直接中央に描画されます。
2: 「ESC」を押すと、JFrame が全画面表示になります。JComponent は直接中央に描画されます。
3: JFrame が全画面表示のときに「ESC」を押すと、元のサイズに戻ります。
私が抱えている問題は、変数を更新しようとしているにもかかわらず、JComponent が全画面の中央に再描画されないことです。3 つの System.out.println テストを実行してデバッグを試みることにしました。最初の "A" は、setLocation メソッドのパラメータ "loc" の値を出力します。2 番目の "B" は、Point "location" の値を元の値からパラメーターで指定された値に変更した後に出力します。
3 番目のテスト「C」は、setLocation で repaint によって paintComponent メソッドが呼び出されたときに正確に指定され、テスト「B」のように場所の値を出力します。ここで問題が発生します。
最初のテスト セットは、JFrame が最初に描画されるときに実行されます。JComponent の場所は各テストで同じです。2 番目のテスト セットは、JFrame のサイズが変更されたときに実行されます。「A」および「B」に示すように、setLocation メソッドで JComponent の場所を更新する必要があります。ただし、テスト「C」で場所を呼び出すと、場所は JFrame の元の場所に戻されます。
public void setLocation(Point loc)
{
location = new Point(loc.x, loc.y);
System.out.println(loc + "A"); System.out.println(location + "B");
repaint();
}
public void paintComponent(Graphics g)
{
System.out.println(location + "C");
Graphics2D g2 = (Graphics2D)(g);
BufferedImage x = null;
if(isMale)x = mobs[0]; else x = mobs[1];
g2.drawImage(rotate(x, direction), null, (int)location.getX(), (int)location.getY());
}
private Point location = new Point(280, 280);
出力:
java.awt.Point[x=280,y=280]A
java.awt.Point[x=280,y=280]B
java.awt.Point[x=280,y=280]C
java.awt.Point[x=1880,y=1040]A
java.awt.Point[x=1880,y=1040]B
java.awt.Point[x=280,y=280]C
java.awt.Point[x=280,y=280]A
java.awt.Point[x=280,y=280]B
java.awt.Point[x=280,y=280]C
更新後にポイントの「場所」が (1880, 1040) にとどまらず、再描画された理由を誰かが理解してくれれば、本当に感謝しています。