如何计算文字大小?

时间:2019-07-01 13:04:47

标签: codenameone

显然,com.codename1.ui.plaf.LookAndFeel.getTextAreaSize(TextArea, boolean)不能返回确切的文本大小。

我想确定气泡的大小,或气泡中可能多行文本的大小。

我该怎么做?在CN1的某个地方有实用程序吗?

2 个答案:

答案 0 :(得分:0)

这将返回首选大小。对于多行文本,由于文本是可修改和可滚动的,因此我们基于行/列的大小进行调整,因此在此计算中并未完全考虑其内容。即使考虑到这一点,也不可能是100%准确的,因为即使1个像素的宽度差异也可能导致换行,从而使所有内容重排。文本大小调整涉及很多特殊情况,因此您不应该依赖准确性。尝试使用setActAsLabelSpanLabel

答案 1 :(得分:0)

显然,“代号1”中目前没有可用于调整其内容大小的文本区域组件。

这是一个自定义工具,可以执行此操作:

    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;
            }
        }
    }