質問

現在、デスクトップ(つまりJFrame)とアプレットの両方で実行したい小さなJavaプログラムがあります。現在、すべての描画とロジックはCanvasを拡張するクラスによって処理されています。これにより、デスクトップアプリケーションの非常に優れたメインメソッドが提供されます。

public static void main(String[] args) {
    MyCanvas canvas = new MyCanvas();
    JFrame frame = MyCanvas.frameCanvas(canvas);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    canvas.loop();
}

アプレットに対して同様のことができますか?理想的には、MyCanvasは両方のケースで同じままです。

それが重要かどうかはわかりませんが、 setIgnoreRepaint(true)でBufferStrategyを使用して描画しています。

編集:明確にするために、私の問題はキャンバスをペイントしているようです-すべてのペイントは canvas.loop()呼び出しから行われているためです。

役に立ちましたか?

解決

アプレットコンテナ add そこのキャンバス。

他のヒント

一般に、アプレットでもあるアプリケーションを作成する方法は、エントリポイントクラスにアプレットを拡張させ、そのセットアップにCanvasを追加するなどです。

次に、メインメソッドバージョンでは、アプレットクラスをインスタンス化し、新しいフレーム(またはJApplet / JFrameなど)に追加します。

こちらおよびこちらは、基本的に(最初の例から)要約した手法の例です。

  public static void main(String args[])
  {
    Applet applet = new AppletApplication();
    Frame frame = new Frame();
    frame.addWindowListener(new WindowAdapter()
    {
      public void windowClosing(WindowEvent e)
      {
        System.exit(0);
      }
    });

    frame.add(applet);
    frame.setSize(IDEAL_WIDTH,IDEAL_HEIGHT);
    frame.show();
  }

Canvas はSwingコンポーネントに追加するには不適切です。代わりに JComponent を使用してください(および setOpaque(true))。

Swingコンポーネントは、AWTイベントディスパッチスレッド(EDT)で常に操作する必要があります。 java.awt.EventQueue.invokeLater (アプレットの場合は invokeAndWait )を使用します。 EDTからブロッキング操作を行うべきではないため、そのための独自のスレッドを開始します。デフォルトでは、メインスレッド(またはアプレットの場合はアプレットスレッド)で実行しています。これはEDTとはまったく別のものです。

MyCanvas から JFrame への依存関係を削除することをお勧めします。また、フレームを使用するアプリケーションのコードを、アプレットを使用するものとは別にすることをお勧めします。コンポーネントを JApplet に追加することは、 JFrame の場合と同じです(どちらの場合も、実際に何が起こるかは、 add が実際に< code> getContentPane()。add は、不必要な混乱を引き起こす可能性があります)。主な違いは、アプレットを pack できないことです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top