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

Prasanta Sadhukhan prasanta.sadhukhan at oracle.com
Tue Jul 10 10:28:51 UTC 2018


Hi Kevin,

Please find modified webrev with some more refactoring to move more 
common code to SwingNode
and also this solves SwingNodeMemoryLeakTest failure
http://cr.openjdk.java.net/~psadhukhan/fxswinterop/webrev.6/

Regards
Prasanta
On 7/10/2018 7:13 AM, Kevin Rushforth wrote:
> Hi Prasanta,
>
> The public API looks fine now. I sent you an offline note about one of 
> the test failures (SwingNodeMemoryLeakTest).
>
> There are still whitespace problems that will cause a failure in 
> 'gradle checkrepo' (and 'hg jcheck').
>
> I'll do a more thorough review in the next day or so.
>
> -- Kevin
>
>
> On 7/9/2018 4:12 AM, Prasanta Sadhukhan wrote:
>>
>> Hi Kevin,
>>
>> Modified webrev to address the "public" leakage
>> http://cr.openjdk.java.net/~psadhukhan/fxswinterop/webrev.5/
>>
>> I am looking into the test failures.
>>
>> Regards
>> Prasanta
>> On 7/7/2018 4:30 AM, Kevin Rushforth wrote:
>>> 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