2

現在取り組んでいるゲームで問題が発生しています。このコードの目的は、ウィンドウ上の 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) にとどまらず、再描画された理由を誰かが理解してくれれば、本当に感謝しています。

4

1 に答える 1

2

これを答えに変更します:

あなたのsetLocation(...)メソッド オーバーライドはそのスーパー メソッドを呼び出すべきではありませんか? そうしないと、必要なことを実行できません。そして、それが呼び出す必要があるかどうかはわかりませんrepaint()。また、JComponent を保持するコンテナはどのレイアウトを使用していますか? コンポーネントをコンテナの中央に配置するには、GridBagLayout を使用したり、GridBagConstraints を使用せずにコンポーネントを追加するなど、いくつかの方法があります。これはデフォルトの方法です。最後に、sscceを作成して投稿して、問題をよりよく示すことを検討してください。

于 2012-08-06T02:32:07.957 に答える