所以我有七个不同颜色的面板需要按顺序旋转。我的代码在大多数情况下运行良好,但第一个和最后一个面板始终具有相同的颜色。我该如何解决这个问题?
我已经检查过我的每个面板在启动时都有不同的颜色。
代码:
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 );
}
快照(更改前):
快照(更改后)
最佳答案
除了违反 Swing 的单线程规则之外,基本问题是您依赖于背景已更改的组件中的值...
violetPanel.setBackground(redPanel.getBackground());
当您调用此函数时,redPanel
的背景现已设置为 orangePanel
背景。
相反,在更改任何内容之前,首先获取 redPanel
的背景颜色,然后将其应用到 violetPanel
Color redBackground = redPanel.getBackground();
redPanel.setBackground(orangePanel.getBackground());
//...
violetPanel.setBackground(redBackground);
看看(并让你的老师也这样做)Concurrency in Swing和 How 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/