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