2014-04-05 4 views
0

내 애니메이션과 JComboBox에 문제가 있습니다. 내 응용 프로그램에서는 마우스와 키보드를 사용하거나 애니메이션을 설정하여 모양을 이동하고 변형 할 수 있습니다.스윙 반복되는 페인트 다시 칠하기 JComboBox 깜박임

내 구성 요소 계층 구조는 다음과 같습니다. JFrame에 배치 된 JPanel에는 EditorCanvas라는 모양의 패널이 포함되어 있으며 모양은 수정되고 그려지며 일부 JButtons 및 JComboBox가 포함 된 DrawMenu라는 패널이 있습니다.

JFrame의 -> 인 JPanel -> EditorCanvas
JFrame의 -> 인 JPanel -> DrawMenu -> JComboBox에

JComboBox가 클릭에 캔버스에 추가 할 모양을 선택하는 데 사용됩니다. 또 다른 스레드에서 새 위치 등을 계산 한 후 매 10ms마다 캔버스에서 repaint()을 호출합니다.

문제는 팝업을 열 자마자 사라질 수 있다는 점입니다. 그리고 이것은 내 repaints에 의해 어느 시점에서 발생합니다. 정말 이상한 점은 내 JComboBox는 다른 패널에 배치되므로 다시 그려서는 안됩니다.

SwingUtilities.invokeLater에서 호출 한 Runnable에서 다시 그리기 호출을 바꾸려고했지만 문제는 그대로였습니다. 여기

내 코드의 몇 가지 관련 부분입니다 :

public class EditorCanvas extends JPanel implements MouseListener, MouseMotionListener, KeyListener { 

    ... 

    @Override 
    public void paintComponent(Graphics g) { 

     super.paintComponent(g); 

     // To keep keyboard focus 
     this.requestFocusInWindow(); 

     this.graphics = (Graphics2D) g.create(); 

     this.graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

     this.mainRenderer.paintAll(this.graphics); 
    } 


public class AnimationManager implements Runnable { 

    ... 

    public void run() { 

     try { 

      while (Thread.currentThread() == this.thread) { 

       // Update time values 
       double curTime = System.currentTimeMillis(); 
       double deltaTime = curTime - this.lastTime; 
       this.lastTime = curTime; 

       for (Animation anim : this.animations) { 
        anim.update(deltaTime); 
       } 

       SwingUtilities.invokeLater(new Runnable() { 
        public @Override void run() { 
         EditorParameters.getCanvas().repaint(); 
        } 
       }); 

       // Pause the animation if it has to 
       synchronized (this) { 

        while (this.pause) { 
         System.out.println("\nAnimation paused!\n"); 
         this.wait(); 
        } 
       } 

       Thread.sleep(SLEEP_TIME); 
      } 
+0

'repaint' 대신'validate/revalidate/invalidate'을 시도하십시오. 완전한 테스트 가능한 코드를 공유하지 않았기 때문에 작동 여부는 말할 수 없습니다. – Braj

답변

1
문제는 팝업

도장 방법 즉시 사라에만 페인팅이기 때문에 나는 더 이상 내 JComboBox의를 사용할 수 없다는 것입니다

.

this.requestFocusInWindow(); 

그리기 메소드에서 이와 같은 메소드를 호출하면 안됩니다.

왜 사용자 정의 패널이 필요한지 알지 못합니다. 다른 구성 요소의 paintAll() 메소드를 호출하면 안됩니다. 스윙은 패널의 모든 하위 구성 요소를 페인팅 한 후에 보입니다.

+0

사실 JComboBox 나 다른 것들을 다시 칠하고 싶지는 않습니다. EditorCanvas를 다시 그리면 다시 그려집니다. 필자가 원하는 것은 분명하지 않지만 필자는 EditorCanvas를 다시 칠할뿐만 아니라 다른 패널도 다시 칠할 수 있다고 생각합니다. – Tenma

+0

그리고 다른 발언은 : 나는 자주 이해하지 않고 키보드 포커스를 잃어 버리기 때문에 requestFocusInWindow()를 호출했습니다. paintAll은 패널에 도형을 그리는 다른 클래스의 메서드입니다.이 메서드 이름이 미리 정의 된 일부 Swing 클래스에 이미 있음을 발견했습니다. – Tenma

+0

@ user3501153,'자주 키보드 포커스를 잃어 버리기 때문에 '- 물론 콤보 상자를 클릭하면 키보드 포커스를 잃게됩니다. paintComponent() 메서드에서 requestFocusInWindow() 메서드를 호출하는 것은 해결책이 아닙니다. 솔루션은 KeyListener를 사용하지 않고 [Key Bindings] (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html)를 사용하는 것입니다. 추가 도움이 필요하면 문제를 나타내는 적절한 [SSCCE] (http://www.sscce.org/)를 게시해야합니다. – camickr