2017-02-21 10 views
-1

私は少し混乱していますが、私はNetbeansで作成したjFrameを持っています。このjFrameのjLabelは、最初からsetVisible(false);に設定されています。特定のメソッドが呼び出されるたびに、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

...しかしので、私はそれが本当に速い代わりに、それがあるべきとして2秒を取るに見えるGIFを記録した時の、上記のコードによって生成されます'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の代わりにjava.util.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); 
    } 
} 

下の画像は

enter image description here

0

レイアウトの問題かもしれません。 レイアウト計算が行われる前にresizableをfalseに設定すると、ラベルは最初のレイアウト時までに無視されます(不可視)。 あなたはrevalidate()を試すことができます。

+0

私のコード内に 'revalidate();' – Sm00rf9000

+0

ラベルの親で、ラベル上でsetVisible(true)を呼び出した直後。 –

関連する問題