Klassenübergreifende Methode

TS-JC

Erfahrenes Mitglied
Hallo


so, nun hab ich mal eine dumme Frage, dessen Antwort ich wissen müsste, aber ich nicht finde :(

Folgendes Szenario:

Ich habe ein Hauptklasse mit Oberfläche.
Dort drin steckt ein Button und Textfeld.
Drücke ich auf den Button wird der Text aus dem Textfeld genommen und in einem Array gesucht.
Ein Listenfeld wird dabei gelöscht und alle Suchergebnisse dort reingepackt.

Die Methode zum Suchen steckt allerdings in einer 2. Klasse.
Das Suchen und finden klappt auch.
Das über einen Iterator wo das Array nach und nach durchgegangen wird.
Wird nun was gefunden, so soll es in das Listenfeld rein.

Das klappt aber nicht, weil die Liste ja in der Hauptklasse angelegt wurde und ich die Methode zum hinzufügen (liste.addElement()) nur dort ausfähren kann.

Wie kann ich dies nun von der 2. Klasse aus machen?

Ich hoffe es ist zu verstehen wie alles aufgebaut ist bei mir :D
thx4help
 
Ich weiss jetzt nicht wie deine Klassenhierachie genau aussieht. Aber vielleicht hilft dir
das eine Idee zu geben wie du die Verbindung schaffen kannst.

Java:
public class UIModel {

	public String[] filterArray() {
		System.out.println("jaaa");
		return new String[0];
	}
}

Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;


public class UIControler {

	protected UIModel model;

	private ActionListener button1Listener;
	
        private String[] initData = new String[] {"eins","zwei"};

       protected JList dataList = new JList(initData);

        private ActionListener button1Listener = new ActionListener() {
		
		public void actionPerformed(ActionEvent e) {
			//mach was mit
		    String[] newdata = model.filterArray();
		    
		}
		
	};	

	public UIControler() {
		model = new UIModel();
		 
		
	}
	
	public static void main(String[] args) {
		UIControler c = new UIControler();
		c.initUI();
	}

	private void initUI() {
		JFrame f = new JFrame();
		f.setSize(new Dimension(300,300));
		f.setLayout(new BorderLayout());
		JButton klickMich = new JButton();
		klickMich.setText("jaaa");
		f.getContentPane().add(klickMich,BorderLayout.CENTER);
		klickMich.addActionListener(button1Listener);
		....
	}
}

nun kannst du in dem Listener ohne probleme auf deine JList zugreifen. ABER:
Schöner ist es wenn du dir folgende Klassen anschaust:

- ListModel
- ListDataListener

Das geht zwar etwas weiter aber so hast du die Möglichkeit das sehr elegant zu lösen.
 
Ok ich habe die Situation wohl doch nicht richtig beschrieben.

Also ich habe eine Frame Klasse mit Oberfläche.
Dann habe ich eine 2. Klasse die als Model agiert und in der eine ArrayList und die Befehle zum steuern (z.B. die Suche) enthalten sind.

In der FrameKlasse wird nun die 2. Klasse eingebunden:
private ModelKlasse meinModel;

Nun wird später gesucht:
meinModel.suchen();

Diese Methode befindet sich also in der ModelKlasse.
In dieser Methode gehe ich nun das Array Stück für Stück durch und überprüfe ob die Suche erfolgreich ist.
Ist sie dies, so soll in deine JList (die sich in der FrameKlasse befindet) ein neuer Eintrag erscheinen, nämlich das Suchergebnis.

Nun könnte ich das Ganze lösen indem ich die Suche einfach in die FrameKlasse schreibe, aber das will ich ja nicht.

Ich hoffe es ist jetzt verständlicher :)
Mit deiner Lösung kann ich leider gar nichts anfangen, ich glaube du hast mich falsch verstanden.
 
TS-JC hat gesagt.:
Mit deiner Lösung kann ich leider gar nichts anfangen, ich glaube du hast mich falsch verstanden.

Ich habe dich schon richtig verstanden. Und meine Lösung ist auch ein Ansatz wie du ihn brauchst um das zu realisieren.

Es geht darum das du dein Klassendesign darauf aufbaust das ein Controller zugriff auf deine Swing Controlls hat und auf das Model (die Daten).
Das nennt sich MVC und wenn du deine Klassen so miteinander verbindest wie ich dir das aufgezeigt habe dann ist das was du vorhast problemlos möglich.
 
Hmm

Also eigentlich ist das Ganze schon auf MVC gestaltet.
Verstehe den Krams zwar nicht komplett, aber zumindest in Grundzügen *g*

Die 2. Klasse ist ja das Model in diesem Fall.
Und die erste eben der View in die das Model eingebunden wird.
Der Controller (hab hier nen Beispielprogramm) wird hierbei allerdings nur zum Speichern und Öffnen von Dateien genutzt und hat mit meinem Problem erstmal nix zu tun.

Die Methoden um mit dem Model zu arbeiten liegen ja alle in der Modelklasse.
Deshalb wollte ich die Suche da ebenfalls mit reinnehmen.

Ich habe mir dein Beispiel nochmal angeguckt und glaube es nun in etwa verstanden zu haben.
Auf dein Beispiel bezogen:
Was ich brauche ist der Aufruf der Methode initUI() in der Methode filterArray().

Also die Klasse soll in etwa so aussehen:

Java:
public class UIModel {
public String[] filterArray() {        
initUI();
return new String[0];    
}}

Also quasi zuerst der Aufruf vom Controller bzw View des Models und dann vom Model wieder zurück.
Und das soll in eine Schleife. Also öfters initUI() aufrufen quasi.

Ja ich weiss alles kompliziert und ich kanns wohl net so erklären wie es wirklich ist :(
 
Zuletzt bearbeitet:
Nein bitte nicht initUI beim buttonclick aufrufen.

Init Methoden sollten eigentlich wie der name verrät nur 1 mal aufgerufen werden, und danach nie wieder ;)

Java:
public void actionPerformed(ActionEvent e) {
}

Ist der richtige Platz wo du deine Componente füllst. Denn in der Methode hast du
a) zugriff auf: protected JList dataList = new JList(initData);
b) zugriff auf: protected UIModel model;

Da du nun zugriff auf dein Model hast und zugriff auf deine JList kannst du diese wunderbar befüllen.
Und deshalb macht nicht das Model das Befüllen deiner JList sondern besser der Controller.

Aber hast du meinen Ratschlag befolgt und dir:

- ListModel
- ListDataListener

angeschaut?

Wenn nein! Dann solltest das noch tun. Denn das gibt dir die Möglichkeit das noch besserm zu verknüpfen.
 
Habe mir die Dinger angeguckt, das sind ja Interfaces.
Sehe da nur nicht den Zusammenhang wie ich die einsetzen könnte.

Das mit dem initUI war nur als Beispiel gedacht :)
Nehmen wir an in der Klasse UIControler ist die Liste drin.
Und in der Methode actionPerformed() wird dann die Methode suche() in der Klasse UIModel aufgerufen.
Diese Methode enthält eine Schleife die bei jedem Durchlauf was in die Liste schreiben soll.

Ich denke so ist es am besten auf dein Beispiel übertragen.
Jetzt wäre eine Möglichkeit diese Methode suche() einfach in actionPerfomerd zu schreiben, aber ich wollte sie halt in der ModelKlasse haben.

Ich glaub wir reden die ganze Zeit aneinander vorbei. *g*
Vielleicht hast du mich diesmal verstanden, sonst ist es egal, wir haben jetzt eine andere Lösung gefunden, aber so wäre es hier schöner gelöst finde ich.

Vielen Dank jedenfalls für die Lösungsansätze. Ich gucks mir nochmal alles an, vielleicht finde ich ja doch einen Weg.
 
TS-JC hat gesagt.:
Habe mir die Dinger angeguckt, das sind ja Interfaces.
Sehe da nur nicht den Zusammenhang wie ich die einsetzen könnte.

Dein JListModel bekommst du durch
http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JList.html#getModel()

Wie du den einsetzt siehst du hier:
http://java.sun.com/docs/books/tutorial/uiswing/events/listdatalistener.html

Das mit dem initUI war nur als Beispiel gedacht :)

ein schlechtes Beispiel ;)

Nehmen wir an in der Klasse UIControler ist die Liste drin.
Und in der Methode actionPerformed() wird dann die Methode suche() in der Klasse UIModel aufgerufen.
Diese Methode enthält eine Schleife die bei jedem Durchlauf was in die Liste schreiben soll.



Ich denke so ist es am besten auf dein Beispiel übertragen.
Jetzt wäre eine Möglichkeit diese Methode suche() einfach in actionPerfomerd zu schreiben, aber ich wollte sie halt in der ModelKlasse haben.

Ich glaub wir reden die ganze Zeit aneinander vorbei. *g*
Vielleicht hast du mich diesmal verstanden, sonst ist es egal, wir haben jetzt eine andere Lösung gefunden, aber so wäre es hier schöner gelöst finde ich.

Wir reden nicht an einander vorbei. Ich weiss genau was du willst, und der Code oben zeigt dir ganz genau wie du da dran kommst.
 
Zurück