2017-02-21 11 views
-1

Ich bin leicht verwirrt, ich habe eine jFrame von denen ich in Netbeans gemacht habe. Dieser jFrame hat ein jLabel, das von Anfang an auf setVisible(false); gesetzt ist. Wann immer eine bestimmte Methode aufgerufen wird, setze ich dann jLabel auf setVisible(true); und benutze dann einen Timer, um es nach 2 Sekunden wieder auf false zu setzen. Anscheinend wird es nicht funktionieren und ich kann nicht herausfinden warum. Ich kenne das Repaint(); Methode, aber kann herausfinden, wie man diese Arbeit auch macht.jLabel wird nicht angezeigt

Ich weiß, dass die tatsächliche Methode zum Einstellen der Sichtbarkeit aufgerufen wird, wie ich es eingestellt habe, um eine Zeile mit dem aktuellen Status zu drucken, was es tut.

Mein tatsächlicher Code ist der folgende.

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 
      ); 
    } 

Der folgende Code ist hier, wie ich das Neuzeichnen zu verwenden versucht(); Methode.

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

wirklich schnell sieht sein soll Statt mit 'JLabel' Sichtbarkeit zu spielen, warum nicht mit seinem Text spielen? (d. h. 'JLabel.setText (" ");'), was einen ähnlichen Effekt verursacht. – Frakcool

+0

Sie sollten auch keinen ['java.util.Timer'] (https://docs.oracle.com/javase/7/docs/api/java/util/Timer.html), sondern einen [' javax .swing.Timer'] (https://docs.oracle.com/javase/8/docs/api/javax/swing/Timer.html) – Frakcool

+0

@Frakcool Ich schätze den Input wirklich, daran hatte ich nicht gedacht. Nach dem Versuch, ist das Problem immer noch da und es wird immer noch nicht funktionieren. Ich habe alle 'setVisible' Zeilen in' setText ("") 'oder' setText ("Done") 'geändert. – Sm00rf9000

Antwort

2

Ich denke, Ihr Problem liegt hauptsächlich in Ihnen mit einem java.util.Timer anstelle von javax.swing.Timer und wahrscheinlich blockieren Sie die Event Dispatch Thread (EDT).

Sie könnten diesen Code ausprobieren und vergleichen Sie mit Ihrem, ich sehe auch nicht, wo Sie Ihre JLabel zu Ihrem Rahmen hinzufügen.

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); 
    } 
} 

Das Bild unten ist wegen der Zeit, die durch den obigen Code jedoch produziert ich die GIF aufgezeichnet es anstatt mich 2 Sekunden, wie es ...

enter image description here

0

Vielleicht ist es ein Problem des Layouts. Da Sie die Größe auf "false" setzen, bevor eine Layoutberechnung durchgeführt wurde, wurde die Beschriftung zum Zeitpunkt des ersten Layouts ignoriert (als unsichtbar). Sie könnten versuchen, revalidate().

+0

Ich schätze die Eingabe, wo würde ich die 'revalidate(); Zeile in meinem Code? – Sm00rf9000

+0

Auf dem Elternelement des Labels, direkt nach dem Aufrufen von setVisible (true) auf dem Label. –