0

「ようこそ!」というフレーズを文字ごとに非常にわずかな遅延で表示する方法はありますか?私が試したことを提供しますが、ほとんど機能していません。言及する価値はありません。スキャナーを含むループを使用する必要があると思いますよね?どんな助けでも感謝します、ありがとう:)

4

1 に答える 1

3

注意事項

Swing はシングル スレッド フレームワークです。つまり、UI に対するすべての更新と変更は、イベント ディスパッチ スレッドのコンテキスト内から実行されることが期待されます。

同様に、EDT をブロックする操作は、(とりわけ) 処理やペイントの更新を妨げます。つまり、ブロックが削除されるまで UI は更新されません。

これを実現する方法はいくつかあります。and を使用することもできますがSwingWorker、これは学習には適していますが、この問題を解決するには少しやり過ぎかもしれません。

代わりに、を使用できますjavax.swing.Timer。これにより、定期的な間隔でコールバックをスケジュールできます。これらのコールバックは EDT のコンテキスト内で実行されるため、UI を安全に更新できます。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class AnimatedLabel {

    public static void main(String[] args) {
        new AnimatedLabel();
    }

    public AnimatedLabel() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.setSize(100, 100);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private String text = "Hello";
        private JLabel label;
        private int charIndex = 0;

        public TestPane() {
            setLayout(new GridBagLayout());
            label = new JLabel();
            add(label);
            Timer timer = new Timer(1000, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    String labelText = label.getText();
                    labelText += text.charAt(charIndex);
                    label.setText(labelText);
                    charIndex++;
                    if (charIndex >= text.length()) {
                        ((Timer)e.getSource()).stop();
                    }
                }
            });
            timer.start();
        }
    }
}

詳細については、Swing での同時実行をご覧ください。

コメントから更新

主な問題は、text値がラップされていることです<html>

static String text = "<html>Welcome! I will ask simple, two-answer questions, and you will answer them. Simple as that. </html>";

そして、それをラベルに適用します...

final JLabel centerText = new JLabel(text);

したがって、タイマーが実行されると、テキストが再度追加されます...

"<html>Welcome! I will ask simple, two-answer questions, and you will answer them. Simple as that. </html><html>Welcome! I will ask simple, two-answer questions, and you will answer them. Simple as that. </html>"

</html>の後のすべてが無視される ため、これは無効です。

代わりに<html>text

static String text = "Welcome! I will ask simple, two-answer questions, and you will answer them. Simple as that.";

そして、ラベルの初期テキストを設定します<html>

final JLabel centerText = new JLabel("<html>);

心配する必要はありません。Swing が処理します...

于 2013-09-17T02:09:01.540 に答える