用线程闪烁字符串

时间:2012-11-13 00:50:09

标签: java string multithreading applet

我正在尝试编写一个显示用户输入字符串的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();
    }
}
}

2 个答案:

答案 0 :(得分:3)

  • 永远不要在事件调度线程中做任何阻止它的事情(长时间运行的任务或IO),它会使你的应用程序看起来像挂起。
  • 永远不要从事件调度线程以外的任何线程创建或更新任何UI组件
  • 每次要更新邮件时都不需要创建新的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线程上。