Я продолжил создание своих собственных компонентов Button, переопределив метод paintBackground(Graphics g)
, чтобы некоторые круговые диаграммы отображались прямо с кнопкой. Пример желаемого результата:
То, что у меня получилось, было довольно близко, но не совсем так: пространство между значком и текстом под значком было слишком большим, а сам текст уже касался круга.
Глядя на 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 текста и значка.
Спасибо.