# JCurses Nutzung



## kinglui (22. Apr 2010)

Hallo zusammen,

ich habe eine Konsolenapplikation, welche versch. Schritte ausführt.
Manchmal kann es vorkommen, dass ich nicht alle diese Schritte in der selben Reihenfolge brauche und so kommentiere ich den Aufruf der Funktionen in main() aus und rufe danach das Programm auf.

Diese Lösung gefällt mir nicht ganz, vor allem mit dem Hinblick darauf, dass die Anwendung auf einem Server laufen soll und ich sie nicht jedes Mal neu kompilieren will.

Daher dachte ich jetzt daran, dass Ganze mit JCurses (bzw. ncurses, welche man aus der Linuxwelt kennt) umzusetzen. damit man das Ding leichter Starten kann.

Mir würde im Prinzip schon eine ganz simple Auswahl reichen:

```
[] Methode 1
[x] Methode 2
[x] Methode 3
[] Methode 4
START
```

Jetzt werden nur die Methoden 2+3 ausgeführt.
Die Fragen die sich mir stellen:
was muss an meiner Javaanwendung geändert werden und wie benutze ich JCurses?
Ich habe schon einige Tutorials und Beispiele gefunden, aber leider habe ich die Snippets noch nicht zum laufen gebracht.

Am liebsten wäre es mir, wenn ich auf dem System ein JAR-File liegen würde, welches mich direkt zum Menuaufruf bringt.

Hat da vielleicht jemand was kleines, was ich mir angucken kann?

Danke


----------



## Marco13 (22. Apr 2010)

Hm. Ein konkretes Beispiel zu JCurses habe ich nicht, aber hast du schon überlegt/in Erwägung gezogen, das einfach über Kommandozeilenparameter zu machen... Z.B.
[c]java TheProgram 23[/c]
um die Optionen 2 und 3 auszuführen...?


----------



## kinglui (22. Apr 2010)

joa, das wäre ne Alternative, aber JCurses hat Priorität.
Btw., ich bekomme nicht mal die Testanwendung im JCurses Paket zum laufen (via Eclipse)


----------



## Marco13 (23. Apr 2010)

Zur Verwendung "in" Eclipse steht in dieser TXT-Datei was Download Java Curses Library from SourceForge.net. Vermutlich wäre es am einfachsten, das nicht von Eclipse aus sondern von der Eingabeaufforderung aus zu starten.


----------



## Grizzly (20. Feb 2012)

Und? Wie sind die Erfahrungen mit JCurses? Wäre an einem kurzen Resümee interessiert.


----------



## turtle (20. Feb 2012)

Ich habe mir nur kurz mal das Testprogramm in Eclipse angeschaut...

Laut Doku wird empfohlen den Start als External Tool einzustellen. Da steht daher bei mir

```
/c start C:\WINDOWS\system32\cmd.exe /k "java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000  -cp bin;jcurses\jcurses.jar Testwin"
```
Wie Du siehst, kann damit auch Eclipse eine remote Debugging-Session aufgebaut werden.

Läuft bei mir problemlos. Leider sehen Konsole-Anwendungen echt doof aus und habe es nicht weiter angeschaut.

Hier das Testprogramm

i
	
	
	
	





```
mport jcurses.event.ActionEvent;
import jcurses.event.ActionListener;
import jcurses.event.ItemEvent;
import jcurses.event.ItemListener;
import jcurses.event.ValueChangedEvent;
import jcurses.event.ValueChangedListener;
import jcurses.event.WindowEvent;
import jcurses.event.WindowListener;
import jcurses.system.CharColor;
import jcurses.system.Toolkit;
import jcurses.util.Message;
import jcurses.util.Protocol;
import jcurses.widgets.BorderPanel;
import jcurses.widgets.Button;
import jcurses.widgets.CheckBox;
import jcurses.widgets.FileDialog;
import jcurses.widgets.GridLayoutManager;
import jcurses.widgets.Label;
import jcurses.widgets.List;
import jcurses.widgets.PasswordField;
import jcurses.widgets.PopUpMenu;
import jcurses.widgets.TextArea;
import jcurses.widgets.Widget;
import jcurses.widgets.WidgetsConstants;
import jcurses.widgets.Window;

public class Testwin extends Window implements ItemListener, ActionListener,
		ValueChangedListener, WindowListener, WidgetsConstants {

	public static void main(String[] args) throws Exception {
		// Protocol initialisieren
		System.setProperty("jcurses.protocol.filename", "jcurses.log");
		Protocol.activateChannel(Protocol.DEBUG);
		Protocol.debug("Programm beginnt");
		Toolkit.beep();
		Window test = new Testwin(28, 20);
		test.addListener((WindowListener) test);
		test.show();
	}

	private Button _b1 = null;
	private Button _b2 = null;
	private List _list = null;
	private TextArea _textArea = new TextArea(-1, -1,
			"1111\n2222\n3333\n4444\n\n66666\n77777\n888888\n99999999999999999\n1010100101");
	private PasswordField _pass = new PasswordField();
	public Testwin(int width, int height) {
		super(width, height, true, "Test");
		BorderPanel bp = new BorderPanel();
		new CheckBox();
		new CheckBox(true);
		new Label("textfeld");
		new Label("checkbox2");
		_b1 = new Button("OK");
		_b1.setShortCut('o');
		_b1.addListener(this);
		_b2 = new Button("Cancel");
		_b2.setShortCut('p');
		_b2.addListener(this);
		_list = new List();
		_list.add("item1");
		_list.add("item201234567890123456789");
		_list.add("item3");
		_list.add("item4");
		_list.add("item5");
		_list.addListener(this);
		_list.getSelectedItemColors().setColorAttribute(CharColor.BOLD);
		GridLayoutManager manager1 = new GridLayoutManager(1, 1);
		getRootPanel().setLayoutManager(manager1);
		manager1.addWidget(bp, 0, 0, 1, 1, ALIGNMENT_CENTER, ALIGNMENT_CENTER);
		GridLayoutManager manager = new GridLayoutManager(2, 5);
		bp.setLayoutManager(manager);
		manager.addWidget(_list, 0, 0, 1, 4, ALIGNMENT_TOP, ALIGNMENT_CENTER);
		manager.addWidget(_textArea, 1, 0, 1, 2, ALIGNMENT_CENTER,
				ALIGNMENT_CENTER);
		manager.addWidget(_pass, 1, 2, 1, 2, ALIGNMENT_CENTER, ALIGNMENT_CENTER);
		manager.addWidget(_b1, 0, 4, 1, 1, ALIGNMENT_CENTER, ALIGNMENT_CENTER);
		manager.addWidget(_b2, 1, 4, 1, 1, ALIGNMENT_CENTER, ALIGNMENT_CENTER);
	}

	public void actionPerformed(ActionEvent event) {
		Widget w = event.getSource();
		if (w == _b1) {
			Protocol.debug("point1");
			FileDialog dial = new FileDialog("File wählen");
			Protocol.debug("point2");
			dial.show();
			Protocol.debug("point3");
			if (dial.getChoosedFile() != null) {
				new Message("Meldung!", dial.getChoosedFile().getAbsolutePath(), "OK").show();
			}
			Protocol.debug("point4");
			_pass.setVisible(!_pass.isVisible());
			pack();
			paint();
		} else {
			new Message("Meldung!", "01234567890\nassssssss\naaaaaaa\naaaaaa",
					"CANCEL").show();
			PopUpMenu menu = new PopUpMenu(53, 5, "test");
			for (int i = 1; i < 100; i++) {
				if ((i == 35) || (i == 4)) {
					menu.addSeparator();
				} else {
					menu.add("item" + i);
				}
			}
			menu.show();
			new Message("meldung", menu.getSelectedItem() + ":"
					+ menu.getSelectedIndex(), "OK").show();
		}

		// close();

	}

	public void stateChanged(ItemEvent e) {
		Protocol.debug("-----------------");
		new Message("meldung", e.getItem() + ":" + e.getType(), "OK").show();
	}

	public void valueChanged(ValueChangedEvent e) {
		new Message("Alarm", "Geändert in ", "" + _list.getSelectedIndex())
				.show();
	}

	public void windowChanged(WindowEvent event) {
		Protocol.debug("window event: " + event.getType());
		if (event.getType() == WindowEvent.CLOSING) {
			event.getSourceWindow().close();
		}
	}
}
```


----------



## Grizzly (21. Feb 2012)

Das mit Eclipse habe ich auf der Seite des Projekts auch gesehen.



turtle hat gesagt.:


> [...]
> Läuft bei mir problemlos. Leider sehen Konsole-Anwendungen echt doof aus und habe es nicht weiter angeschaut.
> [...]



Wie meinst Du das? Ist das eine jetzt Deine persönliche Meinung zu Konsolen-Anwendungen im Allgemeinen? Oder kann man mit der JCurses nichts sinnvolles zusammenbauen? ???:L


----------



## turtle (21. Feb 2012)

> Ist das eine jetzt Deine persönliche Meinung zu Konsolen-Anwendungen im Allgemeinen?



Ist meine persönliche Meinung. Im Zeitalter von GUIs auf grossen Monitoren sehen so Programme nach "Turbo-Pascal"-Art ein bisschen "fremd" aus.

Meine kurzen Tests mit jCurses waren schon derart, dass die Programme laufen.


----------



## Grizzly (21. Feb 2012)

turtle hat gesagt.:


> Ist meine persönliche Meinung. Im Zeitalter von GUIs auf grossen Monitoren sehen so Programme nach "Turbo-Pascal"-Art ein bisschen "fremd" aus.
> 
> Meine kurzen Tests mit jCurses waren schon derart, dass die Programme laufen.



Okay, in meinem Fall geht es halt um das Abfragen von Netzwerkeinstellungen beim Start eines Ubuntu Linux. Und da steht halt nur die Konsole zur Verfügung. Danach kann man die Kiste per Web Oberfläche administrieren.


----------



## turtle (22. Feb 2012)

Dann mach mal 

Wie ich sagte, läuft die Demo-Applikation ohne Probleme unter Eclipse und Debuggen geht auch. Also ich sehe keinen Grund warum Du Dein Programm nicht schreiben kannst.

Viel Glück


----------



## Grizzly (22. Feb 2012)

turtle hat gesagt.:


> Dann mach mal
> 
> Wie ich sagte, läuft die Demo-Applikation ohne Probleme unter Eclipse und Debuggen geht auch. Also ich sehe keinen Grund warum Du Dein Programm nicht schreiben kannst.
> 
> Viel Glück



Bin auch schon dabei  , habe allerdings auch schon einige Probleme gefunden.  Und das größte Problem dürfte sein, dass aus einem keiner der Entwickler antwortet. Und der ein schreibt einem auch nur, dass er seit Jahren nichts mehr an dem Projekt gemacht hat.


----------



## turtle (23. Feb 2012)

```
schreibt einem auch nur, dass er seit Jahren nichts mehr an dem Projekt gemacht hat.
```

Wie ich sagte, Konsolen-Applikationen in Turbo-Pascal Optik sind sowas von Retro ueh:

Vielleicht doch nicht so viel auf die Optik schauen und alles per einfacher Eingabe/Ausgabe machen?


----------



## Grizzly (1. Mrz 2012)

turtle hat gesagt.:


> ```
> schreibt einem auch nur, dass er seit Jahren nichts mehr an dem Projekt gemacht hat.
> ```
> 
> ...


Naja, produkte andere Unternehmen und selbst bspw. Ubuntu selbst haben halt zum Einrichten wenigstens so eine Textkonsolen Oberfläche. Wobei die sogar noch weniger als Turbo Vision können. Eine Alternative wäre vielleicht noch eine Lösung über die SVGAlib. Da hat sich bisher aber leider keine die Mühe gemacht, einen Java Wrapper dafür zu schreiben (sprich per JNI oder JNA). Dann könnte man da drauf aufbauen eine kleine AWT oder eine Submenge der Swing implementieren.


----------



## freak_007 (1. Mrz 2012)

Hattest du schon die Idee, dass man auf das Programm mit einer Weboberfläche steuern könnte?


----------



## Grizzly (1. Mrz 2012)

freak_007 hat gesagt.:


> Hattest du schon die Idee, dass man auf das Programm mit einer Weboberfläche steuern könnte?



Okay, vielleicht sollte ich etwas mehr erläutern, was das Ding überhaupt machen soll:

Wir liefern eine virtuell Appliance mit unserer Anwendung darin aus. Der Kunde legt beim ersten Start über die Konsolenanwendung die Netzwerkparameter fest. Deswegen geht an der Stelle leider keine Web Oberfläche, den das Netzwerk ist ja noch gar nicht konfiguriert. Hat er aber erst einmal diesen Schritt geschafft, kann er die Einstellungen ab da auch in der Web Oberfläche unseres Produkts ändern (wo wir dann auch gleich den Code wiederverwenden bzw. die gleiche JAR einbinden). Optional hat er aber dann immer noch die Möglichkeit, das Netzwerk über die Konsolenanwendung zu konfigurieren, falls er sich aus der Web Oberfläche durch falsche Netzwerkeinstellungen "ausgesperrt" hat.

Einen Login auf das System selber wird er übrigens nicht machen können, da dies das Konzept einer Appliance durchkreuzen würde.


----------



## freak_007 (2. Mrz 2012)

Der einfachste Weg auf Linux die erste JCurses Anwendung laufen zu lassen.

Lade dir von Sourceforge die neuste Version von JCurses herunter
Entpacke die tar.gz Datei
Wechsele im entpackten Order in den lib/ Ordner
[WR]Beachte dabei das die Datei jcurses.so in diesem Ordner existiert[/WR]
Führe in diesem Ordner den Befehl 
	
	
	
	





```
java -classpath jcurses.jar jcurses.tests.Test
```

Schon kannst du dir diese Testanwendung ansehen. Im Ordner src/ findest du die Sources. Ich hoffe du brauchst kein zweites Tutorial.
Gruß,
Freak


----------



## Grizzly (2. Mrz 2012)

Ich verstehe gerade irgendwie nur Bahnhof. Die JCurses habe ich bereits zum Laufen bekommen. Habe auch schon fleißig Bugs, Feature Request und so weiter geschrieben sowie Kontakt mit den Entwicklern wegen einigen Dingen aufgenommen.

Die etwa ausführlicheren Text über die Rahmenbedingungen bzw. die Aufgabenstellung, in der ich die JCurses einsetze, habe ich nur wegen der Frage, warum ich keine Web Oberfläche dafür benütze geschrieben.

Aber trotzdem Danke.


----------

