Я продолжил создавать свои собственные компоненты Button, переопределив метод paintBackground(Graphics g)
, чтобы несколько круговых диаграмм отображались прямо с помощью кнопки. Пример желаемого результата:
![Example of the desired result](https://i.stack.imgur.com/2f5fy.png)
То, чем я закончил, было довольно близко, но не совсем: пространство между значком и текстом под значком было слишком большим, а сам текст уже касался круга.
Глядя на Label API, есть метод setGap(int)
. Поскольку разрыв равен 0 по умолчанию, я использовал отрицательное значение, чтобы сблизить их. Это удаляло пространство, как и предполагалось, однако имело побочный эффект: расположение метки и значка было отключено при применении любого значения разрыва. Вместо того, чтобы влиять только на значения Y надписи и значка, значение разрыва также влияет на значения X.
После долгих поисков я обнаружил ошибку в кодовой базе самого CN1.
в drawLabelComponent()
методе класса CodenameOneImplementation
есть следующий фрагмент (Центр выравнивания и текстовое основание, строка 7254):
case Label.BOTTOM:
case Label.TOP:
x = x + (cmpWidth - (preserveSpaceForState + leftPadding
+ rightPadding
+ Math.max(((icon != null) ? iconWidth + gap : 0),
stringWidth))) / 2;
x = Math.max(x, cmpX + leftPadding + preserveSpaceForState);
y = y + (cmpHeight - (topPadding
+ bottomPadding
+ ((icon != null) ? iconHeight + gap : 0)
+ fontHeight)) / 2;
break;
Очевидно, что переменная gap включена в расчет для значений X и Y, что не может быть истинным для установки разрыва между значком и текстом внизу и вверху регистр положения текста.
При рассмотрении левого и правого вариантов положения текста, переменная гэпа используется только для вычисления X, а НЕ для вычисления Y.
Если это на самом деле предполагаемое поведение, кто-нибудь, пожалуйста, сообщите мне, как избавиться от пробела, не затрагивая положение X текста и значка.
Спасибо.