Исках да знам дали има някакъв лесен начин за изтриване на съдържанието (текста) от JLabel след 5 секунди. Това възможно ли е? Тъй като имам JLabel в JFrame и той показва някои вътрешни грешки от програмата, която кодирам, и искам JLabel да покаже съобщението за няколко секунди и след това да остане празно. Някакви идеи?
Изтриване на текст от JLabel след 5 секунди?
Отговори (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();
}
});
}
}
Използвайте Таймер. Моля, вижте моя пример.
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();
Вижте също:
Има лесно решение за това.
JLabel label = new JLabel("error text");
Thread.sleep(5000);
label.setText("");
Надявам се това да помогне!
РЕДАКТИРАНЕ: Ако не искате програмата да замръзне за 5 секунди, ще трябва да поставите това в Runnable.
Timer
.
- 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();
}
}
MyThread
. sleep
е статично повикване. 3) Извиквате setText
извън EDT, което нарушава Swing Thread.
- person Guillaume Polet; 03.02.2013