2012-02-29 11 views
2

はい、これは宿題です。はい、私は完全に立ち往生しています。スイング、Javaおよびマルチスレッド、および着色ボタン

ここは要点です。私はJFrameを作成しました。 3つのパネル(上、中央、下)があります。下のパネルには、赤、緑、青の3つのボタンがあります。上部のパネルには、それぞれのボタンをクリックした回数を示す3つのテキストフィールドがあります。私たちが許される最大値は各ボタンごとに10です。中央パネルには、0から63までの番号のJボタンが8 x 8グリッドあります。

ボタンをクリックするたびにスレッドが開始されます。スレッドが死ぬことはないスレッドが開始すると、0から63までの数字がランダムに選択されます。その番号に対応するJButtonは、クリックされた色で塗りつぶされます。赤いボタンをクリックした場合、白い背景のボックスが赤くなるはずです。しかし、そのJButtonの色は白になるまで退色し始めます。プロセスには約8秒かかります。

作成したスレッドでは、Swingコンポーネントにアクセスできません。むしろ、データ構造を維持し、スレッドの実行サイクルに従って更新する必要があります。一方、メインスレッドから定期的にrepaint()メソッドを呼び出して、Swing Event Dispatcherスレッドを招待し、最終的にデータ構造の内容を参照し、それに応じてGUIコンポーネントを表示します。

........私はすべてのオブジェクトを作成して表示しました。ボタンを10回以上クリックすることはできません。ここに私がいます:

私は2つの配列を持っています:1つはサイズ64の文字列の配列です。これらはボタンを表しています。私もintの配列を持っています。これは、スレッドが作成された順序を知るためのものです。ボタンをクリックするとスレッドが作成され、開始しました。ここでは、スレッドのための私のrunメソッドは次のとおりです。

public void run() { 
    Random num = new Random(new Date().getTime()); 
    while (true) { 
     Thread j = Thread.currentThread(); 
     int randInt = num.nextInt(64); 
     synchronized (lock) { 

      if ((array[randInt].compareTo("red") == 0 
       || array[randInt].compareTo("blue") 
       == 0 || array[randInt].compareTo("green") == 0)) 
      { 
       randInt = num.nextInt(64); 
      } 
      for (int k = 0; k < 10; k++) { 
       if (threadarray[k] == -1) { 
        threadarray[k] = randInt; 
        break; 
       } 
      } 

     } 
    } 
} 

我々はそれをカバーしていないにもかかわらず、私はすぐに右のロック部の外に消えTimerオブジェクトを使用しようとしました。これは私をactionPerformedメソッドに連れて行きます。私はすべての適切な登録を追加しました。

public void actionPerformed(ActionEvent arg0) { 
    for (int i = 0; i < threadarray.length; i++) { 

     int num = threadarray[i]; 
     if (num != -1) { 
      System.out.println(num); 
      String s = array[num]; 
      System.out.println(s + "is "); 
      if (s.compareTo("red") == 0) { 
       button[num].setOpaque(true); 
       button[num].setBackground(Color.red); 
       while (button[num].getBackground() != Color.white) { 
        System.out.println("not white yet"); 
        int g = button[num].getBackground().getGreen(); 
        int b = button[num].getBackground().getBlue(); 
        if (255 - (g + 1) >= 0) { 
         Color c = new Color(255, g + 1, b + 1, 1); 
         button[num].setOpaque(true); 
         button[num].setBackground(c); 
         System.out.println(c + " " + " c is"); 
        } else { 
         button[num].setBackground(Color.white); 
        } 
       } 
      } 

      System.out.println(i + " i is " + button[num].getBackground()); //just some debugging info 
      threadarray[i] = -1; //clear the thread array 
      array[num] = "0"; //clear the string array 

     } 
    } 
} 

actionPerformedメソッドは、イベントディスパッチスレッドによって処理されます。 (ちょうど上のコードは赤いスレッドのみのものですが、緑と青の色が白になるまで彩度を上げて色を消していくことを考えています)問題:赤いボタンをクリックするとボタンが変わることはありません(はい、適切な登録が行われています)私はまた、スレッドの数が多くなるとタイミングを制御する方法がわかりません。

+0

宿題の場合は、「宿題」タグを入れます。 – Tudor

+2

すぐに役立つヘルプ[SSCCE](http://sscce.org/) – mKorbel

+2

で質問を編集してくださいまた、問題の詳細についてさらに説明してください。ボタンの色の変更は表示されませんが、actionPerformedからのテキスト出力が表示されますか? – toto2

答えて

2

あまりにも多くを与えることなく、これはexampleは、setBackground()を無視する色とボタンを処理する方法を示しています。例herehereは、色を消す方法を示しています。どちらもスレッドのjavax.swing.Timerに依存していますが、どちらも解決策ではありませんしかし、この手法は有用であるといえます。

関連する問題