Codename One - ошибка в расчете положения метки и иконки - PullRequest
1 голос
/ 17 апреля 2019

Я продолжил создавать свои собственные компоненты Button, переопределив метод paintBackground(Graphics g), чтобы несколько круговых диаграмм отображались прямо с помощью кнопки. Пример желаемого результата: Example of the desired result

То, чем я закончил, было довольно близко, но не совсем: пространство между значком и текстом под значком было слишком большим, а сам текст уже касался круга.

Глядя на 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 текста и значка.

Спасибо.

1 Ответ

1 голос
/ 18 апреля 2019

Это похоже на ошибку, мы исправим это.Обратите внимание, что разрыв не был рассчитан на отрицательные значения, поэтому, если это не сработает для вас, это не обязательно ошибка.

...