<Swing Dev> [9] Review request for 8132119 Provide public API for text related methods in SwingUtilities2

Sergey Bylokhov Sergey.Bylokhov at oracle.com
Thu Mar 24 14:22:52 UTC 2016


On 24.03.16 16:52, Alexander Scherbatiy wrote:
> On 24/03/16 10:36, Semyon Sadetsky wrote:
>> Hi Alexander,
>>
>> Could you answer one question:
>> Why did you choose default interface methods to implement
>> TextUIDrawing and not implement them in DefaultTextUIDrawing having
>> declarations only in the interface?
>> AFAIK the common point of view is default methods should be used
>> rarely because they may lead to unreadable code.
>>
>    The only problem which I know about default methods is multiple
> inheritance which has its own solution.

What kind of problems? The benefit is obvious: it will not be necessary 
to implement all methods if only one of them should be tweaked.

>
>    Could you give links to discussion or provide use cases where default
> methods leads to the unreadable code and show how does it relate to the
> TextUIDrawing  implementation?
>
>    Thanks,
>    Alexandr.
>> --Semyon
>>
>> On 3/18/2016 6:49 PM, Alexander Scherbatiy wrote:
>>>
>>> Could you review the updated fix:
>>>   http://cr.openjdk.java.net/~alexsch/8132119/webrev.08/
>>>
>>>   - Public TextUIDrawing interface is added to the javax.swing.plaf
>>> package
>>>   - TextUIDrawing methods description does not mention component
>>> properties to be more general
>>>   - TextUIDrawing methods are made default
>>>   - L&F sets an instance of the TextUIDrawing to look and feel
>>> defaults using "uiDrawing.text" property
>>>   - ComponentUI class is not changed
>>>   - Each ComponentUI reads TextUIDrawing from UI defaults
>>>   - There is an interesting issue described in
>>> http://mail.openjdk.java.net/pipermail/swing-dev/2016-March/005509.html
>>>     which is related to the fact that MetalLabelUI returns a static
>>> field from createUI() method.
>>>     TitleBorder creates a JLabel but does not put it to any component
>>> hierarchy. In this case SwingUtilities.updateComponentTreeUI() method
>>> calls MetalLabelUI.uninstallDefaults() on the static metalLabelUI
>>> field and sets a new LabelUI for ordinary labels. The TitleBorder
>>> label UI is not changed in this case and it still uses the
>>> metalLabelUI field which is not initialized.
>>>     It seems that other applications can also use components just for
>>> drawing and have the same issue.
>>>     For this case the textUIDrawing field is not cleared in the
>>> uninstallDefaults but just set to a static default value which should
>>> not lead to memory leaks.
>>>
>>>   Thanks,
>>>   Alexandr.
>>>
>>> On 29/01/16 19:51, Alexander Scherbatiy wrote:
>>>> On 25/01/16 13:44, Andrej Golovnin wrote:
>>>>> Hi Alexandr,
>>>>>
>>>>>> Could you review the updated fix:
>>>>>> http://cr.openjdk.java.net/~alexsch/8132119/webrev.07/
>>>>> ....
>>>>>> - public TextUIDrawing interface is added to the javax.swing.plaf
>>>>>> package
>>>>>> - public "TextUIDrawing getTextUIDrawing()" method is added to the
>>>>>> ComponentUI class
>>>>>> - L&F sets an instance of the TextUIDrawing to look and feel
>>>>>> defaults using
>>>>>> "uiDrawing.text" property
>>>>>> - Look and Feel delegates use the instance of the TextUIDrawing
>>>>>> for text
>>>>>> drawing and measuring
>>>>> Some thoughts on the current design/implementation:
>>>>>
>>>>> By adding a field to the ComponentUI class the current
>>>>> implementation increases
>>>>> memory consumption for all Swing applications. And you get the
>>>>> feeling that
>>>>> there are different implementations of TextUIDrawing per
>>>>> ComponentUI instances.
>>>>> Personally I can't imagine to have different implementations of
>>>>> TextUIDrawing for
>>>>> a given LookAndFeel. If I would design/implement it, then I would
>>>>> implement it as
>>>>> a property of the LookAndFeel class (similar to LayoutStyle) and not
>>>>> the ComponentUI.
>>>>> Developers can use then the following code to obtain the instance of
>>>>> TextUIDrawing:
>>>>>
>>>>> UIManager.getLookAndFeel().getUIDrawing() // or
>>>>> UIManager.getLookAndFeelUIDrawing() // use this static method as a
>>>>> short cut for the line above.
>>>>   LayoutStyle keeps its instance per App context. The same is for
>>>> the LookAndFeel
>>>>   when it is got through UIManager.getLookAndFeel() call.
>>>>   It means that accessing an instance of a TextUIDrawing will leads
>>>> to a time consumption.
>>>>
>>>>   There are 3 main ways of the SwingUtilities2.drawString(...) usage:
>>>>   1. ComponentUI classes
>>>>   2. Components created in UI (like BasicInternalFrameTitlePane)
>>>>   3. Public utilities methods (like WindowsGraphicsUtils.paintText())
>>>>
>>>>   For the cases 1 and 2 it is possible to load and store the
>>>> UIDrawing instance during installUI()/updateUI() calls to decrease a
>>>> time access to it.
>>>>
>>>>   For the case 3 it is necessary to get LookAndFeel instance each
>>>> time (which is taken from an App context)
>>>>   or use the passed JComponent object. It requires to have a public
>>>> method and the associated variable for each instance of
>>>> JComponent/ComponentUI/... class.
>>>>> You can use this methods then in JDK too.
>>>>>
>>>>> And maybe rename the TextUIDrawing class to just UIDrawing and add
>>>>> more useful methods,
>>>>> e.g. a method to create a composite font, a method to convert DLUs
>>>>> to pixels.
>>>>   UIDrawing name may look like it should be used for any UI drawing,
>>>> not only for text ones. I am afraid that it can be misleading.
>>>>
>>>>   Thanks,
>>>>   Alexandr.
>>>>
>>>>>
>>>>> Best regards,
>>>>> Andrej Golovnin
>>>>
>>>
>>
>


-- 
Best regards, Sergey.



More information about the swing-dev mailing list