この問題は非常に奇妙です。この問題は、すべてのプラットフォームで発生するわけではありません。MacOSXを使用しているGoogleChromeで発生しますが、Safariでは発生しません。Windowsを使用している友人の場合、GoogleChromeでは完全に機能します。MacOSXを使用している友人もいますが、彼の場合、Chrome、Safari、Firefoxで点滅します。私たちは両方ともMacOSXLionを持っています。リンクが表示されません。あなたはそれをテストして、それが起こるかどうか、そしてあなたのプラットフォームが何であるかを報告してください(それはせいぜい30秒以内に起こるはずです)?
このスレッドはOracleのフォーラムで見つけました。どうやら、これはMacOSXでよく知られている問題です。これは、Javaが子プロセスを作成し、Safariがこれをセキュリティ機能として許可していないためです。ただし、この問題はMacのChromeとFirefoxでも発生します(私はSafariでは発生しません)。図を見てください…これについて誰かの意見を聞いてうれしいです。
私は現在、小さなJava Tetrisゲームを作成していますが、問題は、アプレットバージョン(JAppletを拡張)で画面がときどき点滅することです。コンピューターのJFrameで実行すると、すべて正常に動作します。
アプレットは、次のサイトで表示および使用できます:http: //mtetris.herokuapp.com/(私は何も宣伝または宣伝しようとはしていません。問題が何であるかを実際に確認できるように配置しています)。
(アプレットが自動的にロードされない場合、つまりブラウザがアプレットをブロックし、ロードを許可するかどうかをユーザーに尋ねる場合、アプレットがマウスフォーカスを適切に取得しないという別の問題もあります。「開始レベル」の数値が適切に強調表示されない、それが理由です。)
これが私が試したもので、まばたきの問題を修正しなかったものです:
- アプレットの背景、ルートペイン、コンテンツペイン、アプレット内のすべてのコンポーネントを黒に設定します。
- アプレットの
paint()
メソッドをオーバーライドし、その中でダブルバッファリングを実行します(何も改善されていないため、現在のコードでこの部分にコメントしました) - アプレットの
update()
メソッドをオーバーライドして直接呼び出す(この問題は、公式ドキュメントのメソッドの説明に従ってpaint()
修正されました)
ソースコード全体は、このページのgithubにあります。JAppletを拡張するクラスはTetrisApplicationです。ソースコードはまだきれいではないので、ごめんなさい。
これが私がダブルバッファリングを実装した方法です
public class TetrisApplication extends JApplet {
// the dimension of the applet
private Dimension dimension;
// image used for double buffering
Image offscreen;
// the second buffer
Graphics bufferGraphics;
public void init() {
super.init();
dimension = getSize();
offscreen = createImage(dimension.width, dimension.height);
bufferGraphics = offscreen.getGraphics();
...
}
public void paint(Graphics g){
bufferGraphics.clearRect(0, 0, dimension.width, dimension.height);
super.paint(bufferGraphics);
g.drawImage(offscreen, 0, 0, this);
}
...
}