0

ユーザーが入力した文字列を表示するJavaアプレットを作成しようとしています。次に、その文字列と別の文字列を切り替えて文字列をフラッシュする必要があります。私はこれを行うためにスレッドを使用しようとしていますが、私はそれらとアプレットに不慣れであり、これから何をすべきかわかりません。

これが私がこれまでに持っているものです:

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
  • イベントディスパッチスレッド内でそれをブロックするようなことは絶対に行わないでください(長時間実行されるタスクまたはIO)。アプリケーションがハングしているように見えます。
  • イベントディスパッチスレッド以外のスレッドからUIコンポーネントを作成または更新しないでください
  • JLabelメッセージを更新するたびに新しいを作成する必要はありません。簡単に使用できますJLabel#setText。あなたのコードは現在、各ループスルーに2つの新しいラベルを追加しています

必要に応じて、シンプル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);

    }
   }

ラベルを追加します。最初は空白です。1秒間スリープし(ニーズに合わせて変更します)、入力に設定します。前回このようなことをしたとき、それは機能し、メインUIスレッドにありました。

于 2012-11-13T00:55:07.343 に答える