2016-04-13 6 views
0

現在、implements runnableというクラスを実行するプログラムを作成中です。 私はHH:MM:SSという形式の時刻が毎秒画面に表示されるようにしています。 HERESにコード:ここ時計システムのコンソールを消去する方法

public class LaunchCounter 
{ 

public static void main(String[] args) 
{ 
    //Runs the CounterThread 
    new CounterThread().start(); 
    } 
} 

そして、これは完全に正常に動作カウンタクラス

public class CounterThread implements Runnable 
{ 
//Declare new thread 
private Thread thread; 

public void start() 
{ 
     thread = new Thread(this, ""); 
     thread.start(); 
} 

@Override 
public void run() 
{ 
    //Formatter used to display just time not date 
    DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); 

     //never ending forloop to display time 
     for(int i = 1; i > 0; i++) 
     { 
      try 
      { 

       //Runtime.getRuntime().exec("cmd /c cls"); 
       //Sleep for 1 second after each loop 
       Thread.sleep(1000); 

       //new calender is created 
       Calendar cal = Calendar.getInstance(); 
       System.out.println(dateFormat.format(cal.getTime())); 
      } 
      catch(Exception e1) 
      { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
     } 
} 

です。 私が達成しようとしているのは、印刷された行が1秒待ってから消去され、新しい時刻が印刷されるなどです。 従って12:00:01ベクトコム12:00:02アウトが新しい行をとっています。

私は試しましたSystem.out.print("\b\b\b\b\b\b\b")Runtime.getRuntime().exec("cmd /c cls");これは、正方形をコンソールに印刷しているだけです。

どうすればいいですか?

+0

私はJavaで、「コンソール」は、画面上のウィンドウではないこと、のnoobの利益のために、追加しますhttps://github.com/fusesource/jansi – rkosegi

答えて

0

あなたは正しいトラックにRuntime.getRuntime().exec("cls");を使用しています。おそらくあなたがコンソールをクリアできない理由のために、Holgerの投稿thisをここに見てください。

は、この問題を解決するために、我々は、コマンドラインインタプリタ (CMD)を呼び出し、 組み込みコマンドを呼び出すことができますコマンド(/ CはCLS)を実行するよう指示する必要があります。 Javaプロセスがコンソールに接続されている今、

import java.io.IOException; 

public class CLS { 
    public static void main(String... arg) throws IOException, InterruptedException { 
    new ProcessBuilder("cmd", "/c", "cls").inheritIO().start().waitFor(); 
    } 
} 

、すなわち:さらに、我々は直接inheritIO()を使用して、Javaの7 で始まる作品のJavaプロセスの出力チャネル、その出力 チャネルを接続する必要があります出力リダイレクトなしでコマンドラインから起動した は、 コンソールをクリアします。

2

問題は使用している端末です。 (私の推測では、あなたのIDEでターミナルを使用していると思います)。出力端末が完全なターミナルエミュレーションを行っていない場合は、\ b文字を無視するか、または出力できない文字として表示します。

IntelliJ IDEA 16で次のコードをテストし、\ bが組み込みIDEA端末によって無視されていることを確認しました。私はMacOS端末でそれをテストし、あなたが望むように動作しました。

package test; 

import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 

public class CounterThread implements Runnable { 
    //Declare new thread 
    private Thread thread; 

    public void start() { 
    thread = new Thread(this, ""); 
    thread.start(); 
    } 

    @Override 
    public void run() { 
    //Formatter used to display just time not date 
    DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); 

    //never ending forloop to display time 
    for (int i = 1; i > 0; i++) { 
     try { 

     //Runtime.getRuntime().exec("cmd /c cls"); 
     //Sleep for 1 second after each loop 
     Thread.sleep(1000); 

     //new calender is created 
     Calendar cal = Calendar.getInstance(); 
     System.out.print("\b\b\b\b\b\b\b\b"); 
     System.out.print(dateFormat.format(cal.getTime())); 
     } catch (Exception e) { 
     throw new RuntimeException(e); 
     } 
    } 
    } 

    public static void main(String[] args) throws Exception { 
    //Runs the CounterThread 
    new CounterThread().start(); 
    final Object monitor = new Object(); 
    synchronized (monitor) { 
     monitor.wait(); 
    } 
    } 
} 
+1

をお勧めします。バイトストリームのソースとシンクです。画面にウィンドウがある場合、そのウィンドウはいくつかの_other_プログラム(別名「端末エミュレータ」、「コンソールウィンドウ」、「シェルウィンドウ」、...またはIDE)によって制御され、他のプログラムがあなたのプログラムが 'System.out'に書き込むバイトは、どのプログラムであるか、どのように設定されているか、どの昔ながらのハードウェア端末でエミュレートしているかなどによって異なります) –

+0

私はあなたが提供したコードを使用しました。私はWindows 8.1でEclipse Mars IDEを使用しています。このIDEでは不可能でなければなりません。 – Aaronward

+2

Eclipseのコンソール出力は、ターミナルエミュレーション(\ bのような特殊文字を解釈するもの)を持つ適切な端末ではないため、IDEでは動作しません。適切な端末エミュレータでプログラムを実行してみてください。OS Xでは、ターミナルアプリケーションが組み込まれています。 Linuxでは、実行しているシェルはほとんどすべて端末エミュレータにあります。 Windowsでは、試すことができる多くの端末エミュレータがあります。 –

関連する問題