java - 如何让 JPanel 以正确的循环顺序改变颜色?

标签 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

最佳答案

除了违反 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,您应该将对 UI 的更改包装在 invokeLater 调用中,例如...

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

关于java - 如何让 JPanel 以正确的循环顺序改变颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22187618/

相关文章:

java - 使用 AwesomeFont 中的自定义字体和 Java Swing 中的 unicode 字符向 JButton 添加图标?

java - 更新 JDialog 时焦点丢失

java - 为什么setLayout方法不能与JPanel的ArrayList一起使用

java - 在 HDFS 上使用 libhdfs 进行文件 i/o

java - 将 Google map 添加到 Flutter 时找不到 API key

java - 即使构建失败,VS Code仍会运行Java文件?

java - 在 GWT 之外使用 Flextable

java.lang.classcastException Linearlayout.layoutParams 无法转换为framelayout.layoutparams

java - Netbeans 中 jtextpane 中的行号

java - 其他线程中的忙循环延迟了 EDT 处理