1

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

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

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

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

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

4

3 に答える 3

2

アプレットContainerです。そこに Canvasを追加するだけです。

于 2009-01-08T16:15:57.787 に答える
1

一般に、アプレットでもあるアプリケーションを作成する方法は、エントリ ポイント クラスにアプレットを拡張させ、そのセットアップで 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();
  }
于 2009-01-08T16:32:35.210 に答える
0

CanvasSwing コンポーネントへの追加には不適切です。JComponent代わりに (および)を使用しsetOpaque(true)ます。

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

への依存関係を削除することをお勧めしMyCanvasますJFrame。フレームを使用するアプリケーションのコードと、アプレットを使用するアプリケーションのコードを分けておくこともお勧めします。コンポーネントを a に追加することJAppletは、 for と同じですJFrame(どちらの場合も、実際に がadd実際に呼び出さgetContentPane().addれ、不必要な混乱を引き起こす可能性のある悪ふざけがあります)。pack主な違いは、アプレットを作成できないことです。

于 2009-01-08T17:05:30.913 に答える