1

私はテトリスベースのゲームを書いています。GridLayoutを使用して、テトリスのピースが落下する実際のシャフトを表示しています。GridLayoutは小さなJLabelオブジェクトで埋められています。シャフト自体は別のJPanel内のJPanelであり、ゲーム全体を格納および制御するために使用しているパネルです。ゲームが終了したら、「GAME OVER」という単語をグリッドの上に表示し、小さな画像を添えて表示したいと思います。

私のシャフトはShaftPanelのインスタンスであり、JPanelを拡張して(paintComponentをオーバーライドできるように)、ネストされたプライベートクラスです(したがって、より大きなJPanelのプライベートインスタンス変数にアクセスできます)。アクセスする必要のあるプライベートインスタンス変数はブール値のゲームです。これは、ゲームがセッション中の場合はtrueであり、ゲームが終了した場合はfalseに設定されます。ShaftPanelクラスのコードは次のとおりです。

public class ShaftPanel extends JPanel {

public ShaftPanel(GridLayout g){
  super(g);
}

public void paintComponent(Graphics g){
  super.paintComponent(g); 
  if(game)
    return; 
  g.setColor(Color.WHITE);
  g.setFont(new Font("Courier New", Font.BOLD, 15));
  char[] c = {'G','A','M','E',' ','O','V','E','R'}; 
  g.drawChars(c,0,c.length,45,45);
}

}

より大きなクラスに、適切なタイミングでシャフトのrepaint()メソッドを呼び出すメソッドが1つあります。printステートメントを追加すると、必要なときにpaintComponentメソッドが呼び出され、setColor、setFont、drawCharsメソッドがすべて正しいタイミングで呼び出されていることがわかります。ただし、何も表示されません。テキストがJLabelsのグリッドの下に描画されているために表示されていない可能性が高いのですが、この問題を解決する方法がわかりません。プログラムは異なる色であることに依存しているため、グリッド内のJLabelは不透明のままにする必要があります。パネル内の他のものの上にテキストを描画するようにpaintComponentに指示する方法はありますか?

4

2 に答える 2

1

私はおそらくこの方法でテトリスを作成しなかったでしょうが、これをテストする1つの方法は、「if(game)」を削除し、JLabelが存在しない場合でもゲームオーバーが書き込まれているかどうかを確認することです(常に存在し、場合によっては存在する場合を除く)空欄)。

とにかく、今まで使ったことがないと思いますが、役に立つかもしれないのはGlassPanelです。これは、現在のJFrameなどにオーバーレイできるパネルです。

詳細なコードと情報については、こちらをご覧ください:http ://www.java2s.com/Code/Java/Swing-JFC/Paintonglasspane.htm

于 2011-05-16T00:41:41.670 に答える
1

ガラス板の仕組みの例と説明については、Swingチュートリアルのガラス板の使用に関するセクションを参照してください。

もう1つのオプションは、JWindowを使用して、メッセージとアイコンのラベルを表示することです。

于 2011-05-16T03:19:47.340 に答える