2017-10-15 1 views
0

1 초 간격 후에 라벨의 가시성을 false로 설정해야하는 프로그램을 작성 중입니다. 프로그램이 꽤 길고 복잡하여 설명하기가 쉽습니다. 레이블 배열이 있고 레이블이 setVisible (false) 될 때마다 slp() 메서드가 실행됩니다.시간이 지나면 레이블을 보이지 않게하기 NetBeans

public void slp() 
{ 
    try{ 
     Thread.sleep(1000); 
    } 
    catch(Exception e) 
      { 
       System.out.println(e); 
      } 
} 

하지만 문제가 있습니다. 이 메소드는 스레드의 실행 시간을 증가시키고 모든 레이블은 마침내 함께 보이지 않게됩니다. 나는 애니메이션 효과가 필요하고, 그것은 오지 않을 것이다. 내 문제에 대한 좋은 해결책은 무엇입니까? 타이머가 나를 섬길 수 있습니까?

+0

을 수행해야 새 스레드에서 1 초 대기를 실행하십시오. – cello

+0

내가 그걸 어떻게 할 수 있는지 말해 줄 수 있니? –

답변

0

먼저 slp의 방법은 인수로 JLabel 일 것이므로 특정 라벨의 가시성을 수정할 수 있습니다. 그렇지 않으면 메서드는 숨길 레이블을 알 수 없습니다.

둘째, 주 스레드 (또는 클래스가 slp() 인 모든 스레드)를 차단하지 않으려면 Thread.sleep(1000)을 자체 스레드에서 실행해야합니다. 그래서 아래의 코드는 new Thread(....).start();을 사용하여 실제 작업을 수행 할 새 스레드를 만듭니다.

셋째, 대기 상태가 별도의 스레드이므로, 레이블 가시성 변경은 스윙 이벤트 스레드에서 다시 수행해야합니다. 이를 위해 SwingUtilities.invokeLater()을 사용하여 레이블의 가시성을 설정합니다. 모두 함께

코드는 다음과 같이 수 :

public void slp(JLabel label) { 
    new Thread(new Runnable() { 
     public void run() { 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
        label.setVisible(false); 
       } 
      }); 
     } 
    }).start(); 
} 

코드는 자바 8부터 사용할 수와 같은 람다 표현식을 사용하여 "정리"더 수 :

public void slp(JLabel label) { 
    new Thread(() -> { 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     SwingUtilities.invokeLater(() -> label.setVisible(false)); 
    }).start(); 
} 
+0

작동하지 않습니다. 레이블을 매개 변수로 사용하지 않았다는 것을 제외하고는 첫 번째 코드를 사용했습니다. 그것은 전 세계적 이었기 때문에 직접 언급했습니다. 하지만 지금은 slp()에 들어 가지 않은 것처럼 보입니다. –

+0

위의 코드는 1 초 후에 라벨을 숨 깁니다. 작동하지 않는 경우 코드에서 다른 부분이 잘못되어 있어야합니다. 추측 대신에 우리가 당신을 도울 수 있도록 [mcve]를 게시하십시오. – cello

관련 문제