Repository navigation
javafx-compat and mapping fixes - #6141
shai-almog wants to merge 28 commits into
Conversation
…rvableValue.map, Region.insetsProperty, ImageView fit CSS Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…operties Nested class/enum field types were emitted as binary names (Outer$Inner), which javac rejects in source. Properties inherited from a non-@mapped base class were silently dropped by the generated mapper. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An HTTP error code is not a crash, so Lifecycle no longer sends the log for it; the simulator's built_by_user prompt is skipped on the EDT or headless. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The default getStorageEntrySize looped until skip() answered -1, but skip() answers 0 at the end of a stream, so an implementation without its own override hung its background thread on the first cached image. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n Storage Image downloads a remote URL through ConnectionRequest.downloadImageToStorage, the cache URLImage uses, and tells the views showing it when it arrives. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A Label with wrapText on now has a horizontal content bias, a preferred height of its text wrapped at the given width, and a native peer (WrappingLabel) that paints the wrapped lines. VBox, HBox and ScrollPane already ask for height-for-width, so a column of wrapping labels in a fit-to-width scroll pane gets the right height. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…orage Reading an entry through to count it was slow, and the loop the default used never ended on a stream whose skip() honours its contract. The native Linux and Windows ports ask the file length, the headless implementations the stored array. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ap/flatMap - Image holds view listeners only while a remote load is pending, and drops a cached entry that failed to decode so the next request downloads again. - DerivedValue observes its source only while it is observed itself. - WrappingLabel caches its lines per text, font and width; tabs break. - The mapping processor skips an inherited field whose type is a type variable of the superclass instead of mapping it erased. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…g before letters A tab bar of icon-over-text toggle buttons on a phone theme cut "Home" to "Ho..." between margins wide enough for the word: fitPadding refused to shed anything once a graphic was set. The theme's part of the padding is now given up as it is without a graphic; the graphic's own room never is, and the graphic is placed against the padding that remains. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…room computeMinWidth counted the whole padding as sheddable, graphic room included, while fitPadding only gives up theme padding; a control shrunk to its minimum lost the text to the graphic. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…eir width Cell laid its graphic out at its preferred width, so a list cell with wrapping text drew it on one line past the edge of the list. The graphic is now no wider than the cell, as in JavaFX, and is as tall as it is at that width; RowFlow measures the row height at the column width and measures again when that changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Developer Guide build artifacts are available for download from this workflow run:
Developer Guide quality checks: |
|
Compared 12 screenshots: 12 matched. |
Cloudflare Preview
|
✅ ByteCodeTranslator Quality ReportTest & Coverage
Benchmark Results
Static Analysis
Generated automatically by the PR CI workflow. |
✅ Continuous Quality ReportTest & Coverage
Static Analysis
Generated automatically by the PR CI workflow. |
- Lists and scroll panes glide on after a touch drag, decelerating the way a UIScrollView does (runtime Fling, driven by the frame clock). They used to stop dead the moment the finger lifted. - A native button's own repaint (its pressed state) now goes through its node, so it no longer paints over the graphic drawn above it or outside the clips and effects of its ancestors. A touched tab lost its icon until the next full repaint. - ParentPeer's layout reports overlap support, so a peer that repaints alone also repaints the siblings drawn over it. - Component skips a backdrop blur that its own opaque fill hides; the iOS theme's text field blur was most of the time a frame took. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…o their CSS, auto-hide touch scroll bars; JavaSE measures text unzoomed Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Compared 231 screenshots: 231 matched. |
Flutter vs Codename OneSame application, built both ways: Flutter's AOT compile of the gallery, and the identical Dart source transpiled to Java on Codename One. Lower is better for every metric, so a ratio above 1.00x means Codename One is ahead by that factor. android9 interleaved rounds; host load 0.84, 2.02, 1.72
Compute -- the VM workloads (
Gate: within tolerance against
ios9 interleaved rounds; host load 29.28, 36.52, 31.8
Compute -- the VM workloads ( Not measured: iOS compute is not measured: a device build needs signed hardware, and on the simulator Flutter runs its JIT debug engine rather than AOT code. The macOS row runs the same ParparVM and Dart AOT compilers on the same Apple silicon. Gate: within tolerance against
javascript9 interleaved rounds; host load 2.37, 1.49, 0.66
Compute -- the VM workloads (
Gate: within tolerance against
linux9 interleaved rounds; host load 0.3, 3.16, 2.83
Compute -- the VM workloads (
Gate: within tolerance against
macos9 interleaved rounds; host load 11.66, 17.83, 17.38
Compute -- the VM workloads (
Gate: within tolerance against
windows9 interleaved rounds
Compute -- the VM workloads (
Gate: within tolerance against
Codename One wins 26 of 26 measured metrics across 6 platform(s). |
|
Compared 210 screenshots: 210 matched. Benchmark ResultsDetailed Performance Metrics
ParparVM vs HotSpot (JDK 25): Windows x64Runner CPU: AMD64 Family 25 Model 17 Stepping 1, AuthenticAMD (baseline Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in
Result: no regression |
|
Compared 210 screenshots: 210 matched. Benchmark ResultsDetailed Performance Metrics
ParparVM vs HotSpot (JDK 25): Windows arm64Runner CPU: ARMv8 (64-bit) Family 8 Model D49 Revision 0, MICROSOFT CORPORATION (baseline Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in
Result: no regression |
|
Compared 195 screenshots: 195 matched. Native Android coverage
✅ Native Android screenshot tests passed. Native Android coverage
Benchmark ResultsDetailed Performance Metrics
|
… moves nothing A press on a tab button re-captured and re-blurred the whole shadowed navigation drawer, on press and on release. A shadow is made from the outline of what is drawn, so a paint-only change (colour, opacity, pressed state) inside a region whose opaque, square, unclipped background fill covers its box cannot change it. Measured in the new test: 5 presses made 5 captures before, 0 after. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e scene RowFlow.scrollTo called requestLayout on every drag or fling frame, which cleared the size caches of every ancestor up to the scene and laid each of them out again. A new offset changes no size: the flow now marks only itself and asks for a pulse, whose layout pass walks the tree and finds it. Measured in the new test: 10 drag frames laid out the list's holder 10 times before, 0 after. ScrollPane already only relocated its content; the test holds that too (0 content or row layouts over 20 offset changes). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Compared 196 screenshots: 196 matched. Benchmark Results
Detailed Performance Metrics
ParparVM vs HotSpot (JDK 25): macOS arm64Runner CPU: Apple M1 (Virtual) (baseline Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in
Result: no regression |
|
Compared 192 screenshots: 192 matched. Benchmark Results
Detailed Performance Metrics
|
…e strip with its background Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The layer no longer needs them; the headless test harness answers a stored entry's size from its own map. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…g out the scene" Recycled rows were filled with their new item but never laid out again, so a row showed the previous item's description while scrolling. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A drag past the top or bottom of a ScrollPane or a list moves the content with UIScrollView's rubber-band resistance, a glide that reaches an end carries on and returns, and the row a drag began on loses its pressed look once the drag becomes a scroll. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…styling the scene Codename One held every drag back until it crossed 5% of the screen, because the scene's components answered not draggable; the stage forms now claim drags over the scene, which tells a click from a drag itself. A pseudo-class some rule asks of an ancestor compound made any node in that state restyle everything below it, so pressing a tab restyled the whole scene twice per tap (27-112 ms each on the iOS simulator). It now counts only on a node that has the rest of that compound. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…bel whose graphic grew A rounded clip is narrowed by every rectangle painted inside it; Codename One's intersection throws when a curve ends a fraction of a pixel from the rectangle, which took the app down on iOS on a scrolled card list. Clip paths now end every segment on a whole pixel, and narrowing a shape clip falls back to a rectangle if it still throws. A label padded its text for its graphic once, when styled; an icon whose font arrived later grew past that padding and was drawn over the text. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A mouse drag on the desktop (a ListView's rows, a pannable ScrollPane) stretched past the ends and glided on after release, which JavaFX on the desktop never does. Both now feed the spring and the glide only on a touch screen. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…re label does not have The graphic was placed as if the label kept its theme's padding, which a bare label is drawn without: under the iOS theme every titled card drew its icon over the first letters. Also removes a scratch probe test that was committed by mistake. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # scripts/website/syndication-state.json
The JavaFX layer now snaps a clip path to device pixels; the list's antialiased edges move by at most 17/255 on 998 pixels. Identical on the Default, JDK 17 and JDK 21 legs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
























Fixes for gaps and bugs found porting a real JavaFX mobile application (JFX Central's mobile module) to the JavaFX compatibility layer.
javafx-compat
ListPropertychange listeners now fire on content changes (old and new value are the list), as in JavaFX.Cell.layoutChildrenno longer setsvisibleon a graphic whose visibility is bound (it threw "A bound value cannot be set").ObservableValue.map,flatMapandorElse.Region.insetsProperty().-fx-fit-width,-fx-fit-height,-fx-preserve-ratiofrom CSS.http:/https:images load in the background throughConnectionRequest.downloadImageToStorage(the Storage cacheURLImageuses); views showing the image repaint and relayout when it arrives.wrapTextwraps aLabelonto several lines: horizontal content bias, height for width, ellipsis-sized minimum width.Mapping processor
Outer$Innerfailed to compile).Core / JavaSE
Lifecycle.handleNetworkErrorsends the log only for a thrown exception, not for an HTTP error code. In the simulator, sending asked for the build account with a modal prompt that blocked the EDT on a plain 404; that prompt is now skipped on the EDT and headless.CodenameOneImplementation.getStorageEntrySizelooped untilskip()returned -1, butskip()returns 0 at end of stream, so it never ended. It now counts withread(). The shipping ports override it; the headless test implementation hung on it.Tests: javafx-compat suite (535 incl. new
PortGapsTest,RemoteImageTest,WrapTextTest), build-engine mapping processor tests (two new). SpotBugs zero for javafx-compat, build-engine, android, ios and core-unittests locally.Not covered: wrapping for buttons, checkboxes and cells;
lineSpacing,textOverrun,ellipsisString.🤖 Generated with Claude Code