# Ein Wort in einem String färben in einer Canvas



## Guest (18. Jan 2009)

hallo,

ich möchte in einer canvas ebene einen string ausgeben:
String: "Der Name der Rose"

das wort "Name" soll rot sein, der rest schwarz.
ich habe schon die threads gelesen und strings mit html-tags versehen, funktioniert auch gut, aber nur dein JTextfields oder Textareas, die kennen das.
In der canvas mit g.drawString....  werden die tags mit ausgegeben -> mist.

ich kann zwar vor jedem wort die textfarbe ändern und die einzelnen worte mit g.drawString platzieren, müsste hierzu aber wissen wie lang ein wort ist, um das nächste daneben zu setzen, das kann es doch auch nicht sein.

ich weiß grad nicht weiter, danke schonmal für eure hilfen
mfg
dalco


----------



## Ebenius (18. Jan 2009)

Zeichne doch einfach drei Strings. "Der", "Name", "der Rose". Den Mittleren zeichnest Du rot, die anderen beiden schwarz.

Viel Spaß!


----------



## André Uhres (18. Jan 2009)

Da das Zeichnen von Strings dir verständlicherweise zu aufwendig ist, versuch's mal mit JLabel und html.

```
jLabel1.setText("<html>Der <font color=red>Name <font color=black>der Rose");
```

EDIT: oder nimm einfach drei JLabels mit der jeweils passenden Foreground Farbe,
die du nebeneinander in dein Panel setzt.


----------



## Marco13 (18. Jan 2009)

_ich kann zwar vor jedem wort die textfarbe ändern und die einzelnen worte mit g.drawString platzieren, müsste hierzu aber wissen wie lang ein wort ist, um das nächste daneben zu setzen, das kann es doch auch nicht sein. _

Wenn du die Worte undbeingt mit g.drawString zeichnen musst, wirst du um das Berechnen der Größe eines Wortes (für die richtige Platzierung des nächsten) nicht drumrumkommen. Die Klasse FontMetrics wäre ein Suchstichwort dazu...


----------



## Guest (19. Jan 2009)

Jlabel geht mit html-strings, weiß ich selbst.
und ja, es muss in einer canvas mit g.drawstring gezeichnet werden, die ich grafiken platziere und alles drum rum so aufgebaut ist,
werd mir deine klasse mal anschauen
danke einstweilen


----------



## André Uhres (19. Jan 2009)

Anonymous hat gesagt.:
			
		

> es muss in einer canvas mit g.drawstring gezeichnet werden, die ich grafiken platziere und alles drum rum so aufgebaut ist


Das kann man mit Canvas machen, muss man aber nicht.
Hier ist eine Möglichkeit mit Panel und JLabel.

```
class MyPanel extends Panel {
    public MyPanel() {
        setLayout(null);
        JLabel label = new JLabel();
        label.setText("<html>Der <font color=red>Name <font color=black>der Rose");
        label.setBounds(100, 100, 200, 20);
        add(label);
    }
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.drawOval(80, 60, 150, 100);
    }
}
```


----------



## Ebenius (19. Jan 2009)

Ich find's im allgemeinen nicht schön, AWT-Komponenten und Swing-Komponenten in GUIs zu vermischen. Kannst Du nicht gleich Swing nehmen?


----------



## Marco13 (19. Jan 2009)

Ein Ansatz wäre vielleicht auch, ein JLabel nur als "renderer" zu verwenden, aber das könnte auch ein bißchen fummelig/hakelig werden.


----------



## Ebenius (19. Jan 2009)

Marco13 hat gesagt.:
			
		

> Ein Ansatz wäre vielleicht auch, ein JLabel nur als "renderer" zu verwenden, aber das könnte auch ein bißchen fummelig/hakelig werden.


Hier hilft eventuell die CellRendererPane-Klasse.

Ebenius


----------



## André Uhres (19. Jan 2009)

Marco13 hat gesagt.:
			
		

> Ein Ansatz wäre vielleicht auch, ein JLabel nur als "renderer" zu verwenden


Du meinst vielleicht sowas:

```
class MyPanel extends Panel {
    private JLabel label;
    private Rectangle rectLabel = new Rectangle(100, 100, 200, 20);
    public MyPanel() {
        label = new JLabel();
        label.setText("<html>Der <font color=red>Name <font color=black>der Rose");

    }
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        SwingUtilities.paintComponent(g, label, (Container) MyPanel.this, rectLabel);
        g.drawOval(80, 60, 150, 100);
    }
}
```
Das geht allerdings auch.


----------



## dalco (20. Jan 2009)

hallo,
danke an alle, habs nun mit FontMetrics gelöst, ist echt klasse klasse 
ich iteriere über den string, weiß dann genau die länge der einzelnen wortes, ändere dann die farbe und setze mit dem g.drawString das nächste wort an das ende der vorherigen+5 pixel, and so on.

geht und sieht gut aus,
danke und frage hiermit beendet
mfg
dalco


----------

