java - rectangulo - Cómo dibujar un rectángulo alrededor del texto multilínea
metodo dibujar java (1)
Estoy tratando de dibujar un rectángulo alrededor del texto de líneas múltiples en iText.
El usuario podrá ingresar algunas líneas de texto. El tamaño de fuente del texto puede ser diferente y puede formatearse (negrita, subrayado ...).
Yo uso este código para dibujar el texto:
ColumnText ct = new ColumnText(cb);
Phrase phrase = new Phrase("Some String/nOther string etc.../n test");
ct.setSimpleColumn(myText......);
ct.addElement(phrase);
ct.go();
Sé cómo dibujar un rectángulo, pero no puedo dibujar un rectángulo que delinee este texto.
Parece que solo te falta una sola pieza del rompecabezas para cumplir tus requisitos. Esa pieza se llama getYLine()
.
Por favor, eche un vistazo al ejemplo DrawRectangleAroundText . Este ejemplo dibuja el mismo párrafo dos veces. La primera vez, agrega un rectángulo que probablemente se parece a la solución que ya tiene. La segunda vez, agrega un rectángulo de la forma que desea que se vea:
La primera vez, agregamos el texto de esta manera:
ColumnText ct = new ColumnText(cb);
ct.setSimpleColumn(120f, 500f, 250f, 780f);
Paragraph p = new Paragraph("This is a long paragraph that doesn''t"
+ "fit the width we defined for the simple column of the"
+ "ColumnText object, so it will be distributed over several"
+ "lines (and we don''t know in advance how many).");
ct.addElement(p);
ct.go();
Usted define su columna usando las coordenadas:
llx = 120;
lly = 500;
urx = 250;
ury = 780;
Este es un rectángulo con la esquina inferior izquierda (120, 500), un ancho de 130 y una altura de 380. Por lo tanto, dibuja un rectángulo como este:
cb.rectangle(120, 500, 130, 280);
cb.stroke();
Lamentablemente, ese rectángulo es demasiado grande.
Ahora agreguemos el texto una vez más en coordenadas ligeramente diferentes:
ct = new ColumnText(cb);
ct.setSimpleColumn(300f, 500f, 430f, 780f);
ct.addElement(p);
ct.go();
En lugar de usar (300, 500) como esquina inferior izquierda para el rectángulo, le pedimos al objeto ct
su posición Y actual usando el método getYLine()
:
float endPos = ct.getYLine() - 5;
Como puede ver, restar 5 unidades de usuario, de lo contrario la línea inferior de mi rectángulo coincidirá con la línea de base de la última línea de texto y no se ve muy bien. Ahora puedo usar el valor de endPos
para dibujar mi rectángulo así:
cb.rectangle(300, endPos, 130, 780 - endPos);
cb.stroke();