Reputation: 430
I need to implement a console application (possibly in Java) with ncurses-like functionality (such as navigating a menu and redrawing the whole screen).
The only solutions that I can find to do this so far are CHARVA ("A Java Windowing Toolkit for Text Terminals"), tuipeer ("A Text User Interface for the Java AWT") and a really old Dr. Dobb's article ("A Text UI for the Java AWT ").
So far, CHARVA is the best thing that I can find but I don't like the idea of it using JNI to wrap curses.
Is there any standard way, say with AWT/Swing, to do do this? What other alternatives are there?
Upvotes: 28
Views: 39676
Reputation: 1678
Refer to1 this issue here: https://bugs.java.com/bugdatabase/view_bug?bug_id=6351276
Essentially there is no good way to get ncurses-like functionality without JNI until this issue is addressed.
1 - This answer used to suggest that people "vote" for this issue. This is no longer possible. Java bug/issue voting was disabled around the time that Oracle merged with Sun Microsystems.
Upvotes: 10
Reputation: 1580
Since 2010 there is Lanterna.
To quote the project page:
Lanterna is a Java library allowing you to write easy semi-graphical user interfaces in a text-only environment, very similar to the C library curses but with more functionality. Lanterna is supporting xterm compatible terminals and terminal emulators such as konsole, gnome-terminal, putty, xterm and many more. One of the main benefits of lanterna is that it's not dependent on any native library but runs 100% in pure Java.
…
Lanterna is structured into three layers …
The first is a low level terminal interface which gives you the most basic control of the terminal text area. …
The second level is a full screen buffer, the whole text screen in memory and allowing you to write to this before flushing the changes to the actual terminal. …
The third level is a full GUI toolkit with windows, buttons, labels and some other components. …
When running in a GUI rather than a computer terminal, such as during development with an IDE, a bundled terminal emulator written in Swing will be used rather than standard output.
See project page at GitHub. Active as of 2024-12. Pure Java. Open-source per LGPL-3.0 license.
Upvotes: 33
Reputation: 5618
You can try Jexer - Java Text User Interface:
https://gitlab.com/AutumnMeowMeow/jexer
Upvotes: 5
Reputation: 6940
I think it would be better to abstract your Java code from the TUI and use ncurses against several separated parts of your application or using arguments, in a web-services style. For example, code your TUI and when the user calls an action, use ncurses to call your code passing some parameters
java -Daction=doSomething MyApp
This way you can code your app using a GUI also in case you need to.
Upvotes: 1
Reputation: 3490
I'm using JavaTUI (http://sourceforge.net/projects/javatui/files/) in my several console java projects. It's best what i can find but it so far from perfect. I'm think there is not a good TUI implemetation in java world.
Upvotes: 2
Reputation: 2262
The short answer is deal with a Java wrapper around curses.
The long answer:
Terminals vary a lot, which is why terminfo/termcap libraries exist and why they are a mess to deal with (The maintainers of those projects are saints btw). They abstract away all the really basic terminal variations to something sane. Curses make those in nice efficient libraries to use.
If you want a pure Java solution, you'll need both those libraries or their equivalent in Java. I'm sure someone will point you to that if it exists, but I as far as I know it doesn't exist.
Upvotes: 2
Reputation: 35226
Try java curses (sorry it uses JNI). I also tried to implement a short version of this library just to learn JNI , see http://plindenbaum.blogspot.com/2008/01/java-native-interface-jni-notebook.html. One could also imagine a specialized JPanel displaying a matrix of characters:
public class TPanel extends JPanel
{
private Vector<Vector<YourCharAndStyle>> rows;
protected void paintComponent(Graphics g)
{
//paint the characters
(...)
}
}
Upvotes: 1
Reputation:
I believe Jcurses is a native java implementation of the curses API, I recall it have a few quirks, but it should be able to do what you want:
http://sourceforge.net/projects/javacurses/
Upvotes: 1