# Textlinks in einem Applet



## Miss Evil (3. Sep 2003)

Hallo 

Ich habe folgendes Problem: Ich habe ein Java-Applet, welches in einer Tabelle (JTable) Daten von einem Server ausgiebt. Über eine xml lese ich die Felder ein und bekomme dann von einem Server die neuen Daten geschickt und gebe sie aus. 
Dafür benutze ich je nach Art der Daten verschiedene Renderer (von TableCellRenderer abgeleitet) Jetzt will ich aber die Daten verlinken und meine Frage ist, habe ich eine Möglichkeit, die Texte zu verlinken, oder geht das nur über ein MouseClickedEvent und den entsprechenden Koordinaten? Da die Daten ja variabel sind, müsste ich dann ja zumindest irgendwie abfragen können, wie lang die einzelnen Texte sind, damit ich wenigstens halbwegs die Koordinaten des Textes habe.

Wäre schön, wenn das jetzt jemand verstanden hat und mir helfen kann.

Dankeschön


----------



## DTR (3. Sep 2003)

Du könntest dir die mühe machen, und auf jedes Label, das in der Tabelle dargestellt wird einen MousListener anmelden. Dann bekommst du über das MousEvent mit getSource() direkt das Label zurück geliefert, und kannst damit weiterarbeiten.


----------



## Miss Evil (3. Sep 2003)

Klingt ja auch nicht ganz dumm... Kannst du mir vielleicht einen Tip geben, wie ich das mache? Ich überarbeite dieses Applet nur und bisher sind nur für ein paar Icons JLabels definiert.


----------



## DTR (3. Sep 2003)

Verwendest du den DefaultCellEditor?


----------



## Miss Evil (3. Sep 2003)

Nein, ich habe mehrere Renderer, die von TableCellRenderer abgeleitet werden... Die bisher halt Schriftfarbe und Ausrichtung setzen...


----------



## DTR (3. Sep 2003)

Ich rede nicht von dem Renderer sondern von dem Editor. Wenn du ihn nicht geändert hast, dann benutzt du ihn.


----------



## Miss Evil (3. Sep 2003)

jepp, ich hab ihn nicht verändert. 
Wer lesen kann, ist klar im Vorteil *g*


----------



## DTR (3. Sep 2003)

Miss Evil hat gesagt.:
			
		

> Wer lesen kann, ist klar im Vorteil


Das sag ich doch 

Wenn du den DefaultCelleditor verwendest, ist das ganze kein Problem. Schau dir mal die Konstruktoren dieser Klasse an.
Wenn du dir ein TextField anlegst, und diesem deinen MouseListener zuweist, kannst du einen DefaultCellEditor erzeugen. Diesen weist du jetzt der Tabelle zu. Die Folge davon müsste sein, das jedes Feld der Tabelle jetzt auf die Maus anspricht und über getSource() müsstest du direkt das Textfeld bekommen.


----------



## Miss Evil (3. Sep 2003)

Ich werd mein Glück mal versuchen. 
Aber dankeschön auf jeden Fall erstmal für die Hilfe.


----------



## DTR (3. Sep 2003)

Sag mir bitte bescheid, ob es geklappt hat, hab es selbst noch nicht Probiert.


----------



## Miss Evil (3. Sep 2003)

Klar, mach ich  Heute zwar nicht mehr, da ich heute früh los muss, aber morgen meld ich mich dann mal mit Ergebnissen.


----------



## DTR (3. Sep 2003)

Hab mir gerade mal schnell ausprobiert. Scheint doch nicht so einfach zu funktionieren. Aber wenn du den MouseListener auf die Tabelle legst, kannst du über getSelectetRow() und getSelectetColum() die Position des Tabellenfeldes ermitteln und somit auch das Feld auslesen.


----------



## Miss Evil (3. Sep 2003)

Das ist gar nicht mal soo schlecht, da mich nur die Zeile interessiert... aber wie lege ich den Listener ausschließlich auf die Tabelle *malganzblödgefragt* mit addMouseListener?


----------



## DTR (3. Sep 2003)

das währe die einfachste Variante. Also alles was mit dem CellEditor zu tun hat verwerfen. und einfach tabelle.addMouseListener() aufrufen.


----------



## Miss Evil (4. Sep 2003)

Nochmal ne Frage: 
Ich habe jetzt MouseListener implementiert (eigene Klasse ging leider nicht) und weiß gerade nicht, wie ich jetzt den Listener für die Tabelle "aktiviere" Ich höre auf mouseReleased, aber irgendwie muss ich das der Tabelle doch sagen, oder? Ansonsten liegt der Fehler nämlich woanders *seufz*


----------



## DTR (5. Sep 2003)

Du must einfach nur mit tabelle.addMouseListener(listener) den MouseListener bei deiner Tabelle anmelden. Wenn du jetzt mit der Mouse über die Tabelle fährst, sie Klickst oder wieder loslässt ist egal. Immer sagt das betriebssystem der Tabelle bescheid, was gerade mit der Maus auf ihr passiert, und diese ruft dann die entsprechende Methode des Listeners auf. Wenn du also auf mouseReleased aber nicht auf mousePressed hören willst, musst du einfach nur die Methode mouseReleased() füllen, und die andere eben nicht. Denn eine Methode in der nichts drinn steht, die macht auch nichts.


----------



## Miss Evil (5. Sep 2003)

Danke, er hört jetzt richtig . Alledings bekomme ich jetzt bei der Auswertung immer NullPointerExceptions :? Mit beiden Aufrufen.

```
row = table.rowAtPoint(event.getPoint());
	column = table.columnAtPoint(event.getPoint());

	row = table.getSelectedRow();
	column = table.getSelectedColumn();
```


----------



## DTR (5. Sep 2003)

Warum benutzt du denn den Point? Du hast zugriff auf die Tabelle (getSource()). Dann kannst du die selectierte Zeile und Spalte ermitteln. Und damit hast du auch den Inhalt des Tabellenfeldes.


----------



## Miss Evil (5. Sep 2003)

Ich hatte diese beiden Varianten versucht, da ich direkt die Spaltennummer brauche und es mir so einfacher erschien, als dann das Ganze aus dem Objekt zu ermitteln. Da ich nämlich anhand der Spaltennummer in einem Vektor schauen muss, was diese Spalte/Zelle für einen Typ hat. Aber ich geb ja zu, dass ich nicht viel Ahnung habe und für weitere Tipps immer dankbar bin  
Meine Tabellenfelder sind ja auch nicht einzeln benannt, da sie dynamisch sind und je nach xml unterschiedlich viele... ich kann da ja keine Abfrage über 31*10 Zellen (momentan) machen. Oder versteh ich das falsch? So wie ich event.getSource() verstanden habe, vergleichst du es doch mit dem Namen des Buttons, bzw. eben des Elements, oder?


----------



## DTR (5. Sep 2003)

Das mouseEvent wird geworfen, wenn die Maus losgelassen wird, richtig? Dann wird das event von der Komponente geworfen, über dem gerade die Maus ist (deine Tabelle). Die Quelle des Event ist also die Tabelle. und die sagt dir genau in welcher Zeile und in welcher Stalte das Feld markiert ist. Am besten schaust du dir nochmal genau die API an, was man mit einer JTabel alles machen kann.


----------

