JCurses Nutzung

kinglui

Aktives Mitglied
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:
Code:
[] 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

Top Contributor
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

Aktives Mitglied
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):(
 

turtle

Top Contributor
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
HTML:
/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
Java:
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

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

[...]
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

Top Contributor
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

Top Contributor
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

Top Contributor
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

Top Contributor
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

Top Contributor
Code:
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 :pueh:

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

Grizzly

Top Contributor
Code:
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 :pueh:

Vielleicht doch nicht so viel auf die Optik schauen und alles per einfacher Eingabe/Ausgabe machen?
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.
 
F

freak_007

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

Grizzly

Top Contributor
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.
 
F

freak_007

Gast
Der einfachste Weg auf Linux die erste JCurses Anwendung laufen zu lassen.
  1. Lade dir von Sourceforge die neuste Version von JCurses herunter
  2. Entpacke die tar.gz Datei
  3. Wechsele im entpackten Order in den lib/ Ordner
    [WR]Beachte dabei das die Datei jcurses.so in diesem Ordner existiert[/WR]
  4. Führe in diesem Ordner den Befehl
    Code:
    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

Top Contributor
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. :)
 

Ähnliche Java Themen

Neue Themen


Oben