SWT Frage zu MVC und Data-Binding

babuschka

Top Contributor
Hallo Leute,

das lest ihr sicher häufig: ich bin blutiger Anfänger in Sachen Java + SWT + JFace. Und das soll sich natürlich ändern ;)

Zunächst einmal was ich überhaupt vorhabe:
Der Nutzer kann über einen Spinner eine Zahl bestimmen, welche dann rechts daneben in einem Label angezeigt wird. Also wirklich nichts Spektakuläres :oops:
Vorweg bevor ich noch Leute verschrecke: es funktioniert bereits ;)

Mein Code sieht folgendermaßen aus:
Die Gui:
Java:
package view;
/**
 * @author M
 * @date 05 August 2010 
 */

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import model.Person;

import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.beans.BeansObservables;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Monitor;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.SWT;

/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit [url=http://www.cloudgarden.com]Cloud Garden (Java Resources)[/url] for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
public class Gui extends org.eclipse.swt.widgets.Composite {
	private Label label1;
	
	private Person person = new Person();;
	private Spinner spinner1;

	/**
	* Auto-generated main method to display this 
	* org.eclipse.swt.widgets.Composite inside a new Shell.
	*/
	public static void main(String[] args) {
		showGUI();
	}
	
	/**
	* Overriding checkSubclass allows this class to extend org.eclipse.swt.widgets.Composite
	*/	
	protected void checkSubclass() {
	}
	
	/**
	* Auto-generated method to display this 
	* org.eclipse.swt.widgets.Composite inside a new Shell.
	*/
	public static void showGUI() {
		Display display = Display.getDefault();
		Shell shell = new Shell(display);
		Gui inst = new Gui(shell, SWT.NULL);
		Point size = inst.getSize();
		shell.setLayout(new FillLayout());
		shell.layout();

		//sets windows title
		shell.setText("MVC Test");
		//sets minimum windows size
		shell.setMinimumSize(152, 65);
		
		if(size.x == 0 && size.y == 0) {
			inst.pack();
			shell.pack();
		} else {
			Rectangle shellBounds = shell.computeTrim(0, 0, size.x, size.y);
			shell.setSize(shellBounds.width, shellBounds.height);
		}
		
		// opens new centered windows
		Monitor primary = display.getPrimaryMonitor();
		Rectangle bounds = primary.getBounds();
		Rectangle rect = shell.getBounds();
		int x = bounds.x + (bounds.width - rect.width) / 2;
		int y = bounds.y + (bounds.height - rect.height) / 2;
		shell.setLocation (x, y);
		
		shell.open();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
	}

	public Gui(org.eclipse.swt.widgets.Composite parent, int style) {
		super(parent, style);
		initGUI();
		
		createBindings();
		createModelListener();
	}

	private void initGUI() {
		try {
			FormLayout thisLayout = new FormLayout();
			this.setLayout(thisLayout);
			{
				label1 = new Label(this, SWT.NONE);
				FormData label1LData = new FormData();
				label1LData.left =  new FormAttachment(0, 1000, 85);
				label1LData.top =  new FormAttachment(0, 1000, 6);
				label1LData.width = 50;
				label1LData.height = 20;
				label1.setLayoutData(label1LData);
				label1.setText("Alter");
			}
			{
				spinner1 = new Spinner (this, SWT.BORDER);
				spinner1.setMinimum(0);
				spinner1.setMaximum(80);
				spinner1.setSelection(20);
				spinner1.setIncrement(1);
				
				FormData spinner1Data = new FormData();
				spinner1Data.left =  new FormAttachment(0, 1000, 0);
				spinner1Data.top =  new FormAttachment(0, 1000, 1);
				spinner1Data.width = 50;
				spinner1Data.height = 20;
				
				spinner1.setLayoutData(spinner1Data);
				spinner1.pack();

			}
			this.layout();
			pack();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private void createBindings() {

		Realm.runWithDefault(SWTObservables.getRealm(Display.getCurrent()), new Runnable() {
			public void run() {
				DataBindingContext dbc = new DataBindingContext();
				dbc.bindValue(
						SWTObservables.observeSelection(spinner1),
						BeansObservables.observeValue(person, Person.PROPERTY_AGE),
						null,
						null
				);
				
				// converter from String to Int needed
				dbc.bindValue(SWTObservables.observeText(label1), BeansObservables.observeValue(person, Person.PROPERTY_AGE),
					    new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE), null);
			}
		});
	}
	
	private void createModelListener() {
		person.addPropertyChangeListener(new PropertyChangeListener() {		
			@Override
			public void propertyChange(PropertyChangeEvent evt) {
				System.out.println("Modell\u00e4nderung: " + evt.getPropertyName() + " = " + evt.getNewValue());
			}
		});
	}
}
Es wurde Jigloo genutzt.

Die Geschäftslogik:

Java:
package model;
/**
 * @author M
 * @date 05 August 2010 
 */

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

public class Person {
	/* age of a person */
	private int age;
	
	/* property names */
	public static final String PROPERTY_AGE = "age";
	
	/* list of observers */
	private PropertyChangeSupport support = new PropertyChangeSupport(this);
		
	/**
	 * returns the age of a person 
	 * @return age	age of a person
	 */
	public int getAge() {
		return age;
	}

	/**
	 * sets the age of a person and informs the listeners
	 * @param age 	age of person
	 */
	public void setAge(int age) {
		support.firePropertyChange("age", this.age, this.age = age);
	}

	/**
	 * standard constructor for java-beans specification
	 */
	public Person() {
	}
	
	/**
	 * adds <code>PropertyChangeListener</code> for all attributes 
	 * @param listener
	 */
	public void addPropertyChangeListener( PropertyChangeListener listener ) {
		support.addPropertyChangeListener(listener);
	}
	
	/**
	 * adds <code>PropertyChangeListener</code> for only one attribute
	 * @param propertyName
	 * @param listener
	 */
	public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
		support.addPropertyChangeListener(propertyName, listener);
	}
	
	/**
	 * removes <code>PropertyChangeListener</code> for all attributes
	 * @param listener
	 */
	public void removePropertyChangeListener(PropertyChangeListener listener) {
		support.removePropertyChangeListener(listener);
	}
	
	/**
	 * removes <code>PropertyChangeListener</code> for only one attribute
	 * @param propertyName
	 * @param listener
	 */
	public void removePropertyChangeListener(String propertyName,PropertyChangeListener listener) {
		support.removePropertyChangeListener(propertyName, listener);
	}
}

Wie gesagat, das Ganze funktioniert bereits.

Nun finde ich es allerdings komisch, dass mein Controller bereits in der Gui integriert ist.

Ich möchte eine klare Trennung zwischen Code und Gui erreichen. Am liebsten hätte ich den Controller in einer extra Klasse - ist das zu empfehlen? Wie stelle ich das am Dümmsten an?
Welche Strategie wendet ihr an?


Danke schon im Voraus!


MfG

mateit
 

donnac

Mitglied
Hi,
hast du schon eine Lösung gefunden? Ich beschäftige mich aktuell mit ähnlichem und frage mich z.B., wo man am besten eine erste Datenvalidierung, und wo z.B. die Datenbindung positionieren sollte. Datenvalidierung geht vielleicht noch im View, aber gehört das Binding wirklich auch dazu?!
 

donnac

Mitglied
Danke für die Antwort, habe sie leider erst jetzt gesehen. :(
Ich mache es mir vermutlich zu komplex, möchte allerdings nun ein Model View Presenter Controller verwenden (Aufteilung Presenter vom MVP in viewspezifisch und nichtviewspezifisch). Die Validierung würde ich dann im Presenter machen, wobei die View ihren Presenter jeweils selbst erzeugt. Jetzt muss ich nur noch herausfinden, wie ich in rcp der view zugleich den übergeordneten controller mitgebe (ich benutze einen für mehrere views).
 
G

Gast2

Gast
Danke für die Antwort, habe sie leider erst jetzt gesehen. :(
Ich mache es mir vermutlich zu komplex, möchte allerdings nun ein Model View Presenter Controller verwenden (Aufteilung Presenter vom MVP in viewspezifisch und nichtviewspezifisch). Die Validierung würde ich dann im Presenter machen, wobei die View ihren Presenter jeweils selbst erzeugt. Jetzt muss ich nur noch herausfinden, wie ich in rcp der view zugleich den übergeordneten controller mitgebe (ich benutze einen für mehrere views).

"Model View Presenter Controller" da gibt es net ^^... Entweder MVP oder MVC...
Das Databinding ist indem Tutorial doch beschrieben und für einfache Daten/Eingabe Validierung gibt es in dem Tutorial doch genauso Hinweise.
Das Binding unterstützt doch Validierung Strategien...
 

donnac

Mitglied
"Model View Presenter Controller" da gibt es net ^^... Entweder MVP oder MVC...
Das Databinding ist indem Tutorial doch beschrieben und für einfache Daten/Eingabe Validierung gibt es in dem Tutorial doch genauso Hinweise.
Das Binding unterstützt doch Validierung Strategien...

Doch, das gibts, siehe g**gle, direkt unter den ersten drei Hits ist ein "Paper" von Martin Hunter. Es ist eine Variante von MVP (ich habe ja nicht gesagt, dass es etwas ganz anderes wäre), mit Unterteilung des Presenters in viewspezifisch (Presenter) und nichtview-spezifisch(Controller).
Die Bekanntmachung von Presenter und Controller mache ich inzwischen über eventbasierte Anmeldung "hallo, da bin ich, lass mich an deinen Events teilhaben", funktioniert bisher ganz gut. Der passive View weiß rein gar nichts vom Model und kümmert sich auch sonst um nichts als nur die Anzeige. Ich denke, damit fahre ich ganz gut.:D
 

donnac

Mitglied
Achja: Validierung geschieht im Presenter. Der View sagt nur "es wurde etwas eingegeben", der Presenter generiert dazu eine Decoration.. vermutlich geht's auch anders und eleganter usw. usf., aber mir läuft die Zeit davon und so bin ich schneller, als wenn ich vorher versuche, den Weg der Weisheit zu finden. (soll keine Kritik sein, nur eine Begründung)
 
G

Gast2

Gast
Wie gesagt ich versteh dein Problem nicht der BindingContext ist doch dein Controller der alles regelt wie die Daten in GUI und in Models kommen.

Von dem her weiß ich nicht was du eigentlich vor hast? Der BindingContext gibt dir doch alle Möglichkeiten mit...

In dem oben genannten ist doch ein Tutorial wie du ein IValidator schreibst...
 
Zuletzt bearbeitet von einem Moderator:

donnac

Mitglied
hi,
ich habe vor, ein Frontend für ein Datenstrommanagementsystem zu schreiben. Im Grunde nimmt es Eingaben vom User entgegen (welche Quellen gibt es und wie sollen sie kombiniert werden), parst sie als Anfrage und füttert das dsms damit. Dieses liefert anschließend permanent Ergebnisse, die dann grafisch dargestellt werden sollen.
Was ich mir eigentlich wünsche, ist ein Controller, der vollkommen von der GUI abgeschottet ist, sonst wird das zu chaotisch.
Mein Problem ist, dass meine Javakenntnisse vor zwei Wochen noch gerade soweit gingen, dass ich 'System.out.println()' konnte.. ich habe bisher immer in C, C# programmiert, muss das jetzt allerdings in Java machen.
Die Validierung habe ich erstmal auf Eis gelegt, wenn ich sie einbaue, gucke ich mir das Tutorium nochmal an.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Frage zum Schieberegler JSlider AWT, Swing, JavaFX & SWT 5
thor_norsk Java - Allgemeine - Frage AWT, Swing, JavaFX & SWT 14
thor_norsk Allgemeine Frage AWT, Swing, JavaFX & SWT 10
M Frage zu Java Bundesligaverwaltung AWT, Swing, JavaFX & SWT 7
thor_norsk Allgemeine Frage AWT, Swing, JavaFX & SWT 9
E Frage zum Textfeld AWT, Swing, JavaFX & SWT 8
H Swing JMenu aufgeklappt oder nicht - Wie frage ich das ab? AWT, Swing, JavaFX & SWT 5
pkm Frage wegen java.lang.IllegalStateException bei DocumentListener AWT, Swing, JavaFX & SWT 4
D Frage zu ActionListenern und AvtionEvents AWT, Swing, JavaFX & SWT 2
ralfb1105 JavaFX Daten zwischen Controllern austauschen- neue Frage AWT, Swing, JavaFX & SWT 7
F JavaFX Frage zum Logging AWT, Swing, JavaFX & SWT 6
E Prinzip: wie man Ereignisse in einer GUI verarbeit. Frage zum Design? AWT, Swing, JavaFX & SWT 10
ralfb1105 Swing Frage zu SwingWorker Verhalten bei cancel() AWT, Swing, JavaFX & SWT 2
J Frage zu setuserdata AWT, Swing, JavaFX & SWT 1
N Frage zu ListView AWT, Swing, JavaFX & SWT 11
L 2D-Grafik Frage zu Ellipse2D.Double, Abfrage, ob Punkt enthalten ist funktioniert nicht AWT, Swing, JavaFX & SWT 3
T Frage zu GUI - Button soll Objekt erfassen AWT, Swing, JavaFX & SWT 2
J Event Handling Frage zu der Funktion addActionListener AWT, Swing, JavaFX & SWT 2
J Frage zur objektorentierten Swing Programmierung AWT, Swing, JavaFX & SWT 10
T JavaFX Frage zum FX-Loader AWT, Swing, JavaFX & SWT 3
B drawRect Frage und Aufgabenstellung AWT, Swing, JavaFX & SWT 10
fLooojava GridLayout - Frage bezüglich Kachelgröße AWT, Swing, JavaFX & SWT 5
S Frage zu java.awt.EventQueue AWT, Swing, JavaFX & SWT 1
J Frage zu Java Projekt [2D Game] AWT, Swing, JavaFX & SWT 3
M Swing Grundlegende Frage zu SWING mit WindowBuilder AWT, Swing, JavaFX & SWT 11
M Frage zum Loggen von Fehlern AWT, Swing, JavaFX & SWT 3
T Swing API Frage zu Verzeichnisbäumen und JTree AWT, Swing, JavaFX & SWT 1
M Thread-Frage in SWT AWT, Swing, JavaFX & SWT 1
Q Cursor Frage AWT, Swing, JavaFX & SWT 8
W JavaFX TableView frage AWT, Swing, JavaFX & SWT 5
H Taschenrechnerprojekt in Javafx - Frage zu den Buttons in FXML AWT, Swing, JavaFX & SWT 1
I Grundsätzliche Frage zu ItemListener AWT, Swing, JavaFX & SWT 11
X Kurze Frage zu JPopup AWT, Swing, JavaFX & SWT 3
D Swing [Frage] ComboBox + Label AWT, Swing, JavaFX & SWT 3
D Frage zu JFrame und Graphics AWT, Swing, JavaFX & SWT 4
J Swing Frage zur Vorgehensweise (JTable?, JLabels?) AWT, Swing, JavaFX & SWT 8
S Frage zu Jtable / CellEditor AWT, Swing, JavaFX & SWT 1
kaoZ Frage zum einfügen von Componenten AWT, Swing, JavaFX & SWT 14
N Swing JTable anfänger frage AWT, Swing, JavaFX & SWT 2
S GridBagLayout-Frage AWT, Swing, JavaFX & SWT 1
V 2D-Grafik Frage zum Graphics Objekt AWT, Swing, JavaFX & SWT 2
F Swing JComboBox - Frage zur Größe AWT, Swing, JavaFX & SWT 11
G noch eine Frage zum EventDispachThread AWT, Swing, JavaFX & SWT 4
D MVC Frage AWT, Swing, JavaFX & SWT 6
Z Flackern trotz Offscreen Image / Doublebuffer, (+ Frage zu Pixelvergleich) AWT, Swing, JavaFX & SWT 25
GianaSisters 2D-Grafik BufferedImage.getSubimage - Frage AWT, Swing, JavaFX & SWT 7
M Frage zu KeyListener bzgl. JApplet AWT, Swing, JavaFX & SWT 3
M Frage zu Threads AWT, Swing, JavaFX & SWT 3
N Swing JComboBox Frage AWT, Swing, JavaFX & SWT 5
Luk10 g.drawString funktioniert nicht + Frage zur Text-Rendering Qualität AWT, Swing, JavaFX & SWT 7
Luk10 Frage zu Farb-Komposition AWT, Swing, JavaFX & SWT 9
K Gui Layout Frage AWT, Swing, JavaFX & SWT 5
V SWT Import Wizard - frage zur WizardPage AWT, Swing, JavaFX & SWT 5
N Swing Frage JXMapviewer AWT, Swing, JavaFX & SWT 4
GUI-Programmer Wieder ne Layout Frage AWT, Swing, JavaFX & SWT 11
GUI-Programmer LayoutManager Kurze Layout Frage - eine komponente mittig? AWT, Swing, JavaFX & SWT 5
lumo SWT Zeichnen bescheunigen bzw eine allg. Frage AWT, Swing, JavaFX & SWT 8
H Frage zu übergebenem Vector bzw. Boolean AWT, Swing, JavaFX & SWT 3
C 2D-Grafik BufferedImage laden, Frage zum Code AWT, Swing, JavaFX & SWT 2
VfL_Freak Swing Frage zu "new JPasswordField( 10 )" AWT, Swing, JavaFX & SWT 6
H Frage zu WindowBuilder Pro AWT, Swing, JavaFX & SWT 3
C Frage/Problem mit Jpanel AWT, Swing, JavaFX & SWT 4
S Frage zu TextArea AWT, Swing, JavaFX & SWT 2
GUI-Programmer Zeichnen in Swing - Frage AWT, Swing, JavaFX & SWT 6
Luk10 Frage zu Mouseevents AWT, Swing, JavaFX & SWT 7
J Refreshing Swing Frage AWT, Swing, JavaFX & SWT 10
F Frage zu Event KeyTyped bei jPanel AWT, Swing, JavaFX & SWT 4
A Frage zu StringBuilder AWT, Swing, JavaFX & SWT 2
S allg. Frage zur GUI-Architektur AWT, Swing, JavaFX & SWT 5
A Frage zu JDialog AWT, Swing, JavaFX & SWT 3
A Frage zur Methode matches() AWT, Swing, JavaFX & SWT 2
P LayoutManager Verständnis-Frage GridBagLayout AWT, Swing, JavaFX & SWT 7
H Allgemeine Frage zu Grafikfähigkeiten von Java AWT, Swing, JavaFX & SWT 24
D Repaint Frage, Design Frage AWT, Swing, JavaFX & SWT 2
Jats Frage zu JLabel & JTextField AWT, Swing, JavaFX & SWT 4
Y frage zu BufferedImage AWT, Swing, JavaFX & SWT 7
hdi Swing Frage zu invokeAndWait() Exceptions AWT, Swing, JavaFX & SWT 8
P Swing Frage zu paintComponent/getGraphics AWT, Swing, JavaFX & SWT 4
M Frage nach Swing Element AWT, Swing, JavaFX & SWT 3
S Frage zu Graphics2D AWT, Swing, JavaFX & SWT 3
T AWT Frage zu AWT AWT, Swing, JavaFX & SWT 5
B Frage zu Swing,Threads, SwingWorker und Socket Communikation AWT, Swing, JavaFX & SWT 4
F unspezifizierte Frage zu JTable/ Model AWT, Swing, JavaFX & SWT 6
T LookAndFeel Look and Feel Frage AWT, Swing, JavaFX & SWT 2
J Java2D Kreis/Kurven Frage AWT, Swing, JavaFX & SWT 2
P Kurze Frage zur Gestaltung eines vertikalen Menüs AWT, Swing, JavaFX & SWT 2
Dit_ Frage zum Thema SwingUtilities.invokeLater AWT, Swing, JavaFX & SWT 5
Eldorado Frage zur Anwendung des MVC-Konzept AWT, Swing, JavaFX & SWT 33
G Frage zu processMouseEvent AWT, Swing, JavaFX & SWT 6
M Zoomen in ein JPanel... und eine andere kleine Frage AWT, Swing, JavaFX & SWT 3
D Swing implementierungs-technische Frage zu JList/AbstractListModel AWT, Swing, JavaFX & SWT 7
C Event Frage AWT, Swing, JavaFX & SWT 7
A Frage zu GridLayout AWT, Swing, JavaFX & SWT 4
F Frage zu WindowListeners AWT, Swing, JavaFX & SWT 2
E einfache Frage:warum ist Hintergrund grau ? AWT, Swing, JavaFX & SWT 24
E einfache Frage zu paintComponent und Graphics AWT, Swing, JavaFX & SWT 7
C Frage zu ActionListenern AWT, Swing, JavaFX & SWT 7
D Frage @ someActionEvent.getActionCommand() AWT, Swing, JavaFX & SWT 2
Kr0e Allgemeine Frage zu Java2D (Eigene Impl.) AWT, Swing, JavaFX & SWT 18
L Einfache Layout Frage für Applet -> Was mache ich bloss falsch? AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben