[11] RFR: Enhancement: JDK-8195811:Support FX Swing interop using public API

Kevin Rushforth kevin.rushforth at oracle.com
Fri Jul 6 23:00:22 UTC 2018


Most things are working with either mode (JDK 10 with qualified exports 
or JDK 11 without), although I do get a few test failures.

There is a serious issue with leakage into the public API that needs to 
be addressed before worrying about the failures, but I'll list the test 
failures at the end.

SwingNode.java:

This public class is part of the API. You cannot make any of the 
following fields public as this would leak implementation into public API:

+    public int swingPrefWidth;
+    public int swingPrefHeight;
+    public int swingMaxWidth;
+    public int swingMaxHeight;
+    public int swingMinWidth;
+    public int swingMinHeight;

+    public final Object getLightweightFrame() { return lwFrame; }

+    public final ReentrantLock paintLock = new ReentrantLock();

+    public boolean grabbed; // lwframe initiated grab

+    public void setImageBuffer(...)

+   public void setImageBounds(...);

+    public void repaintDirtyRegion(...)

+    public void ungrabFocus(boolean postUngrabEvent)

If you need to access them from other packages, you can either use the 
accessor pattern (this might be easiest) or else refactor it further to 
move more of this down to the implementation. I note that even though 
SwingNodeInterop is abstract, it can still have non-abstract methods if 
that helps in your refactoring.


SwingFXUtils.java

Same problem as SwingNode, although to a lesser extent. The following 
must not be public:

+    public static void runOnFxThread(Runnable runnable)
+    public static void runOnEDT(final Runnable r)
+    public static void runOnEDTAndWait(Object nestedLoopKey, Runnable r)
+    public static void leaveFXNestedLoop(Object nestedLoopKey)


JFXPanel is fine.

-----------------

* System tests failures on Linux:

test.robot.javafx.embed.swing.SwingNodeJDialogTest > testJDialogAbove FAILED
     java.lang.AssertionError: JDialog is not above JavaFX stage 
expected:<java.awt.Color[r=0,g=0,b=255]> but 
was:<java.awt.Color[r=0,g=128,b=0]>

test.robot.javafx.embed.swing.SwingNodeJDialogTest > 
testNodeRemovalAfterShow FAILED
     java.lang.AssertionError: JDialog is not above JavaFX stage 
expected:<java.awt.Color[r=0,g=0,b=255]> but 
was:<java.awt.Color[r=0,g=128,b=0]>

test.robot.javafx.embed.swing.SwingNodeJDialogTest > 
testStageCloseAfterShow FAILED
     java.lang.AssertionError: JDialog is not above JavaFX stage 
expected:<java.awt.Color[r=0,g=0,b=255]> but 
was:<java.awt.Color[r=0,g=128,b=0]>

test.javafx.embed.swing.SwingNodeMemoryLeakTest > 
testSwingNodeMemoryLeak FAILED
     java.lang.AssertionError: expected:<10> but was:<9>
         at org.junit.Assert.fail(Assert.java:91)
         at org.junit.Assert.failNotEquals(Assert.java:645)
         at org.junit.Assert.assertEquals(Assert.java:126)
         at org.junit.Assert.assertEquals(Assert.java:470)
         at org.junit.Assert.assertEquals(Assert.java:454)
         at 
test.javafx.embed.swing.SwingNodeMemoryLeakTest.testSwingNodeMemoryLeak(SwingNodeMemoryLeakTest.java:97)

Two of these, SwingNodeJDialogTest.testNodeRemovalAfterShow and 
SwingNodeJDialogTest.testStageCloseAfterShow, also fail on Mac

-- Kevin


On 7/5/2018 11:29 PM, Prasanta Sadhukhan wrote:
>
> My Bad. Please find modified webrev restoring the filter
>
> http://cr.openjdk.java.net/~psadhukhan/fxswinterop/webrev.4/
>
> Regards
> Prasanta
> On 7/6/2018 6:47 AM, Kevin Rushforth wrote:
>> One quick comment:
>>
>> This no longer compiles with OpenJDK10. It looks like the logic to 
>> optionally filter out jdk.unsupported.desktop from javafx.swing's 
>> module-info.java got lost between the .2 and .3 versions.
>>
>> -- Kevin
>>
>>
>> On 7/4/2018 4:35 AM, Prasanta Sadhukhan wrote:
>>> Hi All,
>>>
>>> Please review an enhancement to support openjfx swing 
>>> interoperability once the dependancy of internal jdk classes are 
>>> removed.
>>> JDK-8202199 <https://bugs.openjdk.java.net/browse/JDK-8202199> 
>>> provided a new "jdk.unsupported.desktop" module in JDK 11 that 
>>> exports public API that is intended to be used by the javafx.swing 
>>> module
>>> and unbundled OpenJFX is now made to depend on these APIs to support 
>>> interoperation
>>> between Swing and JavaFX components to replace previous use of 
>>> internal APIs when it was part of Oracle JDK.
>>>
>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8195811
>>> webrev: http://cr.openjdk.java.net/~psadhukhan/fxswinterop/webrev.3/
>>>
>>> Regards
>>> Prasanta
>>
>



More information about the openjfx-dev mailing list