From c37712b0f090d0f2a92cacc9a88a2db6dd499723 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Sun, 17 Nov 2024 19:41:54 +0100 Subject: [PATCH] Windows: fixed wrong layout in maximized frame after changing screen scale factor (issue #904) Windows binaries built and signed locally in clean workspace --- CHANGELOG.md | 2 + .../flatlaf/natives/flatlaf-windows-arm64.dll | Bin 23272 -> 23272 bytes .../flatlaf/natives/flatlaf-windows-x86.dll | Bin 21736 -> 21736 bytes .../natives/flatlaf-windows-x86_64.dll | Bin 23784 -> 23784 bytes .../FlatWindowsNativeWindowBorder.java | 42 ++++++++++++ .../flatlaf-natives-windows/README.md | 29 +++++++++ .../src/main/cpp/FlatWndProc.cpp | 17 +++++ .../testing/FlatWindowDecorationsTest.java | 60 ++++++++++++++++++ .../testing/FlatWindowDecorationsTest.jfd | 21 ++++++ gradle/libs.versions.toml | 4 +- 10 files changed, 173 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e52959f2..da6680bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ FlatLaf Change Log - FlatLaf window decorations: - Windows: Fixed possible deadlock with TabbedPane in window title area in "full window content" mode. (issue #909) + - Windows: Fixed wrong layout in maximized frame after changing screen scale + factor. (issue #904) - Linux: Fixed continuous cursor toggling between resize and standard cursor when resizing window. (issue #907) diff --git a/flatlaf-core/src/main/resources/com/formdev/flatlaf/natives/flatlaf-windows-arm64.dll b/flatlaf-core/src/main/resources/com/formdev/flatlaf/natives/flatlaf-windows-arm64.dll index b91c3210dabde9ecfe177cf8b7f9cd2a80483abd..d9ebcfb5fb7d1645905e7544a4248d2c8b269c6c 100644 GIT binary patch delta 9290 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 delta 9075 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 diff --git a/flatlaf-core/src/main/resources/com/formdev/flatlaf/natives/flatlaf-windows-x86.dll b/flatlaf-core/src/main/resources/com/formdev/flatlaf/natives/flatlaf-windows-x86.dll index ba214bf0155cc529c225482299bb48b88f3e4179..ab1cbfd2e450ca18e3719d940f09df46fdf93f3d 100644 GIT binary patch delta 5476 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 CK{V6= diff --git a/flatlaf-core/src/main/resources/com/formdev/flatlaf/natives/flatlaf-windows-x86_64.dll b/flatlaf-core/src/main/resources/com/formdev/flatlaf/natives/flatlaf-windows-x86_64.dll index d4e2233af52165506d6960a17e1b44882ca1d667..9d31677bb776fb12aa2dbbca8579fe597324f318 100644 GIT binary patch delta 8152 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 delta 8030 zcmeHrcUV(d)A&sY9ZV>JP?UfXX-eo#Tmk_v8Wga=T2T;DaTgU76bRBZUZdz$!MY%8 zT~}5S1at)i1u24piVaavgII7`1r^OVCkehhzxVg&_vd$?XENu^nRe#R%sDrba*Cv! zl9MJZNh&P*z-k^Ifr^NxZ^N>A)9_uuN0!xp8p>KHa=3>1Ai)yE1jLpDyMVAyV{IrYI~(tMTlqaR~Kqs%OH)avx9=C|)U*Try;dQGFH z(1^ai6uvk@6R*22g(onwsSNpy4?e@`KG$)gUSbEv1jG>7O3)Gz$(&%vN4)E2n`Hu(oT*~&tBpiNLN$R{$l!}s&);RI|(9NJH3@Tm;C4xdV{RpwCdk0o=JEmWK251FH4zG#73P}ZaPO?*Pn z->Hfx4wYuzNwkZOmfOZKU$GYT_Gdh@8nznfF{LI&g)in&`jk_(#UWC@*R|A69#KDd zJL_hmo3xte)sSL?N8Uzm(9P1o_c5vlTA&&hl6!b!Unyy)%A);iiebe9)o_YX4Hw07 z7`P~&!wTcgVInMM;_0`W9 zJo=>@n$6Jrh8F0UpsR2?%YxzR(mgtZ&7ocfdxj8l#@Q{=#fVt8T-)k_1 zRnZSABeOJUO#Z3vFVvE`sQlR)!~BUBoS4U;m)5`*toX=L$CA7k1DyN?;m9+~SpCXdAKsNJ_L|?}ufX&l^IU+@K+o&DsVu0kK0CET^h1 z(gF+J zfJJu2@JOik!y1HLO+ciQY)zNhC(xTGw2Po!fFlyauTp7+4@e<*wnHtBBt#$t6lFu- znzU4REPnBg01rxEI8isr0rnX`BSS)opX&V%1QYzoR!xp@oPbbvk|~|XkXV5EKCS3F zo;!y1(QfeEDd2)UeFQ`!pQr=VQYKC2+CokQPQ-Fza3Y=)hiBCK@RslvFR6htWf@{v z9zZkH_cH)>CWcu8Oonj;Kt8}QtYZ{)D%q-)PeYYU#%WKYydsZkTiITPHPo}R?#QBg zi!WMFlQMIFiW=Dt8F3bLwVMg1Ey6(?z(e+{r<19YK(F)p54go{${ z(;5EV;#rz>9sfEh(-{Q7$#^BH9}NU?vTKYr<16e^PMo2oAeyp7DK&DD8;Vt`R7tUD zMy{c2c<)ruouxC>`s}xOf8ttp7Z)w$sG&x~#)&`{I0qU>)n*o&qS};~<_0FoV3-QGff=Vy0^&JNJdlO^ zjVxRgT+DodJQ7{u-5Z{G6p4qSo<+B2*k?YWPE2iIlzY#_i>_8nzIcx zEBYrdWa{E*5aubI4w5zcmahE+$mPu} zd5ahM!FdAdFdwyUksli;>iP~g$?6#09N_wp%wh9Id~z()NchE{=!L%SbVtez0Djqd ziuybO$M82gdd)3-qD#v3fJM|<>iqjqShK34p?wV!9S9ln==*Ne`M(N=1*e+=anLJz z*v(2R%!oQz4^qu~gwVta_6JbnUk!zU`i}pAlu5ltCqEc4rw__FRFSMqqY2U7=gF$TOcB_N>C zA~VU6SybW?wd4u|2PP=HH%6|Ev0fD^qY__#DB=Epl%#;)TgQOgj=~>`7Xd8*)PSEA z5hG4c0sqG-4qf^{DyR3 zg;I62$t;!!E0=M) zBWsoRYQ>eNJPMgc%@IaIufMQ{U@MVg8ROKbd#}spk0-qaMSKvJgoUXvJ3LLJ$0SfG@z@{?n2cMn_ z0;a(KC=7NfaH|5hkMJoxOjPVBg5;SE($H5fIfc!dKux2jDLAkgM+`%+34PuMuoP4@ zCX?7J9Q2|0Oiqki8ov~B!bSe6J9)W$jy`!4L16MqH0OXG3|mO*nCltDd16>FWRYUU z8Ld=#k)Gz3lzMWh`4Ouz7;BC;#&XueSnKrrb-NgGlo{&SjGnQWhqEchps+AnoKgfe znEb`UOlYl*S;w1T)=@^7wKEH|rs!g0`%SuxS`Dk1!EiR|(=h#bZA^b1qsv^GiYYs5 zV6AX#dIb;#rp+~Im`0QqraVVeM$?~wVR49#K1_g)`2Ita%Z;83M=PVK(=hcr%2nVT z*IbQ?sm1GIIVKo(8K4y@MYK7(vUxYq9wQn{1!MiIg)w@xF|~Gm4AGC7!tGJ!1omHZ zr0a()hG~v6K<*#!Dnu6p6j8RT{9uN!A`HPPct0HgYCvzD2oZw@v9$g8evv_pIqs)&Pi(xd#RD|OI*f2&o6Mze2ggwVW=E2wp@ULtP zyW#|Y3B1Oa#D#@F{@9Fh;l$ z;4c^>+yqbsV^kuSECsMz@Mxs2;$V#G>n8v-Mm3fR5CdaWYxN3x7hn}D42uQl7=YaX z5?#o(R8KRB9jKsEF>bouBNcU6DtXpgZ5Q7yO0rL8(>@9H?xc1ZPb}FGkSfs$ zO4t+f<@>n-;rPMTQPJlsck!<$J4CE-t%#iXas7H)<=vPIX5JZ3Yv(1DX`P(UWir3N ztcc3q9?*C)TiM!W_80E^ziLzGT4#1TCE0A)rx6gKdgWKIU(Xj%|5{ZJv1;Bqn)LMT?r`-rD;fu@tc8aq|4#dO{iNT8=2d3} zxIfE%L2p}>mHJUhVg1EHmr7>OoFj)Wk69jarHJ=r(uvEdCf^6KE?-HvZS(cZKZSI- z&|grPlCBSDl$NBzo#@kglDz;)0;7 zT_<{O`e{3rSpQ^qkuZ1KxC3ALdd57SMecBl@6#RpMc5 z++xyeZ^`*N>!+T*@_g;qEq}C6JZs>X z)tj6>byv0zd}~vG{p6&%iR;lBxtdD`4D|V-6;1i6JHJVYGgpXjVTG2BoN>5s;Wvijo5zrBXyTPFb!*qe3ci6IC>A z$Uc7uAv#1|oRjzTYA`yLHNk$QgCeHmo$>uW`Ry|=@Zy&cTa%EfiVVAX)p1FN{gLj#-U)LS`(aqgi&CUQC;>jbYID|`-#>btGg0^ z&h6&gPQSbF)_XO>*XdC~((&C5+3zm?ZXOlaclSm9!^q;vy~^*-eByi@d*zVng-c7G z_P^VZ;&5R3w7Ey7bL`LB=3f0x*z;}k`l*iZLY=?1U+!zqw{t$!-T6zDk*XVIH{G-( zr1^{>I%8YRvddR^CW%ICdLGcb!g*gi&f7f;DZ2P4Q$_#vGBv%nmE)45f{xIi-nzYb z$C*EZnKz3YuH3Knis2U?_wxO=KIPpL4QY}yBlW~Wjc@@rHEU%;T}ITsgyvnk!VU9| zbH3cKU2R?=F>}td_k6vY^4H*3o9s86L)}m3sTZuh5WBW$YT2**?>=MbeP23FW5@UY z(z?5Kow1z$O5gN`{I%YP_mH%UE8`|=&$?9Ndi&-Qwcq0k-)MZ$nH<&CXkpv%!Aj3O zFeFtay3OnAm%iQZ9U-a>doMi?E*S7^+fK`9^w~@%2kzECUix0|)%)hwsDiumPA_*T z?7Z6@SZqFBi6Y!$e6KVAbV;7!l{oRN?Nee7cTA8r+VwQQUSzT7%?=Cd>9UrzQx9Hs zUw>&eX0&e;3UA`aWWed~?yEL&ZXyy)+1OWk4uHx~BgoYB2MF>7GwxIGWA z`MCeKs6K!4gv1F)Y?L=;TIZF9CGC1-InVa5fs=o`X?5gnm^H6FRCulQi2La+uh#Gu z?pS%d+_v_{=9a@>5}%XC8;-3^XbbM)>t1DRA3e=)9eNSCQEk5Y^@}Ze`;6yQlwYY{ zX;jf-@K1)D^Dlq#ET44F&zV zK2tTfJG=7iL_1#VL8s}bT-(dn?N7~3a>ti6Tzl;8_%z|3>x%iJp-(64Ud(ctg8hB< zuuW_drqigem3r>V_uu=HmY<2aXVKu*cQD;0OlW1$ zxbh#zgBR{}c$S?H$X;Dx_^ozhEHn1pA4TguC4m8#?h2bq-K#p@n0_oRDD$&>I#ZA` zE+(#OqeeTmYhlD?E2;a7(E0by8d{8>`R|)H!>_@srK%gv*5>kgH_HOrVjYvi?N>}& z{=#H^>4DFy?NkEZ^Tze}FX?*p;Ln^iei1E=!P{QU3A&{9UtNgo`{6m%|l;S*eS(`wu z&fD;1NWkAI`dsaMaJXdf<%!7l^E-F6h8P^MpLsidO=Hef%pEdn`U)X;)E3IH%7U+ zr{A17!H>XqeKRla=Wbf=4J-*hCake-T$+{r>*lBT`Qz`|c>HlXipv;2YTjt0 zN(=B8g>O1iRM5P_cgEw0Mzy4mfhEVUCa7>Lx2;{SdYQhUF}A^T=_a+IU9RhDxi@x< z+3o8dKTAk+KQ*5I@PVj%tMmD|4HQSy=?^9-Ei8!eI(gRSuG!YqW|y7LueXTHdXln# zc_ADhr5S5^WE-`^>|hmRj-!v=7-x&$3d&ReUVdhwm+Q^dTLl}{jk-8ddL6W4$0W;; zo{YfqPS3c&`^R)DW41S1V17T}yQCTY>9=M7q@PuP-EQM$QxW>_zT4UP)A<*=XGTpr yc-m)C{Kk@ucNa2T+j`DFH�Jkqn5j%g=hI7HazblKPaU!gE_^*VOOjWB&uW&;LsR diff --git a/flatlaf-natives/flatlaf-natives-jna/src/main/java/com/formdev/flatlaf/natives/jna/windows/FlatWindowsNativeWindowBorder.java b/flatlaf-natives/flatlaf-natives-jna/src/main/java/com/formdev/flatlaf/natives/jna/windows/FlatWindowsNativeWindowBorder.java index 77dac5cb..19c20796 100644 --- a/flatlaf-natives/flatlaf-natives-jna/src/main/java/com/formdev/flatlaf/natives/jna/windows/FlatWindowsNativeWindowBorder.java +++ b/flatlaf-natives/flatlaf-natives-jna/src/main/java/com/formdev/flatlaf/natives/jna/windows/FlatWindowsNativeWindowBorder.java @@ -309,6 +309,8 @@ public class FlatWindowsNativeWindowBorder WM_ENTERSIZEMOVE = 0x0231, WM_EXITSIZEMOVE = 0x0232, + WM_DPICHANGED = 0x02E0, + WM_DWMCOLORIZATIONCOLORCHANGED = 0x0320; // WM_SIZE wParam @@ -501,6 +503,22 @@ public class FlatWindowsNativeWindowBorder isMoving = true; break; + case WM_DPICHANGED: + LRESULT lResult = User32Ex.INSTANCE.CallWindowProc( defaultWndProc, hwnd, uMsg, wParam, lParam ); + + // if window is maximized and DPI/scaling changed, then Windows + // does not send a subsequent WM_SIZE message and Java window bounds, + // which depend on scale factor, are not updated + boolean isMaximized = User32Ex.INSTANCE.IsZoomed( hwnd ); + if( isMaximized ) { + MyRECT r = new MyRECT( new Pointer( lParam.longValue() ) ); + int width = r.right - r.left; + int height = r.bottom - r.top; + User32Ex.INSTANCE.CallWindowProc( defaultWndProc, hwnd, WM_SIZE, new WPARAM( SIZE_MAXIMIZED ), MAKELPARAM( width, height ) ); + } + + return lResult; + case WM_ERASEBKGND: // do not erase background while the user is moving the window, // otherwise there may be rendering artifacts on HiDPI screens with Java 9+ @@ -818,6 +836,13 @@ public class FlatWindowsNativeWindowBorder return (low & 0xffff) | ((high & 0xffff) << 16); } + /** + * Same implementation as MAKELPARAM(l, h) macro in winuser.h. + */ + private LPARAM MAKELPARAM( int low, int high ) { + return new LPARAM( MAKELONG( low, high ) ); + } + /** * Same implementation as RGB(r,g,b) macro in wingdi.h. */ @@ -937,6 +962,23 @@ public class FlatWindowsNativeWindowBorder } } + //---- class MyRECT ------------------------------------------------------- + + @FieldOrder( { "left", "top", "right", "bottom" } ) + public static class MyRECT + extends Structure + { + public int left; + public int top; + public int right; + public int bottom; + + public MyRECT( Pointer pointer ) { + super( pointer ); + read(); + } + } + //---- class MENUITEMINFO ------------------------------------------------- @FieldOrder( { "cbSize", "fMask", "fType", "fState", "wID", "hSubMenu", diff --git a/flatlaf-natives/flatlaf-natives-windows/README.md b/flatlaf-natives/flatlaf-natives-windows/README.md index 3d0e4d32..c164e381 100644 --- a/flatlaf-natives/flatlaf-natives-windows/README.md +++ b/flatlaf-natives/flatlaf-natives-windows/README.md @@ -19,3 +19,32 @@ The DLLs were built on a GitHub server with the help of GitHub Actions. See: [Native Libraries](https://github.com/JFormDesigner/FlatLaf/actions/workflows/natives.yml) workflow. Then the produced Artifacts ZIP was downloaded, signed DLLs with FormDev Software code signing certificate and committed the DLLs to Git. + + +## Development + +To build the library on Windows using Gradle, (parts of) +[Visual Studio Community +2022](https://visualstudio.microsoft.com/downloads/) +needs to be installed. After downloading and running `VisualStudioSetup.exe` the +**Visual Studio Installer** is installed and started. Once running, it shows the +**Workloads** tab that allows you to install additional packages. Either choose +**Desktop development with C++**, or to save some disk space switch to the +**Single Components** tab and choose following components (newest versions): + +- MSVC v143 - VS 2022 C++ x64/x86 Buildtools +- MSVC v143 - VS 2022 C++ ARM64/ARM64EC Buildtools +- Windows 11 SDK + +Note that the Visual Studio Installer shows many similar named components for +MSVC. Make sure to choose exactly those components listed above. + +Using +[Build Tools for Visual Studio 2022](https://visualstudio.microsoft.com/downloads/#remote-tools-for-visual-studio-2022) +(installs only compiler and SDKs) instead of +[Visual Studio Community +2022](https://visualstudio.microsoft.com/downloads/) +does not work with Gradle. + +[Visual Studio Code](https://code.visualstudio.com/) with **C/C++** extension +can be used for C++ code editing. diff --git a/flatlaf-natives/flatlaf-natives-windows/src/main/cpp/FlatWndProc.cpp b/flatlaf-natives/flatlaf-natives-windows/src/main/cpp/FlatWndProc.cpp index 6ce6af91..d45f758a 100644 --- a/flatlaf-natives/flatlaf-natives-windows/src/main/cpp/FlatWndProc.cpp +++ b/flatlaf-natives/flatlaf-natives-windows/src/main/cpp/FlatWndProc.cpp @@ -288,6 +288,23 @@ LRESULT CALLBACK FlatWndProc::WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, L isMoving = true; break; + case WM_DPICHANGED: { + LRESULT lResult = ::CallWindowProc( defaultWndProc, hwnd, uMsg, wParam, lParam ); + + // if window is maximized and DPI/scaling changed, then Windows + // does not send a subsequent WM_SIZE message and Java window bounds, + // which depend on scale factor, are not updated + bool isMaximized = ::IsZoomed( hwnd ); + if( isMaximized ) { + RECT* r = reinterpret_cast( lParam ); + int width = r->right - r->left; + int height = r->bottom - r->top; + ::CallWindowProc( defaultWndProc, hwnd, WM_SIZE, SIZE_MAXIMIZED, MAKELPARAM( width, height ) ); + } + + return lResult; + } + case WM_ERASEBKGND: // do not erase background while the user is moving the window, // otherwise there may be rendering artifacts on HiDPI screens with Java 9+ diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatWindowDecorationsTest.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatWindowDecorationsTest.java index 5e659bc2..2f962068 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatWindowDecorationsTest.java +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatWindowDecorationsTest.java @@ -25,6 +25,8 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Random; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; import javax.swing.*; import javax.swing.border.TitledBorder; import com.formdev.flatlaf.FlatClientProperties; @@ -74,6 +76,7 @@ public class FlatWindowDecorationsTest } private List images; + private Timer refreshStateTimer; FlatWindowDecorationsTest() { initComponents(); @@ -132,6 +135,49 @@ public class FlatWindowDecorationsTest fullWindowContentButtonsBoundsField.setEnabled( bounds != null ); } ); } + + if( window instanceof Frame ) { + AtomicInteger lastState = new AtomicInteger( -1 ); + AtomicReference lastFullScreenWindow = new AtomicReference<>(); + refreshStateTimer = new Timer( 500, e -> { + Frame frame = (Frame) window; + int state = frame.getExtendedState(); + Window fullScreenWindow = window.getGraphicsConfiguration().getDevice().getFullScreenWindow(); + if( state != lastState.get() || fullScreenWindow != lastFullScreenWindow.get() ) { + lastState.set( state ); + lastFullScreenWindow.set( fullScreenWindow ); + + String s = ""; + if( (state & Frame.ICONIFIED) != 0 ) + s += "iconified "; + if( (state & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH ) + s += "maximized "; + else { + if( (state & Frame.MAXIMIZED_HORIZ) != 0 ) + s += "maximized-horizontal "; + if( (state & Frame.MAXIMIZED_VERT) != 0 ) + s += "maximized-vertical "; + } + if( fullScreenWindow == window ) + s += "full-screen "; + if( s.isEmpty() ) + s = "normal"; + + frameStateField.setText( s ); + } + } ); + refreshStateTimer.start(); + } + } + + @Override + public void removeNotify() { + super.removeNotify(); + + if( refreshStateTimer != null ) { + refreshStateTimer.stop(); + refreshStateTimer = null; + } } private void updateDecorationStyleRadioButtons( JRootPane rootPane ) { @@ -653,6 +699,9 @@ debug*/ typeUtilityRadioButton = new JRadioButton(); typeSmallRadioButton = new JRadioButton(); showRectanglesCheckBox = new JCheckBox(); + JPanel hSpacer1 = new JPanel(null); + JLabel frameStateLabel = new JLabel(); + frameStateField = new JLabel(); menuBar = new JMenuBar(); JMenu fileMenu = new JMenu(); JMenuItem newMenuItem = new JMenuItem(); @@ -1092,6 +1141,16 @@ debug*/ showRectanglesCheckBox.setSelected(true); showRectanglesCheckBox.addActionListener(e -> showRectangles()); add(showRectanglesCheckBox, "cell 0 3"); + add(hSpacer1, "cell 2 3 2 1"); + + //---- frameStateLabel ---- + frameStateLabel.setText("Frame state:"); + add(frameStateLabel, "cell 2 3 2 1,alignx right,growx 0"); + + //---- frameStateField ---- + frameStateField.setText("n/a"); + frameStateField.setFont(frameStateField.getFont().deriveFont(frameStateField.getFont().getStyle() | Font.BOLD)); + add(frameStateField, "cell 2 3 2 1,alignx right,growx 0"); //======== menuBar ======== { @@ -1341,6 +1400,7 @@ debug*/ private JRadioButton typeUtilityRadioButton; private JRadioButton typeSmallRadioButton; private JCheckBox showRectanglesCheckBox; + private JLabel frameStateField; private JMenuBar menuBar; // JFormDesigner - End of variables declaration //GEN-END:variables } diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatWindowDecorationsTest.jfd b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatWindowDecorationsTest.jfd index 78e40beb..c5c29202 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatWindowDecorationsTest.jfd +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatWindowDecorationsTest.jfd @@ -637,6 +637,27 @@ new FormModel { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { "value": "cell 0 3" } ) + add( new FormComponent( "com.jformdesigner.designer.wrapper.HSpacer" ) { + name: "hSpacer1" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 2 3 2 1" + } ) + add( new FormComponent( "javax.swing.JLabel" ) { + name: "frameStateLabel" + "text": "Frame state:" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 2 3 2 1,alignx right,growx 0" + } ) + add( new FormComponent( "javax.swing.JLabel" ) { + name: "frameStateField" + "text": "n/a" + "font": new com.jformdesigner.model.SwingDerivedFont( null, 1, 0, false ) + auxiliary() { + "JavaCodeGenerator.variableLocal": false + } + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 2 3 2 1,alignx right,growx 0" + } ) }, new FormLayoutConstraints( null ) { "location": new java.awt.Point( 0, 0 ) "size": new java.awt.Dimension( 960, 570 ) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 241b8eb2..4d9d326c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -46,8 +46,8 @@ glazedlists = "com.glazedlists:glazedlists:1.11.0" netbeans-api-awt = "org.netbeans.api:org-openide-awt:RELEASE112" # flatlaf-natives-jna -jna = "net.java.dev.jna:jna:5.12.1" -jna-platform = "net.java.dev.jna:jna-platform:5.12.1" +jna = "net.java.dev.jna:jna:5.15.0" +jna-platform = "net.java.dev.jna:jna-platform:5.15.0" # junit junit = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit" }