Cross-platform window management and OS integration library for Java
C++
644
595 commits
updated Jun 29, 2026
JWM is a cross-platform Java window management and OS integration library.
JWM aims to expose an interface that abstracts over window creation, input handling and OS integration. It’s planned to support all the primary desktop platforms:
Primary goals:
Motto: “Electron for JVM, without Chrome and JS”

Traditionally, Java UIs struggled with high-quality OS integration. JWM plans to bring it to modern standards by implementing those integrations from scratch in modern low-level OS-native APIs. Prior art:
AWT:
JavaFX:
GLFW via LWJGL, SDL2:
Electron:
| Key | Value |
|---|---|
| groupId | io.github.humbleui |
| artifactId | jwm |
| version |
Alpha. Expect API breakages.
| Windows | macOS | X11 | |
|---|---|---|---|
| start | ✅ | ✅ | ✅ |
| makeWindow | ✅ | #121 | ✅ |
| getScreens | ✅ | ✅ | ✅ |
| getPrimaryScreen | ✅ | ✅ | ✅ |
| runOnUIThread | ✅ | ✅ | ✅ |
| terminate | ✅ | ✅ | ✅ |
| Show notification | ❌ | ❌ | ❌ |
| Windows | macOS | X11 | |
|---|---|---|---|
| isHighContrast | ✅ | ✅ | ➖ |
| isDark | ✅ | ✅ | ➖ |
| isInverted | #161 | ✅ | ➖ |
| Windows | macOS | X11 | |
|---|---|---|---|
| setEventListener | ✅ | ✅ | ✅ |
| setTextInputClient | ✅ | ✅ | ✅ |
| setTextInputEnabled | ✅ | ❌ | ❌ |
| unmarkText | ✅ | ❌ | ❌ |
| show | ✅ | ✅ | ✅ |
| getWindowRect | ✅ | ✅ | ✅ |
| getContentRect | ✅ | ✅ | ✅ |
| setWindowPosition | ✅ | ✅ | ✅ |
| setWindowSize | ✅ | ✅ | ✅ |
| setContentSize | ✅ | ✅ | ✅ |
| getScreen | ✅ | ✅ | ✅ |
| requestFrame | ✅ | ✅ | ✅ |
| close | ✅ | #107 | ✅ |
| minimize | ✅ | ✅ | ✅ |
| maximize | ✅ | ✅ | ✅ |
| restore | ✅ | ✅ | ✅ |
| setTitle | ✅ | ✅ | ✅ |
| setIcon | ✅ | ✅ | #95 |
| Set system cursor | ✅ | ✅ | ✅ |
| Customize titlebar | #75 | #75 | #75 |
| focus | ✅ | ✅ | ❌ |
| Get ZOrder | ❌ | ✅ | ❌ |
| Progress Bar | ❌ | ✅ | ❌ |
| Set custom cursor | ❌ | ❌ | ❌ |
| openFile | ❌ | ❌ | ❌ |
| openFolder | ❌ | ❌ | ❌ |
| Transparency | ✅ | ❌ | ❌ |
| Toggle Fullscreen | ❌ | ✅ | ✅ |
| setMinimumSize | ❌ | ❌ | ❌ |
| setMaximumSize | ❌ | ❌ | ❌ |
| setResizable | ❌ | ❌ | ❌ |
| bringToFront | ✅ | ❌ | ❌ |
| isFront | ✅ | ✅ | ❌ |
| Windows | macOS | X11 | |
|---|---|---|---|
| EventFrame | ✅ | ✅ | ✅ |
| EventKey | ✅ | ✅ | ✅ |
| EventMouseButton | ✅ | ✅ | ✅ |
| EventMouseMove | ✅ | ✅ | ✅ |
| EventMouseScroll | #115 | ✅ | ✅ |
| EventTextInput | ✅ | #105 | ✅ |
| EventTextInputMarked | ✅ | ✅ | ✅ |
| EventWindowCloseRequest | ✅ | ✅ | ✅ |
| EventWindowMove | ✅ | #116 | ✅ |
| EventWindowResize | ✅ | ✅ | ✅ |
| EventWindowMinimize | ✅ | ✅ | #96 |
| EventWindowMaximize | ✅ | ✅ | #96 |
| EventWindowRestore | ✅ | ✅ | #96 |
| EventWindowVisible | #140 | #140 | #140 |
| EventWindowScreenChange | #117 | #117 | #117 |
| EventWindowFocusIn | ✅ | ✅ | ✅ |
| EventWindowFocusOut | ✅ | ✅ | ✅ |
| EventWindowFullScreenEnter | ❌ | ✅ | ❌ |
| EventWindowFullScreenExit | ❌ | ✅ | ❌ |
| Drag & Drop | ❌ | ❌ | ❌ |
| Touch events | ❌ | #249 | ❌ |
| Theme Changed | ❌ | ❌ | ❌ |
| Windows | macOS | X11 | |
|---|---|---|---|
| Raster | ✅ | #81 | ✅ |
| OpenGL | ✅ | ✅ | ✅ |
| DirectX 11 | ❌ | ➖ | ➖ |
| DirectX 12 | ✅ | ➖ | ➖ |
| Metal | ➖ | ✅ | ➖ |
| Vulkan | ❌ | ➖ | ❌ |
| Windows | macOS | X11 | |
|---|---|---|---|
| Run on GraalVM | ❌ | ❌ | ❌ |
| App package | ❌ | ❌ | ❌ |
Prerequisites:
libxcomposite-dev libxrandr-dev libgl1-mesa-dev libxi-dev libxcursor-devRun:
./script/build.py
Run examples:
./script/run.py
Run examples without building (use version from the table above):
./script/run.py --jwm-version <version>
Generate & install a local .jar file:
./script/install.py
This outputs target/jwm-0.0.0-SNAPSHOT.jar for use in testing (e.g. io.github.humbleui/jwm {:local/root "..."} if using deps.edn)
Before running the build, ensure you've installed:
xcode-select --install)brew install ninja)brew install python)Set JWM_VERBOSE in process env to see extra log output when running locally.
# Mac / Linux
export JWM_VERBOSE=true
# Windows
set JWM_VERBOSE=true
PRs & issue reports are welcome!
Please read Conventions first.
If you are looking where to start, there’s a label: Good first issue.
Issues labeled “Design” and “Not sure” require prior discussion—leave a comment with your ideas!
Development sponsored by:
769 followers · starred Sep 2021
2,399 followers · starred Jan 2023
55 followers · starred Oct 2022
367 followers · starred Oct 2023
Cross-platform window management and OS integration library for Java
C++
644
595 commits
updated Jun 29, 2026
JWM is a cross-platform Java window management and OS integration library.
JWM aims to expose an interface that abstracts over window creation, input handling and OS integration. It’s planned to support all the primary desktop platforms:
Primary goals:
Motto: “Electron for JVM, without Chrome and JS”

Traditionally, Java UIs struggled with high-quality OS integration. JWM plans to bring it to modern standards by implementing those integrations from scratch in modern low-level OS-native APIs. Prior art:
AWT:
JavaFX:
GLFW via LWJGL, SDL2:
Electron:
| Key | Value |
|---|---|
| groupId | io.github.humbleui |
| artifactId | jwm |
| version |
Alpha. Expect API breakages.
| Windows | macOS | X11 | |
|---|---|---|---|
| start | ✅ | ✅ | ✅ |
| makeWindow | ✅ | #121 | ✅ |
| getScreens | ✅ | ✅ | ✅ |
| getPrimaryScreen | ✅ | ✅ | ✅ |
| runOnUIThread | ✅ | ✅ | ✅ |
| terminate | ✅ | ✅ | ✅ |
| Show notification | ❌ | ❌ | ❌ |
| Windows | macOS | X11 | |
|---|---|---|---|
| isHighContrast | ✅ | ✅ | ➖ |
| isDark | ✅ | ✅ | ➖ |
| isInverted | #161 | ✅ | ➖ |
| Windows | macOS | X11 | |
|---|---|---|---|
| setEventListener | ✅ | ✅ | ✅ |
| setTextInputClient | ✅ | ✅ | ✅ |
| setTextInputEnabled | ✅ | ❌ | ❌ |
| unmarkText | ✅ | ❌ | ❌ |
| show | ✅ | ✅ | ✅ |
| getWindowRect | ✅ | ✅ | ✅ |
| getContentRect | ✅ | ✅ | ✅ |
| setWindowPosition | ✅ | ✅ | ✅ |
| setWindowSize | ✅ | ✅ | ✅ |
| setContentSize | ✅ | ✅ | ✅ |
| getScreen | ✅ | ✅ | ✅ |
| requestFrame | ✅ | ✅ | ✅ |
| close | ✅ | #107 | ✅ |
| minimize | ✅ | ✅ | ✅ |
| maximize | ✅ | ✅ | ✅ |
| restore | ✅ | ✅ | ✅ |
| setTitle | ✅ | ✅ | ✅ |
| setIcon | ✅ | ✅ | #95 |
| Set system cursor | ✅ | ✅ | ✅ |
| Customize titlebar | #75 | #75 | #75 |
| focus | ✅ | ✅ | ❌ |
| Get ZOrder | ❌ | ✅ | ❌ |
| Progress Bar | ❌ | ✅ | ❌ |
| Set custom cursor | ❌ | ❌ | ❌ |
| openFile | ❌ | ❌ | ❌ |
| openFolder | ❌ | ❌ | ❌ |
| Transparency | ✅ | ❌ | ❌ |
| Toggle Fullscreen | ❌ | ✅ | ✅ |
| setMinimumSize | ❌ | ❌ | ❌ |
| setMaximumSize | ❌ | ❌ | ❌ |
| setResizable | ❌ | ❌ | ❌ |
| bringToFront | ✅ | ❌ | ❌ |
| isFront | ✅ | ✅ | ❌ |
| Windows | macOS | X11 | |
|---|---|---|---|
| EventFrame | ✅ | ✅ | ✅ |
| EventKey | ✅ | ✅ | ✅ |
| EventMouseButton | ✅ | ✅ | ✅ |
| EventMouseMove | ✅ | ✅ | ✅ |
| EventMouseScroll | #115 | ✅ | ✅ |
| EventTextInput | ✅ | #105 | ✅ |
| EventTextInputMarked | ✅ | ✅ | ✅ |
| EventWindowCloseRequest | ✅ | ✅ | ✅ |
| EventWindowMove | ✅ | #116 | ✅ |
| EventWindowResize | ✅ | ✅ | ✅ |
| EventWindowMinimize | ✅ | ✅ | #96 |
| EventWindowMaximize | ✅ | ✅ | #96 |
| EventWindowRestore | ✅ | ✅ | #96 |
| EventWindowVisible | #140 | #140 | #140 |
| EventWindowScreenChange | #117 | #117 | #117 |
| EventWindowFocusIn | ✅ | ✅ | ✅ |
| EventWindowFocusOut | ✅ | ✅ | ✅ |
| EventWindowFullScreenEnter | ❌ | ✅ | ❌ |
| EventWindowFullScreenExit | ❌ | ✅ | ❌ |
| Drag & Drop | ❌ | ❌ | ❌ |
| Touch events | ❌ | #249 | ❌ |
| Theme Changed | ❌ | ❌ | ❌ |
| Windows | macOS | X11 | |
|---|---|---|---|
| Raster | ✅ | #81 | ✅ |
| OpenGL | ✅ | ✅ | ✅ |
| DirectX 11 | ❌ | ➖ | ➖ |
| DirectX 12 | ✅ | ➖ | ➖ |
| Metal | ➖ | ✅ | ➖ |
| Vulkan | ❌ | ➖ | ❌ |
| Windows | macOS | X11 | |
|---|---|---|---|
| Run on GraalVM | ❌ | ❌ | ❌ |
| App package | ❌ | ❌ | ❌ |
Prerequisites:
libxcomposite-dev libxrandr-dev libgl1-mesa-dev libxi-dev libxcursor-devRun:
./script/build.py
Run examples:
./script/run.py
Run examples without building (use version from the table above):
./script/run.py --jwm-version <version>
Generate & install a local .jar file:
./script/install.py
This outputs target/jwm-0.0.0-SNAPSHOT.jar for use in testing (e.g. io.github.humbleui/jwm {:local/root "..."} if using deps.edn)
Before running the build, ensure you've installed:
xcode-select --install)brew install ninja)brew install python)Set JWM_VERBOSE in process env to see extra log output when running locally.
# Mac / Linux
export JWM_VERBOSE=true
# Windows
set JWM_VERBOSE=true
PRs & issue reports are welcome!
Please read Conventions first.
If you are looking where to start, there’s a label: Good first issue.
Issues labeled “Design” and “Not sure” require prior discussion—leave a comment with your ideas!
Development sponsored by:
769 followers · starred Sep 2021
2,399 followers · starred Jan 2023
55 followers · starred Oct 2022
367 followers · starred Oct 2023