Pergunta

I processar texto com um renderizador de célula tabela personalizada e eu quero cortar o texto desenhado se ele iria exceder a largura da célula atual, a mudança para um "Este texto é longo ..." tipo de representação, onde os três pontos no final nunca sai da caixa delimitadora. O meu algoritmo atual é a seguinte:

FontMetrics fm0 = g2.getFontMetrics(); 
int h = fm0.getHeight();
int ellw = fm0.stringWidth("\u2026");
int titleWidth = fm0.stringWidth(se.title);
if (titleWidth > getWidth()) {
    for (int i = se.title.length() - 1; i > 0; i--) {
        String tstr = se.title.substring(0, i);
        int tstrw = fm0.stringWidth(tstr);
        if (tstrw + ellw < getWidth()) {
            g2.drawString(tstr, 2, h);
            g2.drawString("\u2026", 2 + tstrw, h);
            break;
        }
    }
} else {
    g2.drawString(se.title, 2, h);
}

Existe uma melhor maneira de determinar quantos caracteres devo drawString() antes de mudar para o personagem ... (u2026)?

Foi útil?

Solução

Este é o comportamento padrão do renderizador padrão para uma mesa para que eu não tenho certeza se entendi a razão para fazer isso.

Mas eu criei um renderizador para pontos à esquerda ( "... o texto é muito longo"), que mostra uma forma mais completa para fazer o que quiser desde que leva em consideração uma possível Border sobre o processador ea intercélulas espaçamento do processador. Confira o LeftDotRenderer .

Outras dicas

Eu não consigo pensar em outra maneira de conseguir o efeito desejado, mas você deve ser capaz de substituir o 2 drawString () chama com um. Tem sido um tempo desde que eu tenha escrito Java, mas eu acho o seguinte deve funcionar.

BTW, eu mudei os nomes das variáveis ??para que eu possa ler o código. : P

FontMetrics metrics = g2.getFontMetrics(); 
int fontHeight = metrics.getHeight();
int titleWidth = metrics.stringWidth(se.title);

if (titleWidth > getWidth()) {
    String titleString;

    for (int i = se.title.length() - 1; i > 0; i --) {
        titleString = se.title.substring(0, i) + "\u2026";
        titleWidth = metrics.stringWidth(titleString);

        if (titleWidth < getWidth()) {
            g2.drawString(titleString, 2, fontHeight);

            break;
        }
    }
} else {
    g2.drawString(se.title, 2, fontHeight);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top