Clear console für cmd in Java?

yschuh

Grünschnabel
Hallo!
In dem nun folgenden Programm funktioniert alles schon nahezu so, wie es das auch soll.
Das einzige Problem besteht darin, das ich gerne die Prozentzahl direkt hochzählen würde. Also dass das Programm dem Benutzer sagt: "Benutzer, zwischen euch passt es zu '1 dann 2 dann 3 dann 4 ... bis zur errechneten zufälligen Prozentzahl' Prozent"

Die Angabe der Prozentzahl soll somit in nur einer einzigen Wiedergabe erfolgen, die sich selbst hochzählt und nicht so wie java das standartmäßig nach dem Motto:
1
2
3
4
5
... usw. macht.
Wie ein Countdown so zu sagen, nur eben von 0 auf 1 auf die gewünschte, zufällig generierte Prozentzahl erreicht wurde. Meine Kollegen haben mir zur lösung des Problems eine Methode aus C++ empfohlen, welche mithilfe des Codes
Java:
Runtime.getRuntime().exec("cls");
funktionieren sollte. Jedoch bin ich noch ein völliger Java Einsteiger (arbeite damit jetzt gerade mal 1 Woche lang) und weiß damit noch garnichts an zu fangen. Selbst intensives googlen hat mich meinem Ziel diesen Zähler zu erstellen nicht näher gebracht.


Lange Rede, kurzer Sinn, hier nun mal der Quellcode:
Java:
package loveline;

import java.util.Scanner;
import java.io.IOException;


public class Loveline {
        
    public static void main(String[] args) throws IOException, InterruptedException
    {
        int max = 100;
        int min = 1;
        int love = 0;
        int liebe = (int)(Math.random() * (max-min) + min);
        
        
        while (true)
        {
            System.out.println("Sende deinen Namen und den Namen deines Schatz an die 4444");
            Scanner eingabe = new Scanner ( System.in);
            System.out.println("Deinen Name bitte!");
            String eingabeA = eingabe.nextLine();
            System.out.println("Nun der Name deines Freundes/deiner Freundin");
            String eingabeB = eingabe.nextLine();
            for (love = 0; love <= liebe; love++)
            {
            System.out.println(eingabeA + ", zwischen euch passt es zu " + love + " " + "Prozent");
            cls ();
            }
        
            System.out.println("Noch eine Runde? Drücke 1 für Ja, 2 für Nein");
            String neustart = eingabe.nextLine();
            
           if (neustart.equals("1"))
           {
                System.out.println("Los gehts!");
                continue;
           }
           if (neustart.equals("2"))
           {
               System.out.println("Schade!");
               break;
           }
        
        }   
    }
        public static void cls() throws InterruptedException{
        Thread.sleep(300);
        for(int i = 0;i<100;i++){
            System.out.print("\n"); 
        }
   }
}

Entschuldigt meine Formatierung.

Über Hilfe würde ich mich sehr freuen!
 
Zuletzt bearbeitet:
cls ist ein Befehl „clear console“, der die gesamte Ausgabe der Konsole „löscht“, d.h. die Ausgabe nach oben weiter schiebt – das würde dir nichts helfen, weil du das nicht brauchst.

Ich habe damit keine Erfahrung, aber System.out ist vom Typ PrintStream und bietet auch Methoden wie print() und printf(). Probier die doch mal aus.

Sonst musst du vielleicht mit Console arbeiten. Die Instanz davon bekommst du über System.console() und Console bietet auch ähnliche Methoden.

Wie gesagt: ich habe keine Erfahrung damit, würde da aber mal suchen. Und wenn alle Stricke reißen hilft vielleicht http://commons.apache.org/cli/
 
Hallo,

Java selbst kennt kein "clear console".
Unter Windows jedoch kannst du einen Backspace character ('\b') an der Konsole ausgeben um ein Zeichen zu löschen und der Cursor zurückzuschieben.
Dies funktioniert jedoch nur in der Windows Konsole und nicht in Eclipse, etc.

Alternativ gibt es diverse Implementationen für vollständigen Konsolenzugriff für Java.
Doch bei Verwenden dieser Bibliotheken geht natürlich die Plattformunabhängigkeit verloren.

Gruß,
 
Hallo,

Na ja, nur mal so als Spielerei...

als kleinen Tipp am Rande: wenn man Konsolen-UIs bauen möchte, kann man sich bei Java auch einfach mit der Kombination aus ServerSocket und Telnet behelfen. Da geht alles von Farbe (wenns ein ANSI Compatibler Telnet Client ist) über Menüs bis hin zu Animation (Stichwort Ascii Starwars).

Schau mal hier: (Einfacher Singlethreaded Telnet SocketServer)
Java:
package de.tutorials;

import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import java.util.concurrent.TimeUnit;

public class TelnetConsoleUIExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
		ServerSocket serverSocket = new ServerSocket(23);
		Socket socket = serverSocket.accept();
		
		PrintWriter pw = new PrintWriter(socket.getOutputStream());
		
		while(true){
			
			pw.println("Time " + new Date());
			for(int row = 0; row< 26;row++){
				pw.print("Line " + row + " ");
				pw.flush();
				for(int column = 0; column < 40; column++){
					pw.print((char)('A'+row));
					pw.flush();
					TimeUnit.MILLISECONDS.sleep(10);		
				}
				pw.print("\n\r");
				
			}
			
			TimeUnit.MILLISECONDS.sleep(1000);
			pw.print("\u001B[2J"); //clearscreen
			pw.flush();
		}
		
	}

}

Auf der Konsole: (ggf. Microsoft Telnet Client installieren oder putty verwenden)
Code:
telnet localhost 23

Ausgabe:
Code:
Time Tue Feb 28 01:17:08 CET 2012
Line 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Line 1 BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
Line 2 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
Line 3 DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
Line 4 EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
Line 5 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
Line 6 GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
Line 7 HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
....

Btw. eine der Bibliotheken von der mccae spricht ist JCurses:
http://sourceforge.net/projects/javacurses/

Gruß Tom
 
Btw. eine der Bibliotheken von der mccae spricht ist JCurses:
http://sourceforge.net/projects/javacurses/

Zufälligerweise arbeite ich an diesem Projekt.
Wer es benutzen möchte, sollte zuerst den nativen Part des letzten Releases patchen (da fehlt ein "releaseByteArray" in "printstring", welches einen Memoryleak verursacht) und neu kompilieren.
Das Verwenden der Versionen auf dem CVS ist nicht empfehlenswert, da mit Einführung des Themesystems einiges durcheinandergeraten ist (egal welcher Branch).

Gruß,
 
Zurück