アプレットでキャンバスをペイントする
質問
現在、デスクトップ(つまり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()
呼び出しから行われているためです。
他のヒント
一般に、アプレットでもあるアプリケーションを作成する方法は、エントリポイントクラスにアプレットを拡張させ、そのセットアップに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
できないことです。