如何让我的JPanels以正确的周期顺序改变颜色?

时间:2014-03-05 03:00:41

标签: java swing

所以我有七个不同颜色的面板需要按顺序旋转。我的代码大部分都运行良好,但第一个和最后一个面板总是具有相同的颜色。我该如何解决这个问题?

我已经检查过每个面板在开始时都有不同的颜色。

代码:

     public void run()
  {
     TimerTask colorAction = new TimerTask(){
       public void run()
   {                                   
           redPanel.setBackground(orangePanel.getBackground());           
           orangePanel.setBackground(yellowPanel.getBackground());
           yellowPanel.setBackground(greenPanel.getBackground());
           greenPanel.setBackground(bluePanel.getBackground());
           bluePanel.setBackground(indigoPanel.getBackground());
           indigoPanel.setBackground(violetPanel.getBackground());
           violetPanel.setBackground(redPanel.getBackground());                      
   }        
     }; 
    java.util.Timer utilTimer  = new java.util.Timer();
      utilTimer.scheduleAtFixedRate(colorAction, START_AFTER, DELAY );                 
  }

快照(更改前):

enter image description here

快照(更改后)

enter image description here

1 个答案:

答案 0 :(得分:1)

基本问题,除了你违反Swing的单线程规则这一事实,你是依赖于背景已经改变的组件中的值...

violetPanel.setBackground(redPanel.getBackground());  
在你打电话的时候,

redPanel的背景现在设置为orangePanel背景。

相反,在更改任何内容之前先抓住redPanel的背景颜色,然后将其应用到violetPanel

Color redBackground = redPanel.getBackground();
redPanel.setBackground(orangePanel.getBackground());
//...
violetPanel.setBackground(redBackground);  

请在Concurrency in SwingHow to Use Swing Timers查看(并让您的老师也这样做)以获取更多详情......

如果您必须使用java.util.Timer,则应在invokeLater来电中将更改包装到用户界面中,例如......

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        Color redBackground = redPanel.getBackground();
        redPanel.setBackground(orangePanel.getBackground());
        //...
        violetPanel.setBackground(redBackground);  
    }
});