Как рассчитать размер текста? - PullRequest
0 голосов
/ 01 июля 2019

Очевидно, com.codename1.ui.plaf.LookAndFeel.getTextAreaSize(TextArea, boolean) не возвращает точный размер текста.

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

Как бы я это сделал? Есть ли для этого где-нибудь в CN1 служебный метод?

Ответы [ 2 ]

0 голосов
/ 03 июля 2019

Очевидно, в настоящее время в Codename One нет компонента текстовой области, который можно было бы использовать для определения размера его содержимого.

Вот пользовательский, который делает это:

    private class Hint extends Component {
        final String text;
        final int rowsGap = new TextArea().getRowsGap();

        private Hint(String aText) {
            text = aText;
        }

        @Override
        protected Dimension calcPreferredSize() {
            int prefW = 0;
            int prefH = 0;
            Style style = getStyle();
            Font font = style.getFont();
            List<String> lines = StringUtil.tokenize(text, "\n");
            int tally = 0;
            for (String line: lines) {
                tally++;
                prefW = font.stringWidth(line);
            }
            prefH = tally * (font.getHeight() + rowsGap);
            prefW += getUnselectedStyle().getHorizontalPadding() + 5;
            prefH += style.getPaddingTop() + style.getPaddingBottom();
            if(style.getBorder() != null) {
                prefW = Math.max(style.getBorder().getMinimumWidth(), prefW);
                prefH = Math.max(style.getBorder().getMinimumHeight(), prefH);
            }
            if(getUIManager().getLookAndFeel().isBackgroundImageDetermineSize() && style.getBgImage() != null) {
                prefW = Math.max(style.getBgImage().getWidth(), prefW);
                prefH = Math.max(style.getBgImage().getHeight(), prefH);
            }
            return new Dimension(prefW, prefH);
        }

        @Override
        public void paint(Graphics aGraphics) {
            Style style = getStyle();
            int xLeft = style.getPaddingLeft(false), yTop = style.getPaddingTop();
            List<String> lines = StringUtil.tokenize(text, "\n");
            int y = yTop;
            aGraphics.setColor(0x000000);
            for (String line: lines) {
                aGraphics.drawString(line, getX() + xLeft, getY() + y);
                y += style.getFont().getHeight() + rowsGap;
            }
        }
    }
0 голосов
/ 02 июля 2019

Возвращает предпочтительный размер.При использовании многострочного текста мы определяем размер в зависимости от количества строк / столбцов, поскольку текст является изменяемым и прокручиваемым, его содержимое не полностью учитывается для этого расчета.Даже если принять это во внимание, это не может быть на 100% с точностью, так как даже разница в ширину в 1 пиксель может привести к разрыву строки, который перевернет все.Есть много особых случаев, связанных с изменением размера текста, поэтому не стоит полагаться на точность.Попробуйте использовать setActAsLabel или SpanLabel.

...