# string spiegeln



## chelly (6. Nov 2006)

Hallo,

ich möchte wissen, ob es eine Möglichkeit gäbe, einen String zu spiegeln.

Ich kann die Spiegelung hier nicht darstellen, deswegen gebe ich noch ein Beispiel zur Vorstellung.
Stellt euch vor, ein Spiegel liegt auf dem Boden, wenn ich einen Namen auf meine Handfläche schreibe und den auf dem Spiegel lese.
Die Darstellung auf dem Spiegel möchte ich haben.

Ist das mit Java möglich??

Vielen Dank im voraus.
chelly


----------



## Bert Brenner (6. Nov 2006)

Ein String repräsentiert doch nur eine Zeichenkette, wie du die nachher darstellst ist deine Sache.

Wenn du selber zeichnest, dann kannst du den gewünschten Effekt bestimmt mit AffineTransform erzeugen.


----------



## thE_29 (6. Nov 2006)

```
package at.jta;

import javax.swing.JLabel;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.font.TextLayout;
import java.awt.image.BufferedImage;
import java.awt.geom.Rectangle2D;
import java.awt.Graphics2D;
import java.awt.Color;
import java.awt.geom.AffineTransform;

/**
 * 
 * 

Überschrift: Label zeigt den Text horizontal gespiegelt an</p> 
 * 
 * 

Beschreibung: </p> 
 * 
 * 

Copyright: Copyright (c) 2006</p> 
 * 
 * 

Organisation: Taschek Jörg</p>
 * 
 * @author Taschek Jörg
 * @version 1.0 Erstversion 6.11.2006
 */
public class MirrorLabel
    extends JLabel
{
  /**
   *
   * @param text String
   */
  public MirrorLabel(String text)
  {
    super(text);
  }

  /**
   *
   * @param g Graphics
   */
  public void paintComponent(Graphics g)
  {
    Graphics2D g2 = (Graphics2D) g;
    TextLayout layout = new TextLayout(this.getText(), this.getFont(), g2.getFontRenderContext());
    Rectangle2D bounds = layout.getBounds();

    double textImgWidth = bounds.getWidth() + 12;
    double textImgHeight = bounds.getHeight() + layout.getDescent() + 4;

    BufferedImage textImage = new BufferedImage( (int) textImgWidth, (int) textImgHeight, BufferedImage.TYPE_INT_ARGB);

    Graphics2D g2text = textImage.createGraphics();
    g2text.setColor(Color.WHITE);
    layout.draw(g2text, 6, layout.getAscent());
    g2text.dispose();

    int textWidth = textImage.getWidth();
    int textHeight = textImage.getHeight();

    //hier das TextImage erstellen (1 bit nach links ist * 2)
    BufferedImage buffer = new BufferedImage(textWidth, textHeight << 1, BufferedImage.TYPE_INT_ARGB);
    Graphics2D gg = buffer.createGraphics();
    //zuerst normal raufzeichnen
    gg.drawImage(textImage, null, null);
    //hier Position umsetzen, sodaß 0,0 eigentlich 0, textHeight ist
    gg.translate(0, textHeight << 1);
    //spiegel transform anlegen
    AffineTransform reflectTransform = AffineTransform.getScaleInstance(1.0, -1.0);
    //hier das gespiegelte Bild drauflegen
    gg.drawImage(textImage, reflectTransform, null);
    //hier Position wieder zurücksetzen
    gg.translate(0, - (textHeight << 1));
    gg.dispose();

    int x = 0, y = 0;
    if(this.getHorizontalAlignment() == CENTER)
      x = (getWidth() - textWidth) / 2;
    else if(this.getHorizontalAlignment() == RIGHT)
      x = getWidth() - textWidth;
    if(this.getVerticalAlignment() == BOTTOM)
      y = getHeight() - textHeight << 1;
    else if(this.getVerticalAlignment() == CENTER)
      y = (getHeight() - textHeight) / 2;

    //hier das normale Bild + Spiegelbild in einem auf die gewünschten Koordinaten zeichnen
    g.drawImage(buffer,x,y,null);
  }

  /**
   * 
   * @return Dimension
   */
  public Dimension getPreferredSize()
  {
    Dimension dim = super.getPreferredSize();
    dim.height *= 2; //doppelte Höhe zurückgeben
    return dim;
  }
}
```

Das isn gespiegeltes Label was ich schnell zusammengebaut habe!

Hoffe der Code ist verständlich


----------



## kaie (6. Nov 2006)

Hier eine etwas kürzere Lösung, mit der man auch andere Komponenten spiegeln kann. Natürlich bleibt dabei die Interaktion auf der Strecke.


```
import java.awt.*;
import javax.swing.*;
import java.awt.geom.*;
public class MirrorPanel extends JPanel
{
	public void paintComponent( Graphics g )
	{
		Graphics2D g2 = (Graphics2D)g;
		AffineTransform a = (AffineTransform)g2.getTransform().clone();
		a.translate(getSize().width,0);
		a.scale(-1,1);
		g2.setTransform(a);
		super.paintComponent(g);
	}
	public static void main( String[] s )
	{
		JFrame f = new JFrame();
		f.setLayout(new GridLayout(2,1));
		f.add(new JLabel("Spiegelschrift"));
		MirrorPanel m = new MirrorPanel();
		m.add(new JLabel("Spiegelschrift"));
		f.add(m);
		f.pack();
		f.setVisible(true);
	}
}
```


----------



## Leroy42 (6. Nov 2006)

kaie hat gesagt.:
			
		

> Hier eine etwas kürzere Lösung, mit der man auch andere Komponenten spiegeln kann.
> 
> ```
> ...
> ```


 :shock: Woow!  :shock: 

Dazu fällt mir nur ein:



			
				Leroys Abwandlung eines bekannten Zitats hat gesagt.:
			
		

> _Es gibt noch viel zu lernen!
> Überlassen wir's anderen_


----------



## thE_29 (6. Nov 2006)

Kürzer ist nicht gleich besser 

Imho isses sowieso 1:1 das gleiche, das Problem is nur, das ich nur den Text Spiegeln wollte!

Ein ganzes Ding war ja das leichtere zum Spiegeln (oder gleich ein Bild).


----------



## Guest (6. Nov 2006)

hallo,

zu der lösung von kai.

Das ist keine Spiegelung sondern eine Drehung von 180 grad nur.
Ich meine mit spiegelung folgendes


----------



## Guest (6. Nov 2006)

sorry, ich habe vergessen den Satz zu ende zu bringen.

folgendes:


Jeder Buchstabe des angegebene String bleibt an der gleiche Stelle wo sie ist,
Die Buchstaben werden aber durch eine Y_Axe gespiegelt


----------



## Guest (6. Nov 2006)

Hallo nochmal,

also die lösung von thE_29 war brillant, ein probleme noch.

wie kann ich den Code so umändern, dass ich nur der gespieglte String darstelle und auf der gesamte Fläche des Panels?

Vielen Dank im voraus.
chelly


----------



## thE_29 (7. Nov 2006)

Einfach das Label auf das JPanel mit setHorizontal/VerticalAlginment Center!


----------



## kaie (7. Nov 2006)

Hey, Du hast nie gesagt, um welche Achse Du Deinen Text gespiegelt haben wolltest. Und ich bin immer noch überzeugt, dass meine Lösung eleganter ist (...schmoll...)   

Ersetze einfach die beiden Zeilen:

```
a.translate(getSize().width,0); 
      a.scale(-1,1);
```
mit

```
a.translate(0,getSize().height); 
      a.scale(1,-1);
```
und schon ist der Text um die x-Achse gespiegelt. Übrigens funktioniert das auch wunderbar mit HTML-Text:

```
public static void main( String[] s ) 
   { 
      JFrame f = new JFrame(); 
      f.setLayout(new GridLayout(2,1)); 
      f.add(new JLabel("<html><h1>Hallo!</h1>Dies ist ein [i]kursiver[/i] Text")); 
      MirrorPanel m = new MirrorPanel(); 
      m.setLayout(new BorderLayout());
      m.add(new JLabel("<html><h1>Hallo!</h1>Dies ist ein [i]kursiver[/i] Text")); 
      f.add(m); 
      f.pack(); 
      f.setVisible(true); 
   }
```


----------



## thE_29 (7. Nov 2006)

Jetzt schau dir mal deines an und dann schau dir mal meines an und sag mir welches Resultat besser aus sieht!

Da ist das klar meines, da meines auch wirklich untereinander gespiegelt wird und net irgendwo 


Außerdem ist deines ganz einfach keine Spiegelung und aus!

Du drehst deine Komponente um 180 grad!

Du legst ja 2 drauf und nicht eines!

Bei mir ist das einfach 1 Komponente


----------



## kaie (7. Nov 2006)

Moooooooment, der Origrinalposter wollte, soweit ich das verstanden habe, NUR den gespiegelten Text, und nicht den gleichen Text zweimal (einmal normal, einmal gespiegelt). Bei mir kann er beide einzeln erzeugen und anzeigen.

Hast Du meine Lösung eigentlich mal angesehen? Ich habe exakt die gleiche Verschiebung und Skalierung mit -1 wie Du in Deiner Lösung, nur zuerst um die falsche Achse (da die in der Frage gar nicht angegeben war).

Will ja hier jetzt auch keinen Forenkrieg auslösen, Deine Lösung ist ja auch schön! 

(aber meine gefällt mir besser...  :bae: )


```
import java.awt.*;
import javax.swing.*;
import java.awt.geom.*;
public class MirrorPanel extends JPanel
{
	public void paintComponent( Graphics g )
	{
		Graphics2D g2 = (Graphics2D)g;
		AffineTransform a = (AffineTransform)g2.getTransform().clone();
		a.translate(0,getSize().height);
		a.scale(1,-1);
		g2.setTransform(a);
		super.paintComponent(g);
	}
	public static void main( String[] s )
	{
		JFrame f = new JFrame();
		f.setLayout(new GridLayout(2,1));
		f.add(new JLabel("<html>Dieser Text ist [i]<u>wirklich</u>[/i] gespiegelt!"));
		MirrorPanel m = new MirrorPanel();
		m.setLayout(new BorderLayout());
		m.add(new JLabel("<html>Dieser Text ist [i]<u>wirklich</u>[/i] gespiegelt!"));
		f.add(m);
		f.pack();
		f.setVisible(true);
	}
}
```

Schönen Tag noch!


----------



## thE_29 (7. Nov 2006)

Okay, deine letzte Version ist jetzt gut!

Aber die vorigen waren es nicht  Da der Text bei mir immer irgendwo gespiegelt war..

Und das er nur den gespiegelten will, habe ich erst vor 10min entdeckt


----------



## kaie (7. Nov 2006)

Wunderbar, dann sind ja alle glücklich und zufrieden. thE_29, ich freue mich schon auf weitere sportliche Diskussionen bei der nächsten AWT-Frage. Ich LIEBE dieses Forum!


----------

