所以我有七个不同颜色的面板需要按顺序旋转。我的代码大部分都运行良好,但第一个和最后一个面板总是具有相同的颜色。我该如何解决这个问题?
我已经检查过每个面板在开始时都有不同的颜色。
代码:
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 );
}
快照(更改前):
快照(更改后)
答案 0 :(得分:1)
基本问题,除了你违反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
,则应在invokeLater
来电中将更改包装到用户界面中,例如......
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Color redBackground = redPanel.getBackground();
redPanel.setBackground(orangePanel.getBackground());
//...
violetPanel.setBackground(redBackground);
}
});