Hacker News new | past | comments | ask | show | jobs | submit login
Show HN: Sierra, a DSL for building Java Swing applications (github.com/http-rpc)
100 points by gk_brown on Jan 3, 2023 | hide | past | favorite | 33 comments
Yes, I know hardly anyone uses Swing anymore. :-) I basically just did it for fun and thought I would share.



This looks really cool. Applying a thin layer over parts of the standard library is a very good idea IMO. Reduces the dependency tree but a lot.

One question (my Swing knowledge is at least 15 years old!): what's the simplest way to handle events using this? Eg taking the FormTest [1] example, how might one simply bind a model object to the UI elements?

[1] https://github.com/HTTP-RPC/Sierra/blob/master/sierra-test/s...


Added an example demonstrating how to add an action listener to a button:

https://github.com/HTTP-RPC/Sierra/blob/master/sierra-test/s...

I'm not sure it's exactly what you were looking for, but hopefully it is similar enough.


That's great! As I say, my swing experience is very old and it's probably just a case of remembering the basic action framework more than anything else.

But that fits in very nicely with how your library works using with().


Great question. You can do this with a cell consumer (i.e. the with() method). See OrientationTest for an example (e.g. leftToRightButton, rightToLeftButton):

https://github.com/HTTP-RPC/Sierra/blob/master/sierra-test/s...

I should probably add a better example.


I wish there was CDI integration with Swing or JavaFX and you can annotate handlers


> Yes, I know hardly anyone uses Swing anymore.

Actually, Swing is the GUI toolkit used by IntelliJ IDEA, one of the few if not the only commercially successful and kick-ass Java desktop app(s).


The only real problem with Swing is that there was never a version 2. If it had been separated from AWT, updated some of the APIs and given a modern look-and-feel, it would still be relevant today. JavaFX is nice, but it broke too many conventions.

And, of course, Oracle or OpenJDK (or someone) needed to invest in a browser port of the JVM, which is totally possible these days.


Take a look at FlatLAF:

https://github.com/JFormDesigner/FlatLaf

They have done a great job bringing a modern appearance to the Swing components.


NetBeans switched to FlatLaf, and looks pretty good.

As I understand it, IDEA has done a lot of "Swing Work". I don't know if it's just augmenting existing or creating a bunch of new controls or if they delved deeper. It's just my understanding that IDEA is Swing, but not as we know it. I could be wrong.

NetBeans is pretty much pure Swing.



Agreed. I said as much in my response to this issue that was opened the other day:

https://github.com/HTTP-RPC/Sierra/issues/12


This is slightly off-topic, but this post makes me feel sincerely nostalgic for building games in Eclipse and Swing back in the day. Growing up, Notch's live streams[1] where he would code up a game in Java Swing for Ludum Dare were one of my first exposures to programming, and reasons for eventually studying CS. I wish there were some modern alternative to Swing that would be as simple as Swing, but would allow you to create games for the web.

[1] https://www.youtube.com/watch?v=4J_8HkQj9mU


Agree, swing was "terrible" because desktop programming is hard (so many event sources!) but it contained a lot less footguns than say, QT or GTK.

JavaFX is sorta the spiritual successor to swing. On linux, you can actually run it straight from the framebuffer! (No 'desktop' needed!)

There was also this discussion a long while back: https://news.ycombinator.com/item?id=25121705 The project is actively maintained and sees commits quite a bit! Might be what you're looking for.


It's not exactly the same but if you're looking for a simple environment that lets you create games for the web, you should check out the PICO-8: https://www.lexaloffle.com/pico-8.php


Have you looked into Flutter at all? I admit that I have not, but I know it supports web development in addition to mobile and desktop:

https://flutter.dev/multi-platform/web


This is reminiscent of JavaFX's original F3 formulation (aka JavaFX Script): object literals reflecting the GUI visual structure.

JavaFX started out as a Java library on top of Swing but the lack of object literals and lambdas led to the creation of the F3 language (code-named foo for "funcional object-oriented").

Despite Java's progress since then its syntax still feels somewhat rigid. Sierra looks very nice indeed. It could benefit from a more fluid, less syntax-encumbered DSL laid on top of it in Kotlin or Scala.


Thanks for the feedback. I did consider using Kotlin but wanted to make sure it worked at least minimally in Java first.


Yeah, Implementing the framework as such in Java with no other dependencies is a sound decision, imho.

Laying out a Kotlin DSL on top of it could be an excellent opt-in feature to leverage the core in a more declarative way


I'd use this every day in place of $JS-framework-of-the-day + HTML + CSS, alas...


I really like the examples: a screenshot of what the thing looks like, with a link to the corresponding source code right next to it! I think all UI component frameworks (or DSLs, I guess) should have something like that.

Some webdev libraries/frameworks have gone a step further and include code in the same page (though maybe it could/should be collapsed by default sometimes).


I generally prefer links since otherwise the code and examples can easily get out of sync.


I really like this as a casual user that is going to just scroll through the page and see what it looks like - I wouldn't go out of my way to click on the examples.

This might be useful as an overview of what it is more then live examples


Thank you for doing this.

I've maintained or built Swing applications for work and at university. One was a game.

I hope I'm not the only one who feels frontend programming is difficult to get right and to get maintainable software.

I would like to learn Qt but the C++ is a barrier to learning it.


It’s nice to see new developments for Swing, however GroupLayout is the only layout manager I ever needed in practice. Once you grok the combination of parallel/sequential with horizontal/vertical, it’s most flexible and quite intuitive, and is also close to declarative in syntax.


Make Swing Great Again!


Was hoping this meant the resurrection of JavaFxScript/Visage: https://en.wikipedia.org/wiki/JavaFX_Script#Syntax


You might like Groovy’s SwingBuilder: http://groovy-lang.org/swing.html


Sierra 1.0 and 1.1 actually took a similar approach - trying to create a DSL based on the standard layout managers.

However, I ultimately found that approach too limiting and went with custom layout managers for version 1.2.


This is very nice! It is easy to get lost in most raw Swing code, but this seems to result in hierarchically defined code that keeps nested UI elements in context. I can almost visualize the resulting UI from the code.


This looks nice, finally a good attempt at a java Swift UI, will try it out.


Sierra is actually inspired by Lima, a UIKit DSL I created in Swift before SwiftUI was announced:

https://github.com/HTTP-RPC/Lima


[ insert random Wayne’s World reference here ]


A DSL is nifty. Does anyone know of anything similar for Go ?




Join us for AI Startup School this June 16-17 in San Francisco!

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: