2017-02-21 8 views
-1

약간 혼란 스럽 습니다만, Netbeans에서 만든 jFrame이 있습니다. 이 jFrame에는 처음부터 setVisible(false);으로 설정된 jLabel이 있습니다. 특정 메서드가 호출 될 때마다 jLabel을 setVisible(true);으로 설정 한 다음 타이머를 사용하여 2 초 후에 다시 false으로 설정합니다. 분명히 작동하지 않을 것이고 이유를 파악할 수 없습니다. 나는 재 칠함을 알고있다. 방법을 찾을 수 있지만 그 작업을 만드는 방법 중 하나를 알아낼 수 있습니다.jLabel이 표시되지 않습니다

가시성을 설정하는 실제 방법은 현재 상태로 선을 인쇄하도록 설정 했으므로 알 수 있습니다.

내 실제 코드는, 아래 코드입니다.

public JFram() { 
     initComponents(); 
     setResizable(false); 
     jLabel2.setVisible(false); 
    } 

static void tesMethod() { 
      try { 
     //function that does something 
      } finally { 
       new JFram().showHide(); //call function which is supposed to change the vissibility of jLabel 
      } 
    } 

    void showHide() { 
      jLabel2.setVisible(true); 
      System.out.println("reached show"); 
      new java.util.Timer().schedule( 
       new java.util.TimerTask() { 
        @Override 
        public void run() { 
        jLabel2.setVisible(false); 
        System.out.println("reached timer"); 
        } 
       }, 
      2000 
      ); 
    } 

다음 코드는 repaint(); 방법.

void showHide() { 
      jLabel2.setVisible(true); 
      jLabel2.repaint(); 
      System.out.println("reached show"); 
      new java.util.Timer().schedule( 
       new java.util.TimerTask() { 
        @Override 
        public void run() { 
        jLabel2.setVisible(false); 
        jLabel2.repaint(); 
        System.out.println("reached timer"); 
        } 
       }, 
      2000 
      ); 
    } 
+0

'JLabel' 가시성을 가지고 노는 대신, 텍스트를 가지고 노는 것은 어떻습니까? (즉,'JLabel.setText ("");')를 호출하면 비슷한 효과가 나타납니다. – Frakcool

+0

또한 [java.util.Timer'] (https://docs.oracle.com/javase/7/docs/api/java/util/Timer.html)를 사용하지 말고 ['javax .swing.Timer'] (https://docs.oracle.com/javase/8/docs/api/javax/swing/Timer.html) – Frakcool

+0

@Frakcool 정말 감사드립니다. 나는 그 생각을하지 못했습니다. 시도한 후에도 문제는 여전히 존재하지만 여전히 작동하지 않습니다. 모든'setVisible' 행을'setText ("")'또는'setText ("Done")'로 변경했습니다. – Sm00rf9000

답변

2

내 생각에 문제는 주로 대신 javax.swing.Timer이 사용되고 아마도 Event Dispatch Thread (EDT)을 차단하고있는 것 같습니다.

이 코드를 시도해보고 비교할 수 있으며 프레임에 JLabel을 추가하는 위치가 표시되지 않습니다.

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 
import javax.swing.Timer; 

public class ShyLabel { 

    private JFrame frame; 
    private JLabel label; 
    private Timer timer; 
    private boolean isVisible; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new ShyLabel().createAndShowGui(); 
      } 
     }); 
    } 

    public void createAndShowGui() { 
     String labelText = "I'm a shy label that hides every 2 seconds"; 

     isVisible = true; 
     frame = new JFrame(getClass().getSimpleName()); 
     label = new JLabel(labelText); 
     timer = new Timer(2000, new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       label.setText(isVisible ? "" : labelText); 
       isVisible = !isVisible; 
      } 
     }); 

     timer.setInitialDelay(2000); 
     timer.start(); 

     frame.add(label); 
     frame.pack(); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 

아래의 이미지는 ... 그러나 때문에 나는 그것이 그것이 있어야로 2 초 복용 빠른 대신 정말 보이는 GIF를 기록 시간, 위의 코드에 의해 생성된다

enter image description here

0

레이아웃의 문제 일 수 있습니다. 레이아웃 계산이 일어나기 전에 resizable을 false로 설정하면 레이블은 첫 번째 레이아웃 시점까지 무시됩니다 (보이지 않음). revalidate()를 시도해 볼 수 있습니다.

+0

코드에'revalidate();'줄을 어디에 넣을까요? – Sm00rf9000

+0

레이블의 부모에서 레이블에서 setVisible (true)을 호출 한 직후입니다. –