0

私の CS11 クラスでは、キャンバスの中央で交差する水平線と垂直線を画面に描画する小さなアプレットを作成する必要があります。割り当ての一部は、ユーザーが線をクリックしてドラッグを実行したときに、1 つまたは両方の線を移動できるようにすることです。その部分は機能しています。

2 番目の部分には、ウィンドウのサイズ変更の処理が含まれます。ウィンドウのサイズが変更された場合は、ウィンドウの端から端まで伸びるように 2 つの線を調整する必要があります。

私たちの指示では、プログラムの実行中にウィンドウのサイズを変更できるように、Web ブラウザーの代わりに Java アプレットビューアーを使用してプログラムを起動する必要があります。次の .html ファイルを使用するように指示されています。

ResizableBallController.html

<html>
  <body>
    <applet
      code="ResizableBallController.class"
      archive="objectdraw.jar"
      width="500"
      height="500">
    </applet>
  </body>
</html>

プログラムを実行してウィンドウのサイズを変更すると、ウィンドウを大きくしても、キャンバス領域は 500x500 ピクセルに固定されたままになり、拡大された領域はグレーで塗りつぶされます。私のインストラクターによると、キャンバスは、新しくサイズ変更されたウィンドウの端から端まで広がるように自動的に調整されるはずです。

この問題をテストするために、paintメソッドをオーバーロードしてメッセージを追加しているSystem.out.printlnため、メソッドが呼び出される頻度を確認でき、メソッドが呼び出されるのはプログラムが起動されたときだけです。

これがAwesome Window Managerまたはおそらく他の何かと関係があるのではないかと思っています。これは、ウィンドウのサイズを変更すると、キャンバスも自動的にサイズ変更する必要があるとインストラクターが言ったからです。

ここにコードの一部を示しますので、私が何をしているかを見ることができます:

import objectdraw.*;
import java.awt.*;

public class ResizableBallController extends WindowController
{
  // Canvas separators
  private Line xAxis,
               yAxis;

 boolean xAxisGrabbed,
          yAxisGrabbed;

  public void begin()
  {
    int canvasWidth              = canvas.getWidth(),
        canvasHeight             = canvas.getHeight(),
        canvasHorizontalMidPoint = canvasWidth / 2,
        canvasVerticalMidpoint   = canvasHeight / 2;

    xAxis = new Line(0, canvasVerticalMidpoint,
                     canvasWidth, canvasVerticalMidpoint,
                     canvas);

    yAxis = new Line(canvasHorizontalMidPoint, 0,
                     canvasHorizontalMidPoint, canvasHeight,
                     canvas);
  }

  public void onMousePress(Location p)
  {
    xAxisGrabbed = xAxis.contains(p);
    yAxisGrabbed = yAxis.contains(p);
  }

  public void onMouseDrag(Location p)
  {
    if (xAxisGrabbed)
    {
      xAxis.moveTo(0, p.getY());
    }

    if (yAxisGrabbed)
    {
      yAxis.moveTo(p.getX(), 0);
    }
  }

  public void paint(java.awt.Graphics g)
  {
    super.paint(g);
    System.out.println("paint called");
  }
} // End of public class ResizableBallController extends WindowController
4

1 に答える 1

0

非常に奇妙ですが、Java JDK には一部のウィンドウ マネージャーで問題があるようです。解決策が偶然見つかりました。Awesome WM での JFrame の位置と pack()

于 2012-10-20T05:26:48.040 に答える