2012-08-15 2 views
2

GlassPane을 사용하여 아이콘을 사용자에게 플래시하려고합니다. 완전히 호출 얻을 관리하지 않은 paintComponent 방법으로,Java Swing - 아이콘이 깜박임을 표시하지 않습니다.

for (int i = 0; i < 3; i++) { 
    frame.getGlassPane().setVisible(true); 
    try { 
     Thread.sleep(500); 
    } catch (InterruptedException e1) { 
     //To change body of catch statement use File | Settings | File Templates. 
     e1.printStackTrace(); 
    } 
    frame.getGlassPane().setVisible(false); 
} 

불행히도, 내가 EDT (타이머 내에서 현재의 thread)을 잠 경우, 아이콘이 표시되지 않습니다 : 나는 기본적으로 수행하는 A가 javax.swing.Timer이 실행하고 실이 잠들기 전에 따라서 다음 명령이 시작되면 유리 창은 숨겨지고 결과적으로 아이콘이 표시되지 않습니다. 이 (similiar) 접근 방식을 사용하여 내가 원하는 것을 얻을 수있는 방법이 있습니까?

+0

더 많은 예제를 사용할 수 있습니다 (http://stackoverflow.com/a/2234020 : 다음은 간단한 예이다 (생각을 이해하기에 충분합니다)/230513) 및 [여기] (http://stackoverflow.com/a/2124507/230513). – trashgod

답변

5

당신은 [여기]는 javax.swing.Timer

public FlashTimer() { 

    javax.swing.Timer flashTimer = new javax.swing.Timer(500, new FlashHandler()); 
    flashTimer.setCoalesce(true); 
    flashTimer.setRepeats(true); 
    flashTimer.setInitialDelay(0); 

} 

public class FlashHandler implements ActionListener { 

    private int counter; 

    @Override 
    public void actionPerformed(ActionEvent ae) { 

     countrol.setVisible(counter % 2 == 0); 
     counter++; 
     if (counter > 3) { 

      ((Timer)ae.getSource()).stop(); 

     } 

    } 

} 
+0

정신적 인 참고 - 실행 사이에'counter '를 재설정해야한다.) – MadProgrammer

3

분명해야합니다 - 별도의 스레드를 사용하고 "깜박이는 논리"를 수행하지만 EDT에서 UI를 수정하십시오.

public static void main (String[] args) 
{ 
    JFrame frame = new JFrame(); 

    final JLabel label = new JLabel ("X"); 
    label.setBorder (BorderFactory.createEmptyBorder (90, 90, 90, 90)); 
    frame.add (label); 

    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setLocationRelativeTo (null); 
    frame.setVisible (true); 

    new Thread (new Runnable() 
    { 
     public void run() 
     { 
      for (int i = 0; i < 15; i++) 
      { 
       try 
       { 
        setVisible (false); 
        Thread.sleep (500); 
        setVisible (true); 
        Thread.sleep (500); 
       } 
       catch (InterruptedException e1) 
       { 
        // 
       } 
      } 
     } 

     private void setVisible (final boolean visible) 
     { 
      SwingUtilities.invokeLater (new Runnable() 
      { 
       public void run() 
       { 
        label.setVisible (visible); 
       } 
      }); 
     } 
    }).start(); 
} 
+0

Timer action body가 EDT에서 수행되기 때문에 javax.swing.Timer – MadProgrammer

+0

@MadProgrammer를 사용하여 프로세스를 간단하게 수행 할 수 없습니다 (sleep 문을 사용할 경우). 그 이유는 내가 별도의 스레드를 사용합니다. 타이머가없는 sleep 문을 사용하면 쉽게 수행 할 수 있지만 각 타이머 이벤트와 함께 구성 요소 가시성을 변환해야합니다. 어쨌든 두 접근법 모두 가능하고 정확합니다 ... –

+0

타이머로 잠을 자고 싶지 않아서 타이머가 수면을 처리하고 ActionEvent에 응답하게하십시오. – MadProgrammer