2017-02-21 113 views
-1

我有點困惑,我有一個我在Netbeans中製作的jFrame。這jFrame有一個jLabel,其中從一開始就設置爲setVisible(false);。無論何時調用特定方法,我都會將jLabel設置爲setVisible(true);,然後在2秒後再次使用計時器將其設置爲false。顯然它不會工作,我無法弄清楚爲什麼。我知道repaint();方法,但也可以找出如何使這項工作。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(「完成」)'。 – Sm00rf9000

回答

2

我認爲你的問題主要在於你使用的是java.util.Timer而不是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

可能是佈局問題。 在任何佈局計算髮生之前將可調整大小設置爲false時,標籤在第一個佈局時被忽略(如不可見)。 你可以嘗試revalidate()。

+0

我很欣賞輸入,我會在哪裏將'revalidate()'行放在我的代碼中? – Sm00rf9000

+0

在標籤的父級上,在標籤上調用setVisible(true)之後。 –