89030


実行されてから3000ミリ秒後に `Hello World!` と言う文字列がアニメーション付きで出力されるプログラムを作成しようとしています。  
([fadeIn](https://api.jquery.com/fadein/) のような、薄い文字から3000ミリ秒かけてはっきりと表示されていくもの)  
しかし、具体的なやり方が分からず行き詰まっています。

私の以前の類似質問での [回答](https://ja.stackoverflow.com/a/88332/3060) では `Thread` の
`sleep` メソッドを使い指定のミリ秒後に出力できると大変わかりやすくご助言をいただきましたが、

> 時間を置いて処理を実行したい場合は sleep を使うのが簡単

今回私が実装しようとしている方法は単なる`Thread`を使い処理時間を止めて出力するものではなく、前述したとおりアニメーション付きで出力するものですので、以前とは目的が似ているようで別途なため、質問させていただきました。

Javaで文字列をアニメーション付きでコンソール上に出力するには、どのような方法を使えば良いでしょうか？

**現状のコード：**

[code]

    public class Main {
        public static void main ( String[] args ) {
                System.out.println("実行開始");
            try{
                Thread.sleep(3000);
                System.out.println("Hello World!"); //ここで期待の出力結果を反映させる
            }catch(InterruptedException e){}
    
        }
    }
    
[/code]


CC BY-SA 4.0
2022-05-24T16:40:45.413
89029
2022-05-25T00:40:15.877
2022-05-25T00:40:15.877
3060
51596
question
java
コンソール上に文字をアニメーション付きで出力したい


[curses](https://ja.wikipedia.org/wiki/Curses)/[ncurses](https://ja.wikipedia.org/wiki/Ncurses)を
Java から利用できるライブラリ、あるいはそれらを模したライブラリを使うのが良さそうに思われます。

例えばこちらの回答にあるようなものが該当します:

  * [What's a good Java, curses-like, library for terminal applications?](https://stackoverflow.com/q/439799/4506703)

例えば [Lanterna](https://github.com/mabe02/lanterna) を利用すると次のように書けます:

[code]

    import com.googlecode.lanterna.TextColor;
    import com.googlecode.lanterna.terminal.DefaultTerminalFactory;
    import com.googlecode.lanterna.terminal.Terminal;
    import java.io.IOException;
    
    public class App {
        private static final int RESOLUTION = 30;
    
        public static void main(final String[] args) throws IOException, InterruptedException {
            final DefaultTerminalFactory defaultTerminalFactory = new DefaultTerminalFactory();
    
            final Terminal terminal = defaultTerminalFactory.createTerminal();
    
            terminal.clearScreen();
            terminal.setCursorPosition(0, 0);
            terminal.putString("実行開始");
    
            for (int i = 1; i <= RESOLUTION; i++) {
                terminal.setCursorPosition(0, 1);
    
                final int color = 255 * i / RESOLUTION;
                terminal.setForegroundColor(new TextColor.RGB(color, color, color));
                terminal.putString("Hello, world!");
                terminal.flush();
                Thread.sleep(3000L / RESOLUTION);
            }
            terminal.setCursorPosition(0, 2);
        }
    }
    
[/code]


CC BY-SA 4.0
2022-05-24T22:42:24.923
89030
2022-05-24T22:50:54.247
2022-05-24T22:50:54.247
2808
2808
89029
answer