# JLabel o.ä. mit Variablen verknüpfen



## norman (29. Mai 2006)

Hallo zusammen,

wie kann ich denn zB ein JLabel am einfachsten so mit einer Variablen verknüpfen, dass das label bei einer änderung der variablen entsprechend den aktuellen wert anzeigt?


----------



## thE_29 (29. Mai 2006)

Wie oft kann man den ne Variable im Programm ändern?

Eh net so oft, bau halt nach jeder Änderung ein setText ein!


----------



## norman (29. Mai 2006)

genau das wollte ich eigentlich vermeiden. hm. :-/


----------



## Java Chris (29. Mai 2006)

dann bau dir ne funktion der du einen wert übergibst und diese funktion mach dass davon, variable und label setzen


----------



## norman (29. Mai 2006)

naja, ich dachte eher an sowas wie value-binding ???:L


----------



## thE_29 (29. Mai 2006)

Schreib dir halt ne LabelData Klasse extends JLabel

welches du einem Typen zuweisen kannst!

Und wenn setTyp(String) kommt, dann machst ein validate/repaint fürs JLabel!


----------



## Roar (29. Mai 2006)

hm, sowas?


```
public interface ValueModel<T> {

	public T getValue();
	
	public void setValue(T val);
	
	public void addPropertyChangeListener(PropertyChangeListener listener);
	
	public void removePropertyChangeListener(PropertyChangeListener listener);
	
}

	public static void bind(final JLabel l, ValueModel<?> model) {
		model.addPropertyChangeListener(new PropertyChangeListener() {
			public void propertyChange(PropertyChangeEvent evt) {
				l.setText(evt.getNewValue().toString());
			}
		});
	}
```
...

```
ValueModel<String> irgendwelcheDaten = new ....();
bind(einLabel, irgendwelcheDaten);
irgenwelcheDaten.setValue("aggaugga");
```


----------



## norman (29. Mai 2006)

das könnte es sein, danke erstmal..


----------



## thE_29 (29. Mai 2006)

Naja, eigentlich net so!

Weil wenn man jetzt das interface überschreibt mitn setValue(T Val)


Was muss dort drinnen stehen?

label.setText(val);


Toll, damit sind wir beim alten Problem :bae:

Oder geht das irgendwie mitn listener!?!

Hätte es so gedacht


```
public class ValueLabel extends javax.swing.JLabel
{
private Object obj;

public ValueLabel()
{
	
}

public void setValue(Object obj)
{
	this.obj = obj;
	this.setText(obj);
	this.repaint();
}
}
```


Das Object obj kann man halt durch T val ersetzen (habs mit 1.4 compiliert)

Jetzt hat man 1 Objekt welches gleichzeitig die Variable und das Label ist!

Nur muss man den wert der Variable hier per Methoden überschreiben (warum lassen die keine Operatoren überschreiben..)


----------



## Roar (29. Mai 2006)

thE_29 hat gesagt.:
			
		

> label.setText(val);


nein, das steht da nicht drin. wenn du den code richtig liest: das model kennt die view nicht und das model hat die view auch nicht zu kennen, deshalb ist eine idee wie JLabel subclassen verwenden auch pfui. vor allem wenn du das in ein bestehendes programm einbauen willst. hier die default impl von ValueModel:


```
package net.roarsoftware.binding;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;


public class DefaultValueModel<T> implements ValueModel<T> {
	
	private T value;
	private List<PropertyChangeListener> listeners = new ArrayList<PropertyChangeListener>();
	
	public DefaultValueModel() {
	}
	
	public DefaultValueModel(T value) {
		this.value = value;
	}

	public T getValue() {
		return value;
	}

	public void setValue(T val) {
		T old = value;
		this.value = val;
		firePropertyChangeEvent(old, val);
	}
	
	protected void firePropertyChangeEvent(T oldVal, T newVal) {
		PropertyChangeEvent propertyChangeEvent = new PropertyChangeEvent(this, "value", oldVal, newVal);
		for(PropertyChangeListener l: listeners) {
			l.propertyChange(propertyChangeEvent);
		}
	}

	public void addPropertyChangeListener(PropertyChangeListener listener) {
		listeners.add(listener);
	}

	public void removePropertyChangeListener(PropertyChangeListener listener) {
		listeners.remove(listener);
	}

}
```

vielleicht sollte man noch WeakReferences verwenden, aber mag jetz nix ändern.


----------



## thE_29 (29. Mai 2006)

Naja, so sieht das ganze schon besser aus


----------

