Java Aktion bei Buttonklick und Doppelklick auf eine Tabellenzeile

darton

Lt. Junior Grade
Registriert
Okt. 2004
Beiträge
282
Hallo!
Ich habe folgendes Problem. Sagen wir einfach, ich habe in einer JTable in mehren Zeilen verschiedene Biersorten aufgelistet sowie die Anzahl verkaufter Kisten in einer Firma. Wenn ich jetzt beispielsweise in einer Zeile "Jever" stehen habe und in einer anderen Zeile einfach nur "Bier", soll es möglich sein, dass ich die Zeile "Jever" löschen (durch einen Button) und anschließend auf die Zeile "Bier" doppelklicken kann, sodass die Anzahl verkaufter Kisten von "Jever" zu der Zahl bei "Bier" hinzuaddiert wird. Das Ding ist nun, dass ich für beide Listener (ActionListener für Button; MouseListener für JTable) zwei verschiedene Klassen habe, die ja unabhängig voneinander sind. Das bedeutet, wenn ich auf eine Zeile doppelklicke, weiß der Listener ja nicht, welche Zeile ich vorher durch den Button gelöscht habe. Ich könnte jetzt natürlich den Wert einfach in irgendeiner statischen Variable speichern, aber ich find das irgendwie komisch, Listener-Klassen solche Variablen zu geben. Gibt es da vielleicht eine elegante Lösung oder soll ich es mit der statischen Variablen machen?
 
Du könntest natürlich auch einen Listener schreiben der beide interfaces implementiert.
sind die listener eigene klassen oder innere ? Wenn es innere klassen sind musst du keine statische variable nehmen sonder kannst die direkt dem JFrame hinzufügen und beide könne drauf zugreifen.

alternativ geht auch ein Objekt, welches als Singleton implementiert wird. Es also nur eine einzige Referenz drauf gibt, die man sich in beiden Klassen holen kann. Hat zwar was von einer Statischen Variablen, aber man kann dort den zugriff besser schützen.
 
Zuletzt bearbeitet:
Ja, das sind eigene Klassen, keine inneren.

Aber vielleicht ist es besser, wenn ich einfach eine statische Variable verwende, denn jedes mal, wenn ich diese Aktion ausführe, also Buttonklick und dann Doppelklick, müsste ja jedes Mal ein neues Singleton mit dem Objekt erzeugt werden, das markiert war, als man auf den Button geklickt hat.
 
neee genau das soll ein Singleton ja vermeiden. Du kannst davon nur eine einzige Referenz erstellen, bzw. das wird dirket beim intilisieren gemacht.

Hier mal nen schnelles beispiel:

Code:
public class Singleton {
	
	// Ein paar Variablen
	private int x;
	private boolean y;
	private String z;
	// Das Referenz Objekt
	private static Singleton referenz = new Singleton();
	
	// privater, leere Konstruktor
	privat Singleton() {
	}
	
	// Methode um an das einzige Objekt zu kommen
	public static Singleton getReferenz() {
		if(Singleton.referen == null) {
			Singleton.referenz = new Singleton();
		}
		
		return Singleton.referenz;
		
	}
}

habs nicht getestet und meine Java zeit liegt bills zurück, aber so sollte es klappen.

Du besorgst dir dann, wo immer du es brauchst über Singleton.getReferenz() ein objekt und kann mit diesem auf die Methoden und Attribute von Singleton zugreifen.

So kannst du auch speichern ob z.b. schon einmal der Löschen Knopf gedrückt wurde und dann das weitere löschen verbieten.
 
Mercsen schrieb:
Code:
public class Singleton {
	
	// Ein paar Variablen
	private int x;
	private boolean y;
	private String z;
	// Das Referenz Objekt
	private static Singleton referenz = new Singleton();
	
	// privater, leere Konstruktor
	privat Singleton() {
	}
	
	// Methode um an das einzige Objekt zu kommen
	public static Singleton getReferenz() {
		if(Singleton.referen == null) {
			Singleton.referenz = new Singleton();
		}
		
		return Singleton.referenz;	
	}
}

habs nicht getestet und meine Java zeit liegt bills zurück

Gute Einschränkung, der Code ist schrecklich :freak:

Code:
	public static Singleton getReferenz() {
		if(Singleton.referen == null) {
			Singleton.referenz = new Singleton();
		}
		
		return Singleton.referenz;	
	}

Wie soll denn referenz jemals null sein? Heutzutage implementiert man Singletons, die man allerdings fast immer vermeiden möchte, über Enums. Aber das hier ist kein Fall für einen Singleton.

Der TE möchte veränderliche Daten transportieren! Statische Felder würde ich vermeiden. Man könnte entweder das Objekt durchschleifen. Die Listener entsprechend anpassen. Oder aber die Daten direkt an die JTable hängen. JTable#putClientProperty sei noch mal erwähnt. Daran sollte man in beiden Listenern kommen und müsste so keine weitreichenden Anpassungen vornehmen.

Ich würde das Problem allerdings völlig anders angehen und eine solch seltsame Konstruktion vermeiden. Wenn das Löschen/Hinfügen etwas ist, was man öfter macht, würde ich dafür eine dezidierte Aktion bereitstellen.

Sich über die Anzahl der erstellen Objekte den Kopf zu zerbrechen ist übrigens meist völlig fehl am Platz. Wie oft in der Sekunde wird die Aktion denn aufgerufen, dass sich hier Performanz/Speicher-Probleme einstellen? :D
 
Also ich bin jetzt nicht so mit der GUI-Programmierung vertraut, aber ich meine, dass es beim MouseListenerEvent eine Funktion gibt, die die Anzahl der Klicks zurückliefert... clickCount oder so.
Die könnte man abfragen.

Edit: aso, hab das Zuordnungproblem übersehen. Sorry, da bin ich zu wenig in der Materie. Ist schon Jahre her, als ich meine letzte Oberfläche gebastelt habe :(
 
Zuletzt bearbeitet:
also soares es geht nicht um den speicherplatz sondern darum einen wert zu speichern.
nämlich die anzahl der bierkästen. Sein Problem ist ja das der Listener nicht weiß wie viele kisten vorher gelöscht wurden, also muss das irgendwo festgehalten und für den Listener verfügbar sein. Mach es meientwegen mit nem enum, nichts desto trotzmuss man sich diesen wert so merken das man ran kommt, wenn man die listener nicht zusammen fügt.

das der code gut ist hab ich nie behauptet, sollte nur die funktionsweise eine singletons zeigen., da vom TE offensichtlich nicht ganz verstanden.


die idee mit dem property gefällt mir ganz gut, alternativ könnte man die JTable ja auch um eine eigene funktion erweitern, bzw. das model.

wie ich schon sagte, meine aktive Java zeit liegt weit zurück, fast 4 Jahre, bin da nicht mehr ganz drinne und php ist leider ne ganz andere (schlechtere....) geschichte.
 
Mercsen schrieb:
also soares es geht nicht um den speicherplatz sondern darum einen wert zu speichern.
nämlich die anzahl der bierkästen. Sein Problem ist ja das der Listener nicht weiß wie viele kisten vorher gelöscht wurden, also muss das irgendwo festgehalten und für den Listener verfügbar sein. Mach es meientwegen mit nem enum, nichts desto trotzmuss man sich diesen wert so merken das man ran kommt, wenn man die listener nicht zusammen fügt.

Mein Punkt ist, dass man für das Speichern eben kein Singleton-Objekt verwenden sollte!

Mercsen schrieb:
das der code gut ist hab ich nie behauptet, sollte nur die funktionsweise eine singletons zeigen., da vom TE offensichtlich nicht ganz verstanden.

Dann sollte man das Singleton-Pattern aber auch korrekt vorexerzieren und keinen unnötigen Code einbauen, der zu Irritationen führen kann.
 
Zurück
Oben