jLabel不会显示

时间:2017-02-21 17:23:02

标签: java swing timer jlabel visibility

我有点困惑,我有一个我在Netbeans中制作的jFrame。这个jFrame有一个jLabel,从一开始就设置为setVisible(false);。无论何时调用特定方法,我都会将jLabel设置为setVisible(true);,然后使用计时器在2秒后再次将其设置为false。显然它不起作用,我无法弄清楚为什么。我知道重绘();方法,但也可以弄清楚如何使这项工作。

我知道设置可见性的实际方法被调用,因为我已将其设置为打印具有当前状态的行,它会执行此操作。

我的实际代码如下所示。

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

2 个答案:

答案 0 :(得分:2)

我认为您的问题主要在于您使用java.util.Timer而不是javax.swing.Timer而且可能阻止了Event Dispatch Thread (EDT)

您可以尝试使用此代码并将其与您的代码进行比较,我也不知道您将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); } } 添加到框架中的位置。

{{1}}

下面的图片是由上面的代码生成的,但由于我记录GIF的时间看起来非常快,而不是花费2秒,因为它应该是......

enter image description here

答案 1 :(得分:0)

可能是布局问题。 在任何布局计算发生之前将resizable设置为false时,标签在第一次布局时被忽略(不可见)。 你可以尝试revalidate()。