What's the best way to get text user-interfaces (ncurses-like) functionality in Java?
Asked Answered
P

8

27

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?

Philately answered 24/8, 2009 at 9:20 Comment(5)
I looked into this a couple of years ago and didn't find any more than you have. I suspect the problem is that the low-level terminal functionality is highly platform-specific -- and not just at the OS level but at the terminal emulator level (VT100, xterm, etc). I'm not sure how I'd even go about dealing with that, without wrapping a native API like curses (or termcap / terminfo, at least) that already abstracts it. I suppose you could talk raw control characters to System.out.Crimmer
Talking raw control chars to stdout is exactly how curses does it, so it's a sensible idea, although a substantial piece of work.Practise
What's wrong with JNI? I'd go with CHARVA, it looks complete (ish).Chain
I would recommend going with CHARVA. There is a lot going on in the ncurses library. Not only does it support lots of different terminal types, it also handles lots of the cases where a particular version of an emulator is buggy. The only sane ways to get ncurses-equivalent terminal support are to wrap ncurses as CHARVA does, or to port ncurses to Java. The latter would be cool if someone would support it going forward.Hilleary
possible duplicate of What's a good Java, curses-like, library for terminal applications?Bullhorn
U
32

Since 2010 there is Lanterna :

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.

More here: https://github.com/mabe02/lanterna

Understandable answered 18/12, 2012 at 15:3 Comment(1)
That looks great. I don't work at the company where I needed that, but now I know for future reference :) Thanks.Philately
D
10

You may want to go vote for 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.

Demineralize answered 30/8, 2009 at 6:19 Comment(0)
D
3

You can try Jexer - Java Text User Interface:

https://jexer.sourceforge.io/

https://gitlab.com/AutumnMeowMeow/jexer

Druggist answered 18/11, 2018 at 16:44 Comment(0)
S
2

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.

Scurrile answered 27/8, 2009 at 23:28 Comment(0)
C
2

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.

Crespo answered 28/8, 2009 at 2:47 Comment(0)
S
1

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/

Sortition answered 24/8, 2009 at 10:9 Comment(2)
looks like that uses JNI alsoPractise
It is not updated in seven years, though... It also seems to use some native code, probably using JNI.Stockstill
F
1

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
 (...)
 }

}
Furor answered 24/8, 2009 at 15:36 Comment(0)
F
1

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.

Fugleman answered 28/8, 2009 at 15:27 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.