2017-02-21 5 views
-1

Я немного смущен, у меня есть jFrame, который я сделал в Netbeans. Этот jFrame имеет jLabel, из которого с самого начала установлено значение setVisible(false);. Всякий раз, когда вызывается конкретный метод, я затем устанавливаю jLabel в setVisible(true);, а затем снова использую таймер, чтобы снова установить его на false через 2 секунды. По-видимому, это не сработает, и я не могу понять, почему. Я знаю о перекраске(); метод, но может понять, как это сделать.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

Я думаю, что ваша проблема в основном в том, что вы используете 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); 
    } 
} 

На рисунке ниже продуцируется выше кода, однако из-за времени, я записал GIF она выглядит очень быстро вместо того, чтобы через 2 секунды, как это должно быть ...

enter image description here

0

Возможно, это проблема компоновки. По мере того, как вы устанавливали значение false до того, как произошел какой-либо расчет макета, метка была проигнорирована (как невидимая) к моменту первого макета. Вы можете попробовать revalidate().

+0

Я ценю ввод, где бы я положил строку 'revalidate();' внутри моего кода? – Sm00rf9000

+0

На родительском ярлыке, сразу после вызова setVisible (true) на ярлыке. –

Смежные вопросы