2012-01-31 15 views
1

JPanelには、2秒ごとに色を変えるタイマーを使って複数の(25)JLabelがあります同じ色に変更する)、ランダムな順序に従って、各変更にテキストプリントを追加したため、その順序しか表示されませんが、各変更の間に遅延を追加しても、色が一緒に変化します目は漸進的な変化を見ることができませんでした)、それは助けにはなりませんでした。いくつかの `JPanel`がJava Swingと一緒に色を一つずつ変更します。

色を1つ1つ変更するにはどうすればよいですか?

コード:

public class Billboard extends JFrame{ 


    private JPanel board; 
    private ArrayList<Panel> panels; 


    public Billboard() 
    { 
     super("Billboard"); 
     this.board = new JPanel(); 
     setBounds(100,100,250,160); 
     this.panels = new ArrayList<Panel>(0); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Container con=this.getContentPane(); // inherit main frame 
     con.add(board); // add the panel to frame 
     //The timer that is responsible to changing the colors 
     ColorGenerator cg = ColorGenerator.getInstance(); 

     RandomNotifier note = new RandomNotifier(); 
     cg.setNotificator(note); 

     JLabel l; 
     Panel p; 
     for (int i=0; i<25; i++) { 
      // create label 
      l= new JLabel ("    "); 
      l.setOpaque(true); 
      // add label to screen 
      board.add(l); 
      // create panel 
      p = new Panel("p" + i,l); 
      // link ColorGenerator to panel 
      cg.addObserver(p); 
      // add panel to panels list 
      panels.add(p); 
     } 
     setVisible(true); // display the frame 
     //starts the timer 
     cg.start(); 
    } 

    public static void main(String args[]) {new Billboard();} 
} 



public class Panel implements Observer{ 

    private String _name; 
    private Color _color; 
    private JLabel _label; 

    public Panel (String name, JLabel l) { 
     this._name = name; 
     this._color= new Color(0,0,0); 
     this._label = l; 
     this._label.setBackground(this._color); 
     checkRep(); 
    } 

    //updates the color of the label 
    public void update(Observable o, Object arg) { 
     ColorGenerator cg = (ColorGenerator) o; 
     setColor(cg.getColor()); 
     this._label.setBackground(this.getColor()); 
     System.out.println(this.getName() + " has changed its color."); 
    } 

    private void setColor(Color c) { 
     this._color = c; 
    } 

    private Color getColor() { 
     return this._color; 
    } 
} 

public class ColorGenerator extends Observable { 

    private Notifier _notifier; 
    private Color _color; 
    private Timer _timer; 
    private ArrayList<Panel> _observers; 

    //hold the link to the only ColorGenerator 
    private static ColorGenerator _cg = null; 

    public static ColorGenerator getInstance() { 
     if (_cg == null) { 
      _cg = new ColorGenerator(); 
     } 
     return _cg; 
    } 

    protected ColorGenerator() { 
     ActionListener changeColorTask = new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
       Random rand_gen = new Random(); 
       _color = new Color (rand_gen.nextInt(256),rand_gen.nextInt(256),rand_gen.nextInt(256)); 
       setChanged(); 
       notifyObservers(); 
      } 
     }; 
     this._color = new Color(0,0,0); 
     this._timer = new Timer(2000, changeColorTask); 
     this._timer.setInitialDelay(0); 
     this._observers = new ArrayList<Panel>(); 
     this._notifier = null; 
    } 

    public void start() { 
     this._timer.start(); 
    } 


    public Color getColor() { 
     return this._color; 
    } 

    @Override 
    public void addObserver(Observer o) { 
      //... 
    } 

    @Override 
    public void deleteObserver(Observer o) { 
     //... 
    } 

    @Override 
    public void deleteObservers() { 
      //... 
    } 

    @Override 
    public int countObservers() { 
     //... 
    } 

    @Override 
    public void notifyObservers(){ 
     if (!hasChanged()) 
      return; 
     if (this._notifier == null) { 
      System .out.println ("Notificator has not set for ColorGenerator, can't notify observers"); 
      return; 
     } 
     this._notifier.notifyAll(this,this._observers); 
     clearChanged(); 
    } 

    public void setNotifier (Notifier n) { 
     if (n == null) 
      return; 
     this._notifier = n; 
    } 
} 
+0

ColorGeneratorのコードを表示してください。 –

+0

すぐに役立つように、[SSCCE](http://sscce.org/)を投稿してください。 –

+0

そして、RandomNotifierはどのように見えますか? –

答えて

1

あなたは色が変更する場合JFrameのか、JPanelの上repaint()を呼び出す必要があります。

関連する問題