2014-03-05 2 views
0

그래서 순서대로 회전해야하는 다른 색상의 일곱 패널이 있습니다. 내 코드는 대부분 잘 작동하지만 첫 번째 패널과 마지막 패널은 항상 같은 색상을 사용합니다. 이 문제를 어떻게 해결할 수 있습니까?JPanel이 올바른 순환 순서로 색상을 변경하도록하려면 어떻게해야합니까?

각 패널의 색상이 시작될 때마다 다른지 확인했습니다.

코드 : (변경 전)

 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

자, 먼저 java.util.Timer를 사용하지 말고'javax.swing.Timer'를 사용하십시오! – MadProgrammer

+0

@MadProgrammer 우리가 java.util.Timer를 사용한다는 것을 강조하는 과제입니다.하지만 조언을 구할 것입니다. – user2840682

+0

다음은 스윙의 단일 스레드 요구 사항을 위반하므로 할당이 잘못되었습니다. – MadProgrammer

답변

1

기본적인 문제, 다른 한 후 사실 너는 위반하고있다. 스윙의 단일 스레드 규칙, 당신은

violetPanel.setBackground(redPanel.getBackground()); 

redPanel의 배경은 지금이 전화를 시간으로 orangePanel 배경으로 설정 ... 그 배경 이미 변경된 구성 요소의 값에 의존하고있다. 당신은 아무것도를 변경하기 전에

대신 먼저 잡아 redPanel의 배경 색상은 다음을 살펴보십시오 (과 동일한 기능을 수행하는 선생님을 얻을) Concurrency in Swing에서 더 자세한 내용은 How to Use Swing TimersvioletPanel

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

에 적용 ...

당신이 java.util.Timer를 사용해야하는 경우, 당신은 ... 예를 들어, invokeLater 호출 UI에 대한 변경 사항을 포장해야

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