2016-04-13 8 views
0

Ich schreibe gerade ein Programm, das eine Klasse ausführt, die implements runnable. Ich habe es so die Zeit in einem Format von HH:MM:SS wird auf dem Bildschirm jede Sekunde gedruckt. Heres der Code:So löschen Sie die Konsole für ein Uhrensystem

public class LaunchCounter 
{ 

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

Und hier ist der Zähler Klasse

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(); 
      } 
     } 
} 

Das perfekt funktioniert gut. Was ich versuche zu erreichen ist, dass die Zeile, die gedruckt wird, nach einer Sekunde gelöscht wird, und die neue Zeit gedruckt wird und so weiter. So 12:00:01 becocomes 12:00:02mit eine neue Zeile nehmen.

Ich habe versucht System.out.print("\b\b\b\b\b\b\b") und Runtime.getRuntime().exec("cmd /c cls"); Aber das ist nur Drucken Quadrate auf der Konsole.

Wie würde ich das erreichen?

+0

Ich würde https://github.com/fusesource/jansi empfehlen – rkosegi

Antwort

0

Sie sind auf dem richtigen Weg mit Runtime.getRuntime().exec("cls");. Sehen Sie this Beitrag hier von Holger für vielleicht, warum Sie nicht in der Lage sind, die Konsole zu löschen.

Um dieses Problem zu lösen, haben wir die Kommandozeileninterpreter (cmd) und sagen, es aufzurufen einen Befehl (/ c cls), die gebautet Befehle aufrufen können auszuführen. Ferner haben wir direkt seinen Ausgang Kanal zu dem Java-Prozess Ausgangskanal zu verbinden, die mit 7 Java Ausgang Works, unter Verwendung von inheritIO():

import java.io.IOException; 

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

Jetzt, wenn der Java-Prozess mit einer Konsole verbunden ist, das heißt Wurde von einer Befehlszeile ohne Ausgabeumleitung gestartet, wird die Konsole gelöscht.

2

Das Problem ist das Terminal, das Sie verwenden. (Meine Vermutung ist, dass Sie das Terminal in Ihrer IDE verwenden.) Wenn Ihr Ausgabeterminal keine vollständige Terminalemulation ausführt, ignoriert es entweder die Zeichen \ b oder zeigt sie als nicht druckbare Zeichen an.

Ich habe den folgenden Code in IntelliJ IDEA 16 getestet und überprüft, dass \ b vom eingebauten IDEA-Terminal ignoriert wird. Ich habe es dann im MacOS-Terminal getestet und es hat so funktioniert, wie Sie es wollen.

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

Ich möchte hinzufügen, zum Nutzen der noob, dass „die Konsole“ in Java ist kein Fenster auf einem Bildschirm. Es ist nur eine Quelle und eine Senke für Byteströme. Wenn es ein Fenster auf dem Bildschirm gibt, wird dieses Fenster von einem _other_ Programm (auch "Terminal Emulator", "Konsolenfenster", "Shell Fenster", ..., oder Ihrer IDE) gesteuert und wie dieses andere Programm das Programm interpretiert Bytes, die Ihr Programm in 'System.out' schreibt, hängt davon ab, welches Programm es ist, wie es konfiguriert ist, welches altmodische Hardware-Terminal es emuliert, etc.) –

+0

Ich habe den Code verwendet, den Sie zur Verfügung gestellt haben, immer noch kein Glück. Ich verwende Eclipse Mars IDE unter Windows 8.1. es muss einfach nicht auf dieser IDE möglich sein. – Aaronward

+2

Es funktioniert nicht in Ihrer IDE, weil die Konsolenausgabe in Eclipse kein richtiges Terminal mit Terminal-Emulation ist (die Sache, die die Sonderzeichen wie \ b interpretiert). Versuchen Sie, das Programm in einem geeigneten Terminalemulator auszuführen.Unter OS X ist die Terminal-App integriert. Unter Linux wird praktisch jede Shell, die Sie ausführen, in einem Terminalemulator enthalten sein. Unter Windows gibt es viele Terminalemulatoren, die Sie ausprobieren können. –