# Konsole aktualisieren



## Xerses (11. Feb 2010)

Hallo zusammen,

ich schreib gerade ein Programm womit man die x und y Koordinaten zweier Joysticks auslesen kann. Diese möchte ich dann im Konsolenfenster ausgeben.

```
System.out.println("Joystick 1 X: " + x1);
System.out.println("Joystick 1 Y: " + y1);
System.out.println("Joystick 2 X: " + x2);
System.out.println("Joystick 2 Y: " + y2);
```
Nun springt er aber nach jeder abfrage in die nächste zeile, was ich nciht möchte. Ich will das er den letzten 4 Zeilen überschreibt und die neuen Werte dort hin klatscht.

Ist das irgendwie möglich?

Danke im Voraus
Xerses


----------



## eRaaaa (11. Feb 2010)

Nein, das ist nicht möglich. Du könntest x-leere Ausgaben machen, so dass deine Alten nicht mehr zu sehen sind, aber ob das so schön ist


----------



## hdi (11. Feb 2010)

Hi,

es gibt keine OS-unabhängige Möglichkeit dafür, und selbst wenn du zB nur auf Windows abzielst ist nicht garantiert dass soetwas geht. Aus einem anderen Forum:



> Have you tried ANSI control codes? The first combo which might work is save/restore cursor position:




```
System.out.print("\033[s"); // save
System.out.print("123");
System.out.print("\033[u"); // restore
System.out.print("456");
```
The second is to use the backwards movement: 

```
System.out.print("123");
System.out.print("\033[3D"); // back 3
System.out.print("456");
```
The third, which might be less useful, is to use absolute cursor positioning: 

```
System.out.print("\033[2,5H"); // jump to line 2, column 5
```

Was auch klappen könnte ist einfach 
	
	
	
	





```
System.out.print(something + "\r");
```


----------



## Xerses (11. Feb 2010)

Hab hier etwas gefunden, falls das jemanden auch interressiert.

http://www.java-forum.org/allgemeine-java-themen/35351-konsolenzeile-ueberschreiben.html


----------



## Tomate_Salat (12. Feb 2010)

notfalls eigene kleine Konsole schreiben(gibt glaub ich auch ein Framework dazu, ka. Aber eine eigene Konsole die nur Ausgaben tätigt zu schreiben, ist jz nicht der Aufwand) oder das ganze an eine GUI weitergeben. So rein System.out.println() finde ich als Lösung eh nicht gut, da du mind. die Betriebssystemconsole offen haben musst um die Ausgaben zu erhalten. Soll es über diese Laufen, dann mach doch das ganze doch einfach mittels JNI oder JNA, da kannst du ja verschiedene libs für die verschiedene Systeme anbieten, womit du auch hier weitgehendst Plattformunabhängig bleiben kannst.


----------



## L-ectron-X (12. Feb 2010)

Auch brauchbar? : http://www.java-forum.org/allgemeine-java-themen/21506-konsolenanimationen.html


----------



## Tomate_Salat (12. Feb 2010)

```
import javax.swing.JOptionPane;

public class ConsolenAni2Demo 
{
    public static String cls= "";
    
    public static void out(String out)
    {
        for(int i = 0; i < out.length(); i++)
        {
            cls += "\b";
        }
        
        System.out.print(out);
    }
    
    public static void cls()
    {
        System.out.print(cls);
        cls = "";
    }
    
    public static void main(String[] args) 
    {
        out("Joystick X: 12");
        
        JOptionPane.showMessageDialog(null, "TEST");

        cls();
        
        out("Joystick X: 132");
    }
}
```

aber mit [c]\n[/c] hatt er seine schwierigkeiten. Ansonsten Funktioniert es.


----------



## Gast2 (12. Feb 2010)

\r geht auch auf einer Windows Shell


```
public static void main(String[] args) 
	    {
	    	System.out.print("\r"+"Joystick X: 12");
	        
	        JOptionPane.showMessageDialog(null, "TEST");

	        System.out.print("\r"+"Joystick X: 132");
	    }
```


----------



## Tomate_Salat (12. Feb 2010)

aber wie kann man text vor einem [c]\n[/c] löschen?


----------



## Gast2 (12. Feb 2010)

Afaik gar nicht. \n ist ein Linefeed. Da kommst du nicht mehr zurück in einem Zeilenbasierten Terminal.

\r geht btw auch auf einem Unixterminal.


----------



## L-ectron-X (12. Feb 2010)

Unter Windows sollten \n und \r gesetzt werden. Unter Linux reicht \r unter Mac nur \n.

Vielleicht gibt es einen Code für Backspace? Aber ob der dann auch eine Zeile hoch rutschen kann...
...ich glaube nicht. :bahnhof:


----------



## homer65 (12. Feb 2010)

Oder ne GUI mit Swing basteln


----------



## Tomate_Salat (12. Feb 2010)

ja das ist ja gar kein Problem. Mit ner Tabelle kann man dann noch schön Fehler etc markieren, aber es geht ja gerade um Console des Betriebssystemes


----------



## Gast2 (13. Feb 2010)

L-ectron-X hat gesagt.:


> Unter Windows sollten \n und \r gesetzt werden. Unter Linux reicht \r unter Mac nur \n.



Wofür? Egal auf welchem OS du bist gelten immer die gleichen Konventionen:

\r => carriage return 
\n => linefeed

Windows verwendet nur \r\n für Zeilenumbrüche in Textdateien während alle *nix-artigen nur \n setzten. Mit nur \r kommst du auf einem Linux, BSD oder Solaris auch nicht weiter.

Das Problem ist das das Terminal nur die aktuelle Zeile bearbeiten kann und da dann halt auch eine carriage return zum Zeilenanfang zurück. Wenn aber ein line feed gemacht wurde war es das, die Zeile kann dann nicht mehr verändert werden.

Wenn es eine umfangreichere GUI sein soll die auch auf einer Konsole gut läuft muss man sich in JCurses oder CHARVA einarbeiten. Ist eigentlich sehr cool - man muss nur einemal eine runtime library für jedes target OS bauen wenn die mitgelieferten libs nicht laufen.


----------



## L-ectron-X (13. Feb 2010)

fassy hat gesagt.:


> Egal auf welchem OS du bist gelten immer die gleichen Konventionen


Angeblich wohl nicht, wie aus Fachbüchern zu entnehmen ist.


----------



## Gast2 (13. Feb 2010)

L-ectron-X hat gesagt.:


> Angeblich wohl nicht, wie aus Fachbüchern zu entnehmen ist.



Bitte was? \n bleibt line feed, \r bleibt carriage return - egal wo. Der einzige Unterschied ist das Windows noch aus DOS zeichen ein CRLF am Zeilenende mitschleift.

Dann nenn doch bitte mal das "Fachbuch" welches schreibt das \r auf Linuxsystemen eine Zeilenvorschub bewirkt?

Ich arbeite mit Windows, Linux, HP-UX, Solaris Varianten - und alle erwarten \n für einen line feed, verstehen auch \r\n je nach Editor. \r alleine genügt auf KEINER Plattform. 

Um genau zu sein ist es im allgemeinen einfach nur eine Frage des Editors, auch unter Windows funktioniert nur LF, z.B. mit dem notepad++, der Windows Texteditor besteht auf \r\n um einen Zeielen umbruch anzuzeigen.

Das Terminal/Shell von Windows versteht auch nur \n für einen line feed.

Letztendlich geht es wirklich nur um die Anzeige in dem Texteditor deiner Wahl.


----------



## Empire Phoenix (13. Feb 2010)

hdi hat gesagt.:


> Hi,
> 
> es gibt keine OS-unabhängige Möglichkeit dafür, und selbst wenn du zB nur auf Windows abzielst ist nicht garantiert dass soetwas geht.



Erm doch cls? Funktioniert zuverlässig und ist (relativ) langsam (auch aus reinen c++ code raus)

#include <stdlib.h>
...
system("cls");

(Müsste man natürlich in java per JNA oder JNI benutzen, aber es ist zuverlässig)


----------



## Tomate_Salat (14. Feb 2010)

äh ja oder so


----------

