質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

Q&A

解決済

1回答

2991閲覧

[Java] コンソール画面を操作したい。

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

0グッド

0クリップ

投稿2021/09/04 04:33

編集2021/09/06 04:19

###やりたい事
コンソール画面を操作したい。指定したコンソール画面位置に文字を表示させたり消したりしたいです。下記のように進行状況を一行単位で表示させいたいです。%の部分だけを書き換えたり処理中の部分だけを書き換えたりしたいです。
C#でいうConsoleのような画面制御がしたいです。

Directory: 〇〇 --- [処理中]「20%」 Directory: 〇〇 --- [処理中]「10%」

###現状
「java コンソール操作」、[java 画面操作]などの単語で色々検索しましたがイマイチ情報がヒットしません自分が行いたいのは文字操作(コンソール画面)なので図形やGUIではありません。また参考サイトをなどのリファレンスを漁りましたが色々あちらこちら色んなリンクに飛ばされて結局どうすればいいかわかりません。

###知りたいこと
コンソールの画面に表示されている文字を書き換えて画面をクリアして再描画させる方法が知りたいです。

###参考サイト
参考サイトA: https://docs.oracle.com/javase/jp/8/docs/api/java/awt/Graphics2D.html
参考サイトB: https://docs.oracle.com/javase/jp/7/api/java/awt/image/BufferedImage.html
参考サイトC: https://www.tutorialspoint.com/java_dip/java_buffered_image.htm
参考サイトD: https://talavax.com/imagesize.html

参考サイト(C#): https://docs.microsoft.com/ja-jp/dotnet/api/system.console?view=net-5.0

java

1import java.io.*; 2 3import java.awt.image.BufferedImage; 4 5import java.awt.Graphics2D; 6 7public class Main 8{ 9 public static void main(String[] args) 10 { 11 12 BufferedImage image = new BufferedImage(200,200,BufferedImage.TYPE_INT_RGB); 13 Graphics2D g = (Graphics2D)image.getGraphics(); 14 g.drawString("Hello World",0,0); 15 } 16} 17

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

検索すべき用語は「ANSIエスケープシーケンス」ですね。文字列中にESCコード(0x1b)に続く文字列を埋め込むことで、カーソル位置や文字色などを変更できます。

Javaの文字列リテラル中にESCコードを埋め込むには、\u001bと書きます。C言語などで使える\eには対応していないので注意してください。例えば、端末画面全体を消去するには、(\e[2Jではなく)\u001b[2Jを出力します。

Java

1System.out.println("\u001b[2J");

こうした画面制御を大規模に行なうならば、C言語であれば「curses」や「ncurses」というライブラリを使うところですが、Javaにも似たようなものがあるのでは。

投稿2021/09/04 04:45

編集2021/09/04 13:28
Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/09/04 05:08

ありがとうございます。質問ですがライブラリを使わない場合どうやったらいいのでしょうか? [java エスケープシーケンス] と検索しましたがあまり情報がヒットせず困っています。
Daregada

2021/09/04 05:11 編集

質問者のやりたいこと(数行の表示の書き換え)なら、生のエスケープシーケンスを使うのでも、大きな困難はないかと思います。 日本語で書かれた「ANSIエスケープシーケンス」の解説ページを見てください。たとえば、 https://qiita.com/PruneMazui/items/8a023347772620025ad6 とかですね。
退会済みユーザー

退会済みユーザー

2021/09/04 11:17

なるほど。質問ですが「 ava:79: エラー: エスケープ文字が不正です System.out.println("\e[2J"); 」 とエラーが出るのですがこれはなぜでしょうか? 「 System.out.println("\e[2J"); 」
Daregada

2021/09/04 13:23 編集

Javaの文字列リテラル(""の中身)のエスケープには、「\e」(ESCコードの埋め込み)が含まれていないので、その代わりに「\u001b」と書いてください。 たとえば、「System.out.println("\u001b[2J");」です。 回答にも補足しておきます。
退会済みユーザー

退会済みユーザー

2021/09/06 03:52

質問ですがエスケープシーケンスを使って画面をクリアしてまた文字を表示させるなどしてwhile()文で無限ループを作って上のようなことをするとカーソルがカチカチして邪魔で、それでいて画面をスクロールして見ると上に履歴が大量に残ってしまうのですがこれはどうすれば防げるのでしょうか?
Daregada

2021/09/06 04:13

カーソルがチカチカする問題は、 "\u001b[?25l" →カーソル非表示 "\u001b[?25h" →カーソル再表示 を、それぞれ処理の先頭と末尾に書いておけばいいでしょう。
Daregada

2021/09/06 04:16

うーん、解決後も質問に対応していたら、なぜかベストアンサーを解除されてしまったので、これ以後は答えません。
退会済みユーザー

退会済みユーザー

2021/09/06 04:20

質問が解決しないので解除しました。
Daregada

2021/09/06 04:26

> コンソール画面を操作したい。指定したコンソール画面位置に文字を表示させたり消したりしたいです。下記のように進行状況を一行単位で表示させいたいです。%の部分だけを書き換えたり処理中の部分だけを書き換えたりしたいです。 は、ANSIエスケープシーケンスを利用した「指定位置へのカーソル移動」を行なってからの、「現在行のカーソル以降を消去」や「文字の表示(上書きになる)」で可能です。いちいち画面全体を消す必要はありません。質問があいまいすぎて、これ以上のことは書けません。
退会済みユーザー

退会済みユーザー

2021/09/06 04:37 編集

質問ですが 以下のようにエスケープシーケンスを書いたのですがなぜか文字が一番上の左0番目に行かず下に流れてしまいます。これはなぜでしょうか? System.out.println("\u001b[8A");//上に移動 System.out.println("\u001b[0G");//一番左に移動
Daregada

2021/09/06 04:43

printlnは、文字列表示後に改行するから。 代わりにprintを使え。
退会済みユーザー

退会済みユーザー

2021/09/06 05:39 編集

ありがとうざいます
Daregada

2021/09/06 05:57

本当にその通りのコードで先頭行の内容が消えないということは、ANSIエスケープシーケンスに対応していない端末アプリですね。何をお使いですか?
退会済みユーザー

退会済みユーザー

2021/09/06 06:50

ubuntu です。自分のコーディングミスでした。置く場所を間違えていました。自分のミスです。」
退会済みユーザー

退会済みユーザー

2021/09/06 06:50

質問ですが 画面がチラチラしてしまうのですがこれはコンソール画面で行う以上しかたないのでしょうか?
Daregada

2021/09/06 06:56

消して、書いて、を繰り返し行なうのでチラチラします。 消さずにそのまま上書きできるのであれば、そのほうが見やすくなるでしょう。
退会済みユーザー

退会済みユーザー

2021/09/06 07:11

なるほど。調べたのですがC#のConsole.クラスようなバッファを触って書き換えるみたいな機能はないということはjavaにはないということでいいのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問