String em diferentes ângulos

4 respostas
P

Oi turma.
Gostaria de saber como eu faço pra colocar uma String numa diagonal da tela.
Por exemplo: tenho um mapa de um bairro, e quero que o nome da rua apareça seguindo +/- o caminho da rua, como no mapa da lista telefônica… (não sei se a sua lista é assim).
Então como eu poderia fazer isso?
Ficaria agradecida se alguém pudesse me dar essa luz! :lol:

4 Respostas

Paulo_Silveira

ola patricia

que imagem charmosa

entao, creio que voce va precisar pegar a posicao onde quer colocar no comeco, e plotar char por char. uma solucao pronta no java.* creio que nao exista

Rafael_Steil

Oi Patricia,
fazer rotacao de componentes eh um pouco complicado ( no minimo meio chato ). Eu sou meio enrolado com Swing, mas consegui fazer um exemplo meia-boca que rotaciona um JLabel. Eh necessario que voce crie sua propria classe, que extenda JLabel ( ou qualquer outro componente que voce queira rotacionar ).
Veja:

import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;

class MyLabel extends JLabel
{
	private AffineTransform af;
	
	public MyLabel(String s, int degrees)
	{		
		setText(s);
		af = new AffineTransform();
		af.rotate(Math.toRadians(degrees));
	}
	
	public void paintComponent(Graphics g)
	{	
		Graphics2D g2 = (Graphics2D)g;		
		g2.setTransform(af);
		g2.drawString(getText(), getX() + 10, getY() + 10);
		super.paintComponent(g2);
		
		repaint();
	}
}

public class JLabelRotate extends JFrame
{		
	public JLabelRotate()
	{
		MyLabel label = new MyLabel("Minha linda String", 45);
		getContentPane().add(label);
		setSize(200, 300);
		setVisible(true);
	}
	
	public static void main(String args[])
	{
		new JLabelRotate();
	}
}

Acho que com isso vc ja consegue ter uma boa base.

Rafael

P

Caro Rafael:
Muito Obrigada pela dica. Com certeza esse código vai ajudar e muito para resolver o meu problema.
Valeu mesmo.
Patricia

dukejeffrie

Vc pode usar uma técnica de escrever a string em outra imagem, e na hora h só desenhar a imagem inclinada que vc já guardou:

public class RotatedLabel extends JComponent {
   private Image image;
   private JLabel label;
   private double theta;

   public void setText(String text) {
      label.setText();
      textChanged();
   }

   public void textChanged() {
      Image i = new Image();
      Graphics2D g = (Graphics2D) i.getGraphics();
       label.paintComponent(g);
      g.rotate(tetha);
      this.image = i;
      repaint();
   }

   public void paintComponent(Graphics g) {
     g.drawImage(image, 0, 0, this);
   }

Rafael, vc criou um loop infinito no seu código:

public void paintComponent(Graphics g)
   {   
      Graphics2D g2 = (Graphics2D)g;      
      g2.setTransform(af);
      g2.drawString(getText(), getX() + 10, getY() + 10);
      super.paintComponent(g2);
      
      repaint();
   }

o repaint() chama o paint(Graphics) que chama o paintComponent(Graphics) que chama o repaint() que chama… :roll:

Além disso, é um perigo vc mexer na AffineTransform de um Graphics que vc não tem controle. Por exemplo, na imagem acima, eu sei que o Graphics é uma região isolada. Se vc seta o graphics do componente direto, todos os outros componentes desenhados a partir dali vão usar a sua transformação, além de talvez vc perder outras transformações anteriores (como scaling, por exemplo).

Boa sorte, patricia!! Se vc se empolgar, olha o tutorial de Java3d que é louquíssimo…

[]s

Criado 13 de fevereiro de 2003
Ultima resposta 14 de fev. de 2003
Respostas 4
Participantes 4