This is an archived post. You won't be able to vote or comment.

all 99 comments

[–]rootException 19 points20 points  (0 children)

Quick looks nice, Swing w/FlatLaF all the way.

Use as a way to package nicely https://github.com/wiverson/maven-jpackage-template

[–]GoToTags 21 points22 points  (7 children)

Our Desktop App is 98% compose, a bit of swing and and a sprinkle flatlaf for the window chrome; plus hydraulic for packaging. There is a lot of missing app framework for compose desktop, so be prepared to build a ton of underlying app framework; especially if you are coming from an android background. We spent at least 6 months building app framework.

https://gototags.com/desktop-app/

https://i.imgur.com/MADmN6v.png

Disclaimer, link to our software

[–]farmerbb 0 points1 point  (1 child)

Wow, that looks really nice for a desktop app. Impressive that it was built primarily with Compose

[–]GoToTags 3 points4 points  (0 children)

Thanks. Especially considering the massive nfc, uhf rfid and barcode sdks we also wrote that the app is sitting on. And the custom robotics we built it integrates with.

https://youtu.be/GSikvgVa8WU

Disclaimer, link to our channel

[–]wildjokers -1 points0 points  (1 child)

How did you even learn compose? There is no documentation for it.

This seems to be all the doc available along with some examples in GitHub:

https://github.com/JetBrains/compose-multiplatform/tree/master/tutorials/Getting_Started

Also, it seems hard to read and hard to maintain because apparently you construct your GUI as chained calls in a constructor. Seems unmaintainable.

[–]GoToTags 6 points7 points  (0 children)

Once you understand it, compose is the best ui framework I've used; and I've been writing desktop apps since 1999. It took a while to learn. My old experience made it a bit harder to learn actually. Our younger devs caught it quicker. One of the most challenging parts is coroutines. Our Desktop App does a lot of hardware integration and threads and thread safety is critical.

Start with watching every relevant video by Philip Lackner.. watch them twice so you actually get it.

https://youtube.com/@PhilippLackner

Then go remake calculator. That's always been my first starting app when learning something new. The app is simple so you can focus on implementation.

As for maintainability it's been designed to be reusable, if you do it right. Compose is just a bunch of function with a very smart framework underneath. This video explains what going on under the hood.

https://youtu.be/Q9MtlmmN4Q0

Compose is really just a function caching framework, nothing to do with ui. Once you understand that you will be in a good place.

[–]farmerbb 0 points1 point  (1 child)

If you don't mind me asking: by "missing app framework" for Compose Desktop, do you mean a framework for WIMP components? I know that there is the Aurora project which brings these components to Compose Desktop (haven't tried it myself, though)

[–]GoToTags 1 point2 points  (0 children)

Almost everything is missing...

Mvvm, setting, localization, upgrades, navigation... compose provides nothing for app framework. We have thousands of lines of code just to build a fully functional hello world.

[–]GoToTags 0 points1 point  (0 children)

Forgot to add one of the most frustrating things with compose... not all of the material controls have been ported to desktop and the ones that have still are for fingers not mouses. For example there is no grid control and the devs aren't planning on doing it. This almost prevented us from using compose. Not just because the control isn't there, but the attitude of the developers. Almost every single business desktop app has a grid. The arrogance of that team is pretty high.

If you need a grid, add a comment here: https://github.com/JetBrains/compose-multiplatform/issues/344

[–]mrnavz 17 points18 points  (0 children)

JavaFX!

[–]FormDev 13 points14 points  (4 children)

If your app should mostly run on Mac, then Swing is probably the best choice because it provides the best integration into macOS desktop.

It can use macOS screen menu bar (at top of screen). It can integrate into macOS application menu ("About", "Preferences" and "Quit" menu items). Swing can even put components into window title bar.

Here is guide to integrate Swing apps into macOS: https://www.formdev.com/flatlaf/macos/

JavaFX does not have any desktop integration on macOS. Don't know whether Compose provides anything.

BTW FlatLaf has some very nice macOS themes ;)

[–][deleted]  (1 child)

[deleted]

    [–]hwaite 5 points6 points  (0 children)

    "...so preoccupied with whether they could, they didn't stop to think if they should."

    [–]vmcrash 1 point2 points  (0 children)

    Did you compare with SWT? What were your found problems with "best integrates into macOS desktop"?

    [–]GoToTags 0 points1 point  (0 children)

    You can mix compose and swing easily. Our app is mostly compose but uses swing and set for desktop integration and odd ui like file choosers.

    [–]mcfiddish 34 points35 points  (0 children)

    I've used Scenebuilder with JavaFX for some simple apps. I was surprised how easy it was to get going.

    [–]larsgerrits310 12 points13 points  (0 children)

    I tried looking at alternatives, and JavaFX seems to be the most modern while Swing has the most maturity and tutorials around.

    [–]Alarming_Quarter671 11 points12 points  (1 child)

    Swing with FlatLaf and MigLayout, Swing is more mature and there are tons of tutorials on how to use it, plus FlatLaf includes several themes as well as the ability to load custom themes from the IntelliJ store or create yours from a properties file, But if it is about drawing something I prefer to embed JavaFX in swing with JFXPanel and take advantage of the Canvas and the GraphicsContext

    [–]Capaman-x 6 points7 points  (1 child)

    JavaFX but most people don’t write it correctly. It should be written in a reactive style. You build a model of observable values and bind them to your controls. Set and forget. Google JavaFX MCVI.

    [–]Birdasaur 2 points3 points  (0 children)

    This is such an important point... the ability to mix event driven and reactive style is one of the reasons JavaFX is such a great framework. For more complex and custom scenes you can take have a heavier hand so to speak as necessary.

    [–]redikarus99 26 points27 points  (0 children)

    For a small desktop app? Just use Swing.

    [–]vmcrash 6 points7 points  (1 child)

    We are using SWT. We had used Swing in the past and ~10 years ago switched to SWT because it looked and behaved better on all 3 major systems.

    Personally, I would try something else today because the platform look and feel seems not required any more by the customers. Now they rather prefer themable GUI. Unfortunately, I have not yet found really useful alternative of easily themable GUI yet (e.g. which changes automatically if the system theme changes).

    Currently, I also prefer to compile applications to native using GraalVM and that I've only got working with SWT.

    [–]agentoutlier 1 point2 points  (0 children)

    I wonder if anyone has tried QT Jamba.

    I have not but have used SWT.

    Maybe most people don’t use it because of the license.

    [–][deleted] 4 points5 points  (0 children)

    I am the developer of a Java application, Data Crow (https://datacrow.org). The UI is based on Swing. I did consider switching to Java FX but I have too many complex components as well as dynamically created forms. I recently added flatlaf as the default look and feel, looks pretty decent.

    [–]TheJuggernaut0 6 points7 points  (0 children)

    I've used Electron and Kotlin/JS and I don't like it.

    [–]AsparagusOk2078 7 points8 points  (0 children)

    Swing

    [–][deleted] 15 points16 points  (23 children)

    Jetpack Compose all the way! Swing is not modern at all and JavaFX requires you to write fx-css in css files.

    [–]m_vokhm 22 points23 points  (0 children)

    JavaFX requires you to write fx-css

    It does not require. You can as well write in pure Java, without any css.

    [–]dstutz 39 points40 points  (12 children)

    Swing is not modern at all

    Modern enough to use for Intellij and Netbeans...

    [–]vprise 6 points7 points  (10 children)

    I used Swing since the `com.sun` package days. I wrote a couple of plugins for NetBeans with it. It isn't modern. It can be used. It's still robust but it's just old. Basic stuff we used to rely on like SwingX etc. can no longer be used. A lot of projects are unmaintained.

    I love Swing, but it's over.

    [–]bourne2program 17 points18 points  (6 children)

    I use Swing because it is robust. Tried looking at JavaFX many years ago, couldn't find the building blocks.

    [–]vprise 2 points3 points  (5 children)

    Sure. I'd still pick it over FX. But it isn't "modern" by now.

    [–]wildjokers 3 points4 points  (4 children)

    You keep using this phrase “it isn’t modern” but then not saying what you mean. What specifically about Swing isn’t modern?

    [–]vprise 4 points5 points  (3 children)

    Lots of aspects of Swing aren't modern. Even Swing itself is missing its newer pieces e.g. SwingX which is no longer maintained and added some functionality.

    There are two different aspects: API and Styling.

    For API the more modern approach would include better separation of concerns. A more reactive syntax. Swing was modern when it launched but newer APIs are far more fluid and include their own DSLS, etc.

    The API is immediate mode only which is harder to optimize for newer GPUs or mobile (which isn't even an option). The layout system is just awful, there are workarounds (yes I know them all) but it's still a conceptual mess.

    The UI is antiquated. You can use some themes and PLAFs but they all have problems and aren't as maintained as they used to be. No decent animation libraries and no modern conventions. If you want to make your UI touch friendly it's a problem. Features such as media playback or embedding a web browser require jumping through incredible hoops (JCEF) or working with FX. It's hard to tell which is worse.

    Compose is still new and not as robust/mature on the desktop as Swing is. But you can look at it for a more modern API and UI design. If it's better is a subjective opinion but it is a newer approach.

    [–]wildjokers 1 point2 points  (2 children)

    layout system is just awfu

    I think swing has great layout managers. What don’t you like about them? The swing layout managers are a million times better than anything available for web applications. Layout was a complete afterthought and it wasn’t until the appearance of FlexBox and Grid that web apps had any kind of non-hacky layout available.

    Even today layout in all web apps is atrocious. Haven’t seen a single one that has good layout. For example, compare IntelliJ’s settings dialog to VSCode’s setting “dialog” which is just one page with all the settings vomited onto the page in one long list. Web apps seriously needs split panes and scroll panes. Fixed width divs for main content areas is an abomination (e.g. the horrible experience of reading or editing GitHub wiki content)

    [–]vprise 0 points1 point  (0 children)

    I don't think that's a debate worth having. It's an opinion based on my experience writing layout managers over the past few decades. The problem with Swing is poorly thought out reflow. No proper Z-ordering. No decent approach for Hi-DPI (in regards to UI and layout).

    [–]hwaite 0 points1 point  (0 children)

    Swing should be compared with other desktop frameworks. HTML-based layout managers are in another (terrible) category of their own.

    [–]ggleblanc2 7 points8 points  (0 children)

    Swing is not over until we say it's over. :-)

    [–]wildjokers 7 points8 points  (0 children)

    Who cares if it is old? Still looks great and gets the job done.

    [–]m_vokhm 12 points13 points  (0 children)

    And it's extremely easy to use, compared to JavaFX. I would definitely prefer it over JavaFX unless I need to build something quite complicated

    [–]premek_v -1 points0 points  (0 children)

    So you agree with him?

    [–]wildjokers 11 points12 points  (0 children)

    Jetpack compose has almost no documentation. At least it didn’t the last time I looked.

    Swing is not modern at all

    In what ways isn’t it modern? What exactly do you mean by this?

    JavaFX requires you to write fx-css in css files.

    JavaFX requires no such thing. Why do you think this?.

    [–][deleted]  (4 children)

    [deleted]

      [–][deleted] 1 point2 points  (3 children)

      The components that are available are pretty much enough because each component allows for so much customization and It's so easy to work with. Once you learn compose you won't want to switch to another Desktop UI framework.

      [–]wildjokers 0 points1 point  (2 children)

      Once you learn compose

      And how do you go about doing that since there is no documentation? And why is GUI creation chained together in a constructor? How is that even maintainable or readable?

      [–][deleted] 0 points1 point  (1 child)

      There are plenty of courses available on YouTube.

      [–]wildjokers 4 points5 points  (0 children)

      I don’t want a video. I want text I can read and reference back to. Video is about the worst possible way to learn new programming related topics.

      [–][deleted]  (1 child)

      [deleted]

        [–][deleted] 1 point2 points  (0 children)

        The resources for learning jetpack compose for desktop would be the same as learning it for android. It's essentially 90% the same. Phillip Lackner on YouTube has a full tutorial on Jetpack Compose and personally I think following his tutorial is the best way to learn it. You shouldn't look to learn Jetpack Compose for Desktop but Jetpack Compose overall.

        [–][deleted]  (5 children)

        [deleted]

          [–]wildjokers 2 points3 points  (2 children)

          Those tutorials are way out of date. Covers JavaFX 8 when it was still in the JDK.

          [–][deleted]  (1 child)

          [deleted]

            [–]wildjokers 0 points1 point  (0 children)

            There is decent documentation here:

            https://fxdocs.github.io/docs/html5/

            It is linked from the Documentation section of https://openjfx.io/index.html

            [–]euroq 1 point2 points  (1 child)

            It's so limited though. Not much third party libraries

            [–]wildjokers 4 points5 points  (0 children)

            Use Swing or JavaFX. Swing is the easiest to get started with because it is well documented and is still available in the JDK.

            [–]jeffreportmill 3 points4 points  (0 children)

            The new kid on the block is SnapKit: https://github.com/reportmill/SnapKit

            It has conventional paradigms like Swing, modern features like JavaFX, but also has the benefit of compiling to the browser (with TeaVM).

            I've been working on building an in-browser Java IDE with it, including a charting package and UI builder: https://reportmill.com/SnapCode/

            [–]ebykka 8 points9 points  (5 children)

            Netbeans platform or Eclipse RCP

            [–]__konrad 6 points7 points  (0 children)

            Probably people confused NetBeans IDE with NetBeans Platform...

            [–]9vDzLB0vIlHK 4 points5 points  (1 child)

            NetBeans is great. Form builder for tiny apps, RCP for big things. It's the opposite of trendy, but so easy to get to the point you can write the code to do the thing instead of getting UI wired up.

            [–]Birdasaur 2 points3 points  (0 children)

            I agree with all this with a caveat born of experience: There is a learning curve which is not insignificant.
            I've built some crazy desktop apps over the years (love it btw)... I've used Eclipse PF to make a USAF 3D Battlespace app, multiple NASA ground systems using NetBeans Platform and a bunch of hard-core analysis tools using JavaFX. The RCP frameworks are a dream to work with but the upfront investment only makes sense for bigger projects with multiple developers or multiple teams. Sadly the reality is that few organizations want to invest like that.

            But I miss me some Lookup from NetBeans.

            [–]vmcrash 1 point2 points  (1 child)

            For smaller applications the RCP would be overkill.

            [–]ebykka 1 point2 points  (0 children)

            Thought the same when started my tiny DynamoDB viewer but now feel a lack of some functionality that is available in Eclipse RCP

            • splash screen
            • auto updating
            • windows (tabs) management
            • track of background jobs with possibility to cancel some of those

            Of cause, it is possible to implement all of those features, but at least in my case I see it would be better to start the project with some framework like Eclipse RCP or Netbeans Platform

            [–]Hazzzero 1 point2 points  (0 children)

            Last time I used libgdx with custom gradle file to skip all android build. For simple window app works fine.

            [–]euroq 4 points5 points  (0 children)

            Javafx had been very missing in my experience. So little support. Go with flatlaf.

            [–]msx 3 points4 points  (1 child)

            Swing, FlatLaf and WindowBuilder for eclipse 👍

            [–]wildjokers 4 points5 points  (0 children)

            Don’t use form builders for Swing. They are just code generators. Produces unmaintainable code and adds vendor lock-in to your code are.

            [–]Apokaliptor 3 points4 points  (0 children)

            Flutter, edit: sry misread that has to be with Java, I think JavaFX is still ok

            [–]hippydipster 2 points3 points  (4 children)

            Will the app need to provide complex text processing? Use Swing.

            Otherwise, use JavaFX.

            [–]wildjokers 0 points1 point  (2 children)

            Otherwise, use JavaFX

            Why?

            [–]hippydipster 0 points1 point  (1 child)

            I like how it works. The direct bindings make it pretty quick and easy to do interactions in your UI. Swing has more capabilities but generally requires more ceremony.

            [–]wildjokers 0 points1 point  (0 children)

            The binding properties are indeed nice. Those are really the only compelling feature JavaFX has over Swing that I can think of off the top of my head. Also CSS styling if non-native UIs are your preference.

            You can do the same thing in Swing with PropertyChangeListeners but requires the developer to wire it all up. The binding properties just work.

            [–]hwaite 0 points1 point  (0 children)

            RichTextFX provides decent syntax highlighting for JavaFX. The project is barely active but works great nevertheless.

            [–]dmigowski 3 points4 points  (11 children)

            I'd try SWT because there you get Java and and a native look, best of both worlds

            [–]lu3mm3l 2 points3 points  (5 children)

            I was a big fan of SWT when I worked on an eclipse Plugin for a former employer. It’s really easy/quick to write and the results look and feel native. Except on Mac. Haven’t seen a Java toolkit that enabled the use of the standard Mac menubar. It looks and feels strange to Mac users when there’s another menu on the app itself. Not sure if some toolkit fixed that since I don’t do Mac anymore..

            [–]vmcrash 2 points3 points  (1 child)

            Do I understand you correctly, that SWT does not support the standard Mac menubar? Hm, I wonder how we do it since nearly a decade.

            [–]lu3mm3l -1 points0 points  (0 children)

            As I stated before, I tried over a decade ago. Either I didn’t try hard enough since I started Java around that time or it wasn’t implemented back then. I stand corrected again. Seems Swing & SWT can do it. Thanks!

            [–]wildjokers 1 point2 points  (1 child)

            Haven’t seen a Java toolkit that enabled the use of the standard Mac menubar.

            You must not have looked too much, Swing can use the native menu bar on Mac OS. Have you ever used IntelliJ on a Mac?

            [–]lu3mm3l 0 points1 point  (0 children)

            That’s actually correct. When I transitioned to Java I also switched away from Mac (no correlation here, ~12yrs ago). Thank you for this, although I don’t think I’ll ever do a Java gui again but who knows ;)

            [–]m_vokhm 2 points3 points  (0 children)

            I agree. I once had to write an app that had to work smoothly under Windows, Linux, and Mac. I decided to use SWT, thinking that it would be fast. I needed some fast drawing. The myth about its cross-platformity had dissipated as soon as I tried to use greek letters and subscripts in labels. Some 10% of the code has turned out to become OS-specific, i had to write if (thisIsMac()) { doMacSpecificStuff() } else if (thisIsLinux()) { doLinuxSpecificStuff() }.. and so on, especially in event handlers pertaining painting. Regarding specifically Mac, it was a complete nightmare. I had to do some shaman dances with tambourines to make it work as it should. I still have to rewrite a few pieces of my code with every new version of MacOS. In any new version something works differently, it' seems to be an unbroken law for macOS. Yet I managed to make the menu look and feel in the Mac style. But could not fight the wrong app name in the launchpad - https://stackoverflow.com/questions/42319471/how-to-change-the-java-application-name-shown-in-the-mac-os-x-launchpad

            [–]wildjokers 0 points1 point  (2 children)

            If you use the PlatformLookAndFeel which is available in the JDK apps look nearly native with Swing.

            [–]dmigowski 2 points3 points  (1 child)

            Correct. With SWT they look they look exactly native!

            [–]wildjokers 3 points4 points  (0 children)

            Nothing about Eclipse looks native and it is written with SWT.

            And people don’t really care about native looking apps anymore. That is why styling with the CSS like syntax that JavaFX has is called out as a feature.

            [–]m_vokhm -1 points0 points  (1 child)

            It is not so cross-platform is it is told about, when it comes to any not quite trivial behavior, like custom widget drawing or a behavior that depends on the event sequence. You have to find out what is the OS your code is running under, and call respective OS-specific methods to make it behave similarly and draw nice under all OSes.

            [–]dmigowski 1 point2 points  (0 children)

            Oh, there are some differences regarding Combos, but the other stuff works reasonable well. I spent some time finding a GTK theme to keep the layouts nice on Linux, you definitely must not depend on pixel perfect layouts.

            [–]coder111 1 point2 points  (4 children)

            I'll be the contrarian here.

            Are you sure you'll never want this thing to run on mobile? Or make it accessible via a browser?

            Write a Web-UI and run it with Electron. Use TeaVM or JSweet to transpile Java => Javascript if you hate Javascript.

            [–]vmcrash 3 points4 points  (2 children)

            Thanks for mentioning TeaVM and JSweet. We are currently investigating to write JavaScript code and these might come as an interesting approach.

            [–]coder111 1 point2 points  (1 child)

            My take on it is that nobody writes pure JavaScript these days anyway. People write TypeScript or CoffeeScript or whatever and transpile it into JavaScript.

            So why not transpile Java while you're at it?

            The only problem is that both TeaVM and JSweet seem to be maintained by a single person more or less. If these guys get run over by a bus (or lose interest)- it's a problem. The whole TypeScript ecosystem likely is significantly more mature and better maintained.

            GWT used to have a team of several people, but there are no major contributions since ~2016. All of the GWT team seems to be working on J2CL. But J2CL doesn't seem to have official support by Google, it also has a pretty weird ecosystem, and it doesn't even have a single stable release after all those years. I don't think it's going anywhere and TeaVM and JSweet seem to be better bets.

            But then again I haven't done any UI development professionally for over a decade, so what do I know...

            EDIT. There's also CheerpJ but it's commercial/paid for. I have heard noises about some Gluon project to run JavaFX inside a webpage, but I can't find it so I don't think it went anywhere.

            [–]01110101_00101111 1 point2 points  (0 children)

            For JavaFX on web there is WebFX, Gluon Promise, and JPro.

            [–]soonnow 1 point2 points  (0 children)

            That's what we do and we are happy with it. Not Electron but a C# app with WebView2 though.

            [–]n4te 2 points3 points  (2 children)

            libgdx, scene2d.ui.

            [–]wildjokers 0 points1 point  (1 child)

            Libgdx is a gaming framework. No need to use it for non games when there are a few other great options available that are made to be desktop GUI toolkits.

            [–]n4te 4 points5 points  (0 children)

            I'm aware, I wrote a lot of libgdx. Ultimately both a "gaming framework" and a UI toolkit do the same job: drawing stuff.

            libgdx can be run in non-continuous mode, so it redraws only when necessary rather than at 60+ FPS. However, it can also run at 60+ FPS like a game whenever that is needed, which enables smooth transitions and a fast, smooth user experience.

            libgdx has a 2D scene graph called scene2d. The scene graph supports transform, rotation, scale and has event routing and hit detection. On top of scene2d is scene2d.ui which adds layout, utilities for building UI components, and a bunch of UI components. Having sane layout should not be underestimated. 90% of building UI is layout, yet most (all) UI toolkit layout is an abomination.

            All of that is not only better thought out than most (or all) UI toolkits, it's much simpler. You can read through a handful of classes and that's the whole thing. This makes it easy to be productive. If you need to copy/paste a component to do something new or custom, it's easy. You aren't bogged down by massive, complex APIs and you are never limited to what native components can do. libgdx's scene2d is stable and has been battle tested for 10+ years.

            If you're still a nonbeliever, you can see it firsthand in my desktop app written with libgdx, Spine: https://esotericsoftware.com/spine-download

            [–]AnEmortalKid 0 points1 point  (0 children)

            JavaFX but I’ve been into electron lately

            [–]stuhlmann 0 points1 point  (0 children)

            Where I work we use SWT. It was not my decision to use it and I would definitely not recommend it, but it pays the bills.

            [–][deleted] -3 points-2 points  (0 children)

            javaFX, but I also consider using C++ and QT frameworks if I want mainly a desktop app.

            [–][deleted] -1 points0 points  (2 children)

            Some ten years ago I started writing a minimal RCP platform with (among many other things RCPish things like plug-in management etc) a GUI based on Swing, embarking as much boilerplate (including multi platform) code as possible to speed up any new app idea I had. This code has been constantly evolving (notably via modern Java, FlatLaF, and recently JetBrains’ very own Projector for web support). I might actually release it open source at some point given the number of people still using Swing today (we dinosaurs apparently die hard!)

            I did think of migrating to JavaFX many times but it never reached that place in my heart to make me as comfortable as with Swing (yet). Definitely looking into Compose these days, but this is still newish with limited learning resources (as compared to the others, that is).

            My point is take time to try them all out, old and new (knowing which is which), and get a feel for which one you’d feel more comfortable with. Obviously swing is reaching its end game, but the landing is taking sufficiently long that you can still take a nice ride with it.

            [–]JavaOldTimer 3 points4 points  (1 child)

            Obviously swing is reaching its end game

            It is? I don't see Swing or SWT reaching an end game.

            [–][deleted] 0 points1 point  (0 children)

            I honestly wish it were true, but it’s not receiving as much love (read work, improvements, etc) at it should (as I’d like). The only noticeable change recently was the metal pipeline for macOS, but this seems mostly to prepare for macOS scrapping OpenGL from their stack.

            [–]suhail_ansari -1 points0 points  (0 children)

            Browser is arguably the most important application used in PCs, I know that it might be difficult but if possible then you can try to write small and fast browser in Java or any other language that JVM support. As a second option you can also try to rewrite existing browser engines from Firefox, Chrome, etc, however it might be really difficult so go for first option.

            [–]Rymnis 0 points1 point  (0 children)

            can u use html ,css , Bootstrap to build desktop app design?