# Suche TagCloud Komponente für Swing



## slawaweis (25. Jun 2010)

Hallo,

kennt jemand eine Tag Cloud Komponente für Swing, am besten mit einem eigenen Model? Tag Cloud sind vor allem aus Webseiten bekannt:

Schlagwortwolke ? Wikipedia

Slawa


----------



## Landei (25. Jun 2010)

Wordle is cool: Wordle - Scala

Swing-Komponenten kenne ich leider nicht :-/


----------



## Grizzly (7. Jun 2011)

Hallo Slawa,

bin auch gerade auf der Suche. Aber irgendwie scheint da tote Hose zu sein. Hast Du zwischenzeitlich etwas passendes gefunden?

Ansonsten würde mir nur eine Lösung über ein Panel mit FlowLayout einfallen. Dort könnte man dann die Tags als Labels reinsetzen und auf Maus-Ereignisse reagieren lassen. Natürlich müsste man die Gewichtung noch irgendwie einbauen.


----------



## Michael... (7. Jun 2011)

Wenn eine simple Umsetzung ausreicht, könnte man das mittels JEditorPane implementieren. Die Begriffe werden anhand ihrer Gewichting in HTML formatiert. Um auf das Klcken zu reagieren kann man sicherlich die Hyperlink Funktionalität "missbrauchen".


----------



## Grizzly (7. Jun 2011)

Michael... hat gesagt.:


> Wenn eine simple Umsetzung ausreicht, könnte man das mittels JEditorPane implementieren. Die Begriffe werden anhand ihrer Gewichting in HTML formatiert. Um auf das Klcken zu reagieren kann man sicherlich die Hyperlink Funktionalität "missbrauchen".



Ich muss ehrlich gesagt zugeben - obwohl doch jetzt einige Jahre Java und Swing Erfahrung habe - habe ich mit dem JEditorPane noch nicht gearbeitet. Die Idee ist mir zwar auch gekommen. Es liegt ja auch irgendwie auf der Hand. Aber ich stelle mir das anspruchsvoller von der Umsetzung her vor.


----------



## Michael... (7. Jun 2011)

Habe selbst JEditorPane noch nie produktiv eingesetzt und auch nicht wirklich Erfahrung mit der Komponente.

Das ganze geht sicherlich auch objektorientierter und der Missbrauch des HyperlinkEvents eventuell eleganter.
Unschön ist der Zeilenumbruch mitten im Wort. Eventuell weiß hier jemand einen einfachen Weg der JEditorPane bzw. deren EditorKit das abzugewöhnen.

```
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;

public class TagCloudDemo extends JFrame {
	public TagCloudDemo() {
		final String[] topic = new String[20];
		int[] weight = new int[topic.length];
		StringBuffer buffer = new StringBuffer("<html>");
		for (int i=0; i<topic.length; i++) {
			topic[i] = "Begriff" + i;
			weight[i]=(int)(Math.random()*5 + 5);
			buffer.append("<a href=\"http://" + i + "\"><font size=\"" + weight[i] + "\">" + topic[i] + "</font></a>&nbsp;&nbsp;&nbsp;");
		}
		buffer.append("</html>");
		JEditorPane cloud = new JEditorPane("text/html", buffer.toString());
		cloud.setEditable(false);
		cloud.addHyperlinkListener(new HyperlinkListener() {
			public void hyperlinkUpdate(HyperlinkEvent e) {
				if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
					String[] target = e.getURL().toString().split("//");
					if (target.length==2) {
						int index = Integer.parseInt(target[1]);
						System.out.println("Der gewählte Begriff ist: " +topic[index]);
					}
				}
			}
		});
		this.getContentPane().add(new JScrollPane(cloud));
	}
	
	public static void main(String[] args) {
		JFrame frame = new TagCloudDemo();
		frame.setBounds(0, 0, 500, 300);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
```


----------



## Grizzly (7. Jun 2011)

Michael... hat gesagt.:


> [...]Unschön ist der Zeilenumbruch mitten im Wort. Eventuell weiß hier jemand einen einfachen Weg der JEditorPane bzw. deren EditorKit das abzugewöhnen.[...]


Ich habe Deinen Code getestet und natürlich hat sich bei mir genau das gleiche Probleme gezeigt. Ich habe dann wie ein Irrer im Internet gesucht und nichts gefunden. Die meisten Leute hatten das Problem anders herum: Die wollten gar keinen Umbruch, sondern dass der Text einfach nach rechts weiter läuft. 

Am Ende habe ich mir gar nicht mehr anders zu helfen gewusst, als einmal den Inhalt von buffer in eine HTML Datei zu speichern und diese im Firefox anzuschauen. Das war sehr interessant: Der Text lief einfach bis Ultimo nach rechts weiter. Und dann ist mir ein Licht aufgegangen: Du hattest die tolle Idee per &nbsp;&nbsp;&nbsp; einen Abstand zwischen den Links zu bauen. Problem: Jetzt hängt der ganze Text am Stück. Und so wird der auch von JEditorPane, JTextPane und der Gecko Render Engine von Firefox behandelt. Nämlich am Stück. Kaum macht man die Dinger raus und einfach einen Leerschritt rein, funktioniert alles wunderbar.  Denn Abstand könnte man - sofern man einen größeren haben will - irgendwie über CSS lösen. 

Trotzdem danke mal soweit. Damit wäre die Tag Cloud wohl gelöst.

Und bzgl.:


Michael... hat gesagt.:


> [...]Das ganze geht sicherlich auch objektorientierter und der Missbrauch des HyperlinkEvents eventuell eleganter.[...]


Ich habe Dein Beispiel als Proof-of-Concept genommen. Da ist das eh Wurst. 
Sicher kann man jetzt das Ganze noch schön verpacken, eine Tag Klasse basteln, die einen Listener bekommt, der dann von der Tag Cloud über den HyperlinkListener aufgerufen wird. Nicht zu vergessen, dass man noch eine Statistik über die Tags erstellen sollte, um die Gewichtung herauszubekommen.


----------



## Michael... (7. Jun 2011)

Ich hatte erst ein normales Leerzeichen im Text. Um den Abstand zu vergrößern habe ich dann die Named Entities eingefügt, dass das Auswirkungen auf den Zeilenumbruch hat ist nicht aufgefallen :-(


----------



## slawaweis (7. Jun 2011)

Hallo Grizzly,



Grizzly hat gesagt.:


> bin auch gerade auf der Suche. Aber irgendwie scheint da tote Hose zu sein. Hast Du zwischenzeitlich etwas passendes gefunden?


nein, habe es inzwischen selber geschrieben.



Grizzly hat gesagt.:


> Ansonsten würde mir nur eine Lösung über ein Panel mit FlowLayout einfallen. Dort könnte man dann die Tags als Labels reinsetzen und auf Maus-Ereignisse reagieren lassen. Natürlich müsste man die Gewichtung noch irgendwie einbauen.


habe ich auch so gemacht, inklusive der Gewichtung. Ich habe es zuerst mit JEditorPane versucht, aber es gab zu viele Probleme und sah nicht besonders gut aus. Danach habe ich es mit einer JXPanel und JXHyperlink's gelöst. Für kleine Mengen an Tags (< 100) ist es OK, für größere Mengen wäre es nicht effektiv.

Slawa


----------



## Grizzly (8. Jun 2011)

slawaweis hat gesagt.:


> [...]aber es gab zu viele Probleme und sah nicht besonders gut aus.[...]


Jetzt wäre es natürlich interessant zu wissen, auf welche Probleme Du gestoßen bist und warum es nicht besonders gut aussah.


----------



## slawaweis (8. Jun 2011)

Grizzly hat gesagt.:


> Jetzt wäre es natürlich interessant zu wissen, auf welche Probleme Du gestoßen bist und warum es nicht besonders gut aussah.



ich wollte, dass bei Mausbewegungen die Tags unter dem Mauszeiger unterstrichen werden. Das hat nicht funktioniert. Wenn man die Maus von Links nach Rechts und von Oben nach Unten bewegte, dann wurden die vorherigen Unterstriche nicht gelöscht. Es müsste das gesamte Dokument neugerendert werden. Die Tags in der Mitte zu positionieren ging auch mehr schlecht als recht. Weiterhin das Problem mit dem Umbruch mitten im Tag mit Leerzeichen.

Vielleicht kann man es sauber mit JEditorPane machen, aber nach ein paar Stunden hatte ich keine Lust mehr und habe es mit JXHyperlink gelöst, was auch schneller ging.

Slawa


----------

