Изтриване на текст от JLabel след 5 секунди?

Исках да знам дали има някакъв лесен начин за изтриване на съдържанието (текста) от JLabel след 5 секунди. Това възможно ли е? Тъй като имам JLabel в JFrame и той показва някои вътрешни грешки от програмата, която кодирам, и искам JLabel да покаже съобщението за няколко секунди и след това да остане празно. Някакви идеи?


person Pablo Stein    schedule 03.02.2013    source източник
comment
Предлагам да използвате таймер.   -  person Code-Apprentice    schedule 03.02.2013


Отговори (4)


Най-простото решение е да използвате Swing Timer. Това ще предотврати замразяването на графичния потребителски интерфейс и ще осигури правилен достъп до нишката (т.е. модификацията на потребителския интерфейс се извършва на 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;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestLabelDelete {
    private JFrame frame;
    private JLabel label;

    protected void initUI() {
        frame = new JFrame(TestLabelDelete.class.getSimpleName());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        label = new JLabel("Some text to delete in 5 seconds");
        frame.add(label);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        Timer t = new Timer(5000, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                label.setText(null);
            }
        });
        t.setRepeats(false);
        t.start();
    }

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException,
            UnsupportedLookAndFeelException {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                TestLabelDelete testLogin = new TestLabelDelete();
                testLogin.initUI();
            }

        });
    }

}
person Guillaume Polet    schedule 03.02.2013

Използвайте Таймер. Моля, вижте моя пример.

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;

public class SourceCodeProgram {

    private static void createAndShowGUI() {
        // Make sure we have nice window decorations.
        JFrame.setDefaultLookAndFeelDecorated(true);

        // Create and set up the window.
        JFrame frame = new JFrame("HelloWorldSwing");
        frame.setMinimumSize(new Dimension(200, 300));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Add the ubiquitous "Hello World" label.
        final JLabel label = new JLabel("Hello World");
        frame.getContentPane().add(label);

        // Display the window.
        frame.pack();
        frame.setVisible(true);

        Timer timer = new Timer(5000, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // Clear text or whatever you want
                label.setText("New text");
            }
        });
        // start Tick-Tack
        timer.start();
    }

    public static void main(String[] args) {
        // Schedule a job for the event-dispatching thread:
        // creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

Или можете да напишете отделен клас, който може да изчисти етикета.

class JLabelCleaner {

    private JLabel label;
    private int waitSeconds;

    public JLabelCleaner(int waitSeconds, JLabel label) {
        this.label = label;
        this.waitSeconds = waitSeconds;
    }

    public void startCountdownFromNow() {
        Timer timer = new Timer(waitSeconds * 1000, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                label.setText("");
            }
        });
        timer.start();
    }
}

Сега можете да го използвате, когато имате нужда от него по следния начин:

new JLabelCleaner(5, label).startCountdownFromNow();

Вижте също:

person Michał Ziober    schedule 03.02.2013

Има лесно решение за това.

JLabel label = new JLabel("error text");
Thread.sleep(5000);
label.setText("");

Надявам се това да помогне!

РЕДАКТИРАНЕ: Ако не искате програмата да замръзне за 5 секунди, ще трябва да поставите това в Runnable.

person Trevor Jex    schedule 03.02.2013
comment
Това няма ли да замрази цялата програма за 5 секунди? - person Daniel Kaplan; 03.02.2013
comment
Да, но можете да го поставите в runnable, тогава няма да замръзне. - person Trevor Jex; 03.02.2013
comment
-1 за замразяване на GUI. Сънят @TerryLi никога не трябва да се извиква на EDT. - person Guillaume Polet; 03.02.2013
comment
@GuillaumePolet Е, просто ми хареса идеята. Вместо това можем да използваме Timer. - person Terry Li; 03.02.2013
comment
@TerryLi може да ви хареса идеята, но няма да работи и противоречи на всички добри практики на Swing. Само да ви уведомя... - person Guillaume Polet; 03.02.2013
comment
@GuillaumePolet Благодаря ви, че ми съобщихте. Току-що подкрепих вашия отговор. Добър опит! - person Terry Li; 03.02.2013

Много е лесно да се направи... просто създайте нова нишка и напишете код, за да изчистите текста върху етикета, и накарайте тази нишка да заспи за 5 секунди и след това я стартирайте.

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class LabelThread {
    private JLabel textLabel;

    public LabelThread() {
        try {
            JFrame frame  = new JFrame("Label");
            frame.setSize(500, 500);

            textLabel = new JLabel("Hiiii.... Kill me");
            frame.setContentPane(textLabel);

            frame.setVisible(true);

            MyThread thread = new MyThread();
            MyThread.sleep(5000);
            thread.start();
        } catch (InterruptedException ex) {

        }
    }
    class MyThread extends Thread{

        @Override
        public void run() {
            System.out.print("Running thread");
            textLabel.setText("");
        }

}
public static void main(String args[]){
    LabelThread labelThread = new LabelThread();
}
}
person Upendra Siripurapu    schedule 03.02.2013
comment
-1. 1) Стартирате потребителския си интерфейс в главната нишка, а не в EDT 2) Основната нишка е тази, която спи, а не MyThread. sleep е статично повикване. 3) Извиквате setText извън EDT, което нарушава Swing Thread. - person Guillaume Polet; 03.02.2013