0

我正在尝试编写一个 Java 小程序来显示用户输入的字符串,然后它应该通过在该字符串和另一个字符串之间切换来闪烁该字符串。我正在尝试使用线程来执行此操作,但我对这些和 Applets 很陌生,我不知道从现在开始该怎么做。

这是我到目前为止所拥有的:

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

2 回答 2

3
  • 永远不要在 Event Dispatching Thread 中做任何会阻塞它的事情(长时间运行的任务或 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();
        }

    }

}

您可能想阅读一下Swing 中的并发

于 2012-11-13T01:05:07.560 回答
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 线程上。

于 2012-11-13T00:55:07.343 回答