Adicionar texto em rectângulo

Alguem sabe como posso adicionar texto dentro de um rectângulo. Ou seja, tenho um rectângulo desenhado através de:

public void paint(Graphics g){
(…)

g.fillRect(x,y,largura,altura);

(…)
}

A dúvida é como colocar o texto (String) sem execeder a largura nem a altura do rectângulo. Queria que o texto ao encontrar a margem direita do rectângulo mudasse de linha.

Existe alguma classe que permita alinhar texto (justificado, centrado,…) por forma a não exceder a área do rectângulo.

Sem mais,
Epi-Lif

Olá, bem vindo.

Você precisa desenhar o texto na unha utilizando g.drawString ou pode apenas desenhar uma borda retangular bonita numa JLabel que faz o word-wrap para você?

Boa Tarde,

o que preciso mesmo é desenhar num rectângulo um pequeno texto. De maneira a não exceder as margens do rectângulo. Mudar automaticamente de linha quando necessário e não permitir que ultrapasse a altura do rectângulo.

Tudo isto é para uma pequena aplicação de desenho (linhas, rectângulos, circulos, texto dentro das figuras,…) em Java (Applet).

Nas pesquisas que fiz, para ver se existe alguma classe que permita desenhar texto sem ultrapassar as margens do rectângulo envolvente ao texto, não encontrei nada que se adapte ao que pretendo.

Uma vez que pretendo “desenhar” texto num objecto do tipo Canvas, decidi fazer tudo à «unha»! Através dos métodos da classe FontMetrics consigo saber se o texto cabe no rectângulo ou se preciso de o dividir palavra-a-palavra. Parece-me ser a única solução.

Grato pela resposta.

Sem mais,
Epi-Lif

Tenho este código aqui, pode fazer o que quiser com ele:

[code]
import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.swing.SwingUtilities;

public class RandomBuzzPhraseGenerator
{
private static String[] col1 = { "Caros colegas, ", "Por outro lado, ",
"Não podemos esquecer que ", "Do mesmo modo, ",
"A prática mostra que ", "Nunca é demais insistir que ",
"A experiência mostra que ", "É fundamental ressaltar que ",
"O incentivo ao avanço tecnológico, assim como ",
"Assim mesmo, " };

private static String[] col2 = { "a execução deste projeto ",
			"a complexidade dos estudos efetuados ",
			"a atual estrutura de organização ",
			"o novo modelo estrutural aqui preconizado ",
			"o desenvolvimento de formas distintas de atuação ",
			"a constante divulgação das informações ",
			"a consolidação das estruturas ",
			"a análise dos diversos resultados ",
			"o início do programa de formação de atitudes ",
			"a expansão de nossa atividade " };

private static String[] col3 = { "nos obriga à análise ",
			"cumpre um papel essencial na formulação ",
			"auxilia a preparação e a estruturação ",
			"contribui para a correta determinação ",
			"assume importantes posições na definição ",
			"facilita a definição ",
			"prejudica a percepção da importância ",
			"oferece uma boa oportunidade de verificação ",
			"acarreta um processo de reformulação ",
			"exige precisão e definição " };

private static String[] col4 = { "das nossas opções de desenvolvimento futuro.",
			"das nossas metas financeiras e administrativas.",
			"das atitudes e das atribuições da diretoria.",
			"das novas proposições.",
			"das opções básicas para o sucesso do programa.",
			"do nosso sistema de formação de quadros.",
			"das condições apropriadas para os negócios.",
			"dos índices pretendidos.", "das formas de ação.",
			"dos conceitos de participação geral." };

private static String[][] cols = { col1, col2, col3, col4 };
public static void main( String[] args )
{
	Random random = new Random( System.currentTimeMillis() );

	String line = "";
	for( int i = 0; i < cols.length; i++ )
	{
		int r = random.nextInt( cols[ i ].length );
		line += cols[ i ][ r ];
	}

	// aqui seria o width do retângulo
	int width = 300;

	// espapaço entre a borda e o texto
	int padding = 10;

	BufferedImage buffer = new BufferedImage( width, 5,
			BufferedImage.TYPE_INT_RGB );
	Graphics g = buffer.createGraphics();

	FontMetrics metrics = g.getFontMetrics();
	List computedLines = new ArrayList();

	// lala
	int avaiableWidth = width - padding * 2;

	// se o texto tiver uma linha só menor que o width total, não precisa
	// fazer os cálculos
	if( SwingUtilities.computeStringWidth( metrics, line ) < avaiableWidth )
		computedLines.add( line );
	// aqui começa a macumba, note que não trato textos que contém "\n"
	else
	{
		String newLine = null;
		String remaining = line;
		String temp = null;
		while( !remaining.equals( "" ) )
		{
			newLine = line;
			remaining = line;
			temp = line;

			// aqui a galinha preta é sacrificada
			while( SwingUtilities.computeStringWidth( metrics, newLine ) > avaiableWidth )
			{
				temp = temp.substring( 0, temp.lastIndexOf( " " ) );
				newLine = temp;
				remaining = line.substring( newLine.length() );
			}

			// e aqui a pinga é tomada
			if( !remaining.equals( "" ) )
				line = line.substring( newLine.length() );

			computedLines.add( newLine.trim() );
		}
	}

	int lineHeight = metrics.getHeight();

	// calculado o height total da imagem
	int realHeight = computedLines.size() * lineHeight - padding + 2;

	// daqui para baixo uma breve macumba para gerar a imagem final
	buffer = new BufferedImage( width, realHeight,
			BufferedImage.TYPE_INT_RGB );
	g = buffer.createGraphics();

	g.setColor( Color.WHITE );
	g.fillRect( 0, 0, width, realHeight );
	
	// bordinha preta no retângulo
	g.setColor( Color.BLACK );
	g.drawRect( 0, 0, width - 1, realHeight - 1 );

	for( int i = 0; i < computedLines.size(); i++ )
		g.drawString( computedLines.get( i ).toString(), 5, i * lineHeight
				+ lineHeight );

	// response.setContentType( "image/png" );
	OutputStream os = null;
	try
	{
		// os = response.getOutputStream();
		os = new FileOutputStream( new File( "./test.png" ) );
		ImageIO.write( buffer, "png", os );
		os.flush();
	}
	catch( Exception e )
	{
		e.printStackTrace();
	}
	finally
	{
		if( os != null )
			try
			{
				os.close();
			}
			catch( Exception ex )
			{
				ex.printStackTrace();
			}
	}
}

}[/code]

Boa Noite,

Não testei todo o código, no entanto informo que a linha de código:

List computedLines = new ArrayList();, gera um warning que se pode evitar informando o java do tipo de dados que a variável vai conter, isso é feito do seguinte modo:

List<string> computedLines = new ArrayList[b]<string>/b;

ou ainda, mais genérico:

List<object> computedLines = new ArrayList[b]<object>/b;

Fiz o código acima para rodar sob java 1.4 :wink:

Mas para 1.5 sua alteração está quaaaase certa:

List< String > computedLines = new ArrayList< String >();