This was cross-platform too:
For the time, Swing was pretty good. Things have moved on and now data flow and state management are primary selling points—see things like CoreData (I'm not really aware of anything like it in other languages) or two-way binding that's prevalent in javascript libraries. This by no means solves state management but I think the primitives are easier to reason with.
Swing drew and managed its own widgets using cross-platform Java.
React Native uses native widgets and drives them from cross-platform JavaScript.
Wonderful.
Thank you.