2016-10-01 14 views
0

私は、イベントを使ってGUI上のものを変更する方法について学んでいます。私は現在、別のメソッドから渡されたController Eventsを使用しています。これらのメソッドで変数がどのように機能するかについての重要な情報が不足していると思います。これは私のソースコードです(これは現在、内部クラスです)。私がやろうとしている何GUI上の繰り返しの変更

class MyDrawPanel extends JPanel implements ControllerEventListener{ 

    static boolean isWriting = false; 

    public void controlChange(ShortMessage event) { 
     isWriting = true; 
     repaint(); 
    } 

    public void paintComponent(Graphics g){ 

     if (isWriting){ 
      int red = (int) (Math.random() * 250); 
      int green = (int) (Math.random() * 250); 
      int blue = (int) (Math.random() * 250); 

      g.setColor(new Color(red, green, blue)); 

      int xpos = (int) (Math.random() * 190 + 10); 
      int ypos = (int) (Math.random() * 190 + 10); 
      int width = (int) (Math.random() * 50 + 10); 
      int height = (int) (Math.random() * 50 + 10); 
      g.fillRect(xpos, ypos, width, height); 


      //isWriting = false; 
     } 

は、新たな長方形にリスナーがイベントを受信するたびに描くが、私はのみ発生する2つのいずれかを取得することができます。 if文の最後に "isWriting"をfalseに戻そうとすると、if文は偽と評価され続け、四角形を描画しないようです。 isWritingをfalseに設定するコードをコメントアウトすると、描画は1つの矩形に対して機能しますが、変数を元に戻したり、repaintメソッドを呼び出して1つの矩形しか得られません。

イベントを取得するたびにカウントをインクリメントするためにsoutを使用したので、問題がisWriting変数の状態にあるように見えるので、イベントがリスナーに届いています。助けてくれてありがとう!

+0

上の高度なチュートリアルでは、塗装方法の中から、あなたのクラスの状態を変更しないでください。私は明確ではなく、あなたがここで何をしようとしているのか、誘発しようとしている行動は何か。明確にすることはできますか? –

+0

四角形を一定期間だけ表示しますか?その場合は、スイングタイマーを使用してください。または、ユーザーがメッセージの受信を確認したら?次に、他のリスナーを使用します。再度、明確にしてください。 –

答えて

1

クラスの状態をペイント方法から変更しないようにします。これはあなたが完全に制御できる方法ではないため、これを実行すると予期しない副作用をデバッグすることが困難になります。

あなたがしようとしていることの100%確信しているわけではありませんが、メッセージを受信するたびに新しい矩形を描画しようとしていて、 、おそらく)複数の長方形を示し、その後、

  • BufferedImageの上に四角形を描画して、あなたのJPanelのpaintComponentメソッドにBufferedImageを表示する、または
  • どちらかのRectangleの両方を含むオブジェクトのArrayListを作成し、 Colorを選択し、各イベントでこれらのオブジェクトの新しいものを作成してリストに追加し、repaint()を呼び出します。次に、paintComponent内で、長方形を描画するリストを繰り返します。
  • オーバーライド内でsuperのpaintComponentメソッドを常に呼び出す必要があることを忘れないでください。

長方形を一定期間だけ表示する場合は、スイングタイマーを使用します。または、ユーザーがメッセージの受信を確認したときに、他のリスナーを使用します。再度、あなたの質問を明確にしてください。

チュートリアル:

+0

あなたは、私が各四角形を残してやろうとしていることで頭の爪を打つ。私はすべてのものjava(そして正直なところ、プログラミングにはかなり一般的です)になると、まだまだ超初心者ですので、あなたの提案と一緒に何かを組み立てようとする時間がかかります(私はそれを探しています今では1時間ほどかかりましたが、多くの進歩を遂げていませんでした。バッファリングされたイメージは全く新しいものであり、arraylistsはまだ私が学んでいるものです)それで数日間働くかどうかは分かりません。 – bailey2092

+0

私が持っている1つの質問は、再描画メソッドを呼び出すべきかどうかをオーバーライドしたメソッドの3番目の箇条書きです。私は実際にどのメソッドをオーバーライドしているのかはわかりません。 – bailey2092

+0

@ bailey2092:オーバーライドでsuperのメソッドを呼び出すと、paintComponentをオーバーライドします。最初のチュートリアルを見てください。私は今、上の答えにリンクを掲示しました。 2番目のチュートリアルでは、興味があれば詳しく説明します。 –

関連する問題