我正在尝试编写一个显示用户输入字符串的Java小程序,然后应该通过在该字符串和另一个字符串之间切换来刷新字符串。我正在尝试使用一个线程来执行此操作,但我是那些和Applet的新手,我不知道该怎么做。
这是我到目前为止所拥有的:
public class FlashingLabel extends JApplet implements Runnable
{
String blank;
String input;
JLabel label;
Thread t;
public void init()
{
input = JOptionPane.showInputDialog(null, "Enter String", "Flashing Label", JOptionPane.QUESTION_MESSAGE);
blank=" ";
t=new Thread(this);
t.start();
}
public void run()
{
while(true)
{
label=new JLabel(blank);
add(label);
this.repaint();
label=new JLabel(input);
add(label);
this.repaint();
}
}
}
答案 0 :(得分:3)
JLabel
,只需使用JLabel#setText
即可。您的代码目前正在通过根据您的需要,一个简单的javax.swing.Timer
将执行您要完成的任务。
public class FlashApplet extends JApplet {
@Override
public void init() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
setLayout(new BorderLayout());
add(new FlashPane());
}
});
}
@Override
public void start() {
}
public static class FlashPane extends JPanel {
protected static final String[] MESSAGES = {"Bad Boys", "What you gonna do"};
private Timer flashTimer;
private JLabel label;
private int messageIndex = -1;
public FlashPane() {
setLayout(new BorderLayout());
add((label = new JLabel()));
label.setHorizontalAlignment(JLabel.CENTER);
flashTimer = new Timer(500, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
messageIndex++;
if (messageIndex >= MESSAGES.length) {
messageIndex = 0;
}
label.setText(MESSAGES[messageIndex]);
}
});
flashTimer.setRepeats(true);
flashTimer.setCoalesce(true);
flashTimer.setInitialDelay(0);
flashTimer.start();
}
}
}
您可能希望阅读Concurrency in Swing
答案 1 :(得分:1)
为了使您的代码安全,我们的想法是将它包装在invokeLater中(或者做一些我不知道的疯狂线程安全的事情。)
SwingUtilities.invokeLater(new Runnable(){
public void run()
{
label=new JLabel(blank);
add(label);
for(int i =0;i < 4;i++)
{
label.setText(blank) ;
try{
Thread.sleep(1000);
}catch(...){
}
label.setText(input);
}
}
添加你的标签,它最初是空白的......睡一会儿(改变以满足你的需要),然后将它设置为你的输入。上次我做了这样的事情,它起作用了,它出现在主UI线程上。