Frage zu MVC

Status
Nicht offen für weitere Antworten.

metalfan

Aktives Mitglied
Code:
package test.controll;

public interface WindControllable 
{
		public void changeSpeed();
		public void changeDirection();
}


package test.controll;

import java.util.Observable;

import test.model.Direction;
import test.model.Wind;
import test.view.WindViewer;


public class WindController extends Observable implements WindControllable 
{
		private Wind wind; // Das Datenobjekt

		public WindController() 
		{
			
				// Konstruktor der Klasse WindViewer mit dem Parameter this (diese Instanz) aufrufen
				WindViewer viewer = new WindViewer(this);
				// Dem Viewer die änderungen weiterleiten
				addObserver(viewer);

				// ein neues Datenobjekt erstellen
				wind = new Wind();
		}

		public void changeDirection() 
		{
				// Array (dir) des Typs Direction, wird mit den Werten North, East, South, West über Direction(enum).values(); gefüllt 
				Direction[] dir = Direction.values();
				
				/*
				for (int n=0;n < dir.length; n++)
				{
					System.out.println(dir[n]);
				}
				*/
				
				// Erzeugt eine zahl zwischen +0.0 und +1.0, 
				// nimmt sie mal 4 und wandelt sie in ein int (Nachkommastelle wird abgeschnitten)
				// danach enthält (int) 1,2,3 oder 4, es wird also nur ein Parameter übergeben
				wind.setDir(dir[(int) (Math.random() * 4)]);

				// Änderungen weitergeben
				setChanged();
				notifyObservers(wind);
		}

		public void changeSpeed() 
		{
				//    wird aufgerufen, wenn in der View ein Button gedrückt wird
				wind.setSpeed((int) (Math.random() * 100));
				//    Änderungen weitergeben
				setChanged();
				notifyObservers(wind);
		}
		
		// Das Hauptprogramm
		public static void main(String[] args) 
		{
				new WindController();
		}
}


-----------------------------------------------------------------------------------------------------------------------------
package test.model;

public enum Direction {
   NORTH, EAST, SOUTH, WEST
}
^-------------------------------------------------------------------------------Wird nicht benutzt fürs speed Label

package test.model;


public class Wind 
{
		private Direction dir = Direction.NORTH;
		
		private int speed = 0;
	
		public Direction getDir() 
		{
				return dir;
		}

		public void setDir(Direction dir) 
		{
				this.dir = dir;
		}

		public int getSpeed() 
		{
				return speed;
		}

		public void setSpeed(int speed) 
		{
				this.speed = speed;
		}

		
}


package test.view;

import test.view.BitmapComponent;
//import WindowClosingAdapter;

//import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import test.controll.WindControllable;
import test.model.Wind;


public class WindViewer extends JFrame implements Observer {

		//private static final long serialVersionUID = 1L;

		// Referenz auf den Controller
		private WindControllable controller;

		// Label zur Anzeige von direction und speed 
		private JLabel direction;

		private JLabel speed;

		
		// INIT Methode
		public WindViewer(WindControllable controller) 
		{
				// Fensterüberschrift setzen
				super("WindowController");

				// Referenz auf den Controller in einer Klasseneigenschaft speichern
				this.controller = controller;

				// Fenster beim X -Klick schießen
				setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

				// eigene INIT Methode aufrufen
				init();

				// pack();
                
				//Fenster Grösse Festlegen
				//setSize(500,100);
				setSize(700,500);
				// Fenster anzeigen
				centerScreen();
				setVisible(true);
				
		}	


		private void init()
		{
			GridBagLayout gbl = new GridBagLayout();
	        GridBagConstraints gbc;
	        setLayout(gbl);
	        
	       
	        
	        JPanel namePanel = new JPanel();
	        
	        JButton button1 = new JButton("Gesamte Datenbank");
	        namePanel.add(button1);
	        
	        JButton button2 = new JButton("CD/DVD");
	        namePanel.add(button2);
	        
	        JButton button3 = new JButton("Artikel");
	        namePanel.add(button3);
	        
	        JButton button4 = new JButton("Autor");
	        namePanel.add(button4);
	        
	        JButton button5 = new JButton("ISBN(Bücher)");
	        namePanel.add(button5);
	        
	    
	        gbc = makegbc(0, 1, 1, 1);
	        gbc.weightx = 0;
	        gbc.weighty = 0;
	        gbc.fill = GridBagConstraints.NONE;
	        gbl.setConstraints(namePanel, gbc);
	        add(namePanel);
	        
	        JPanel searchPanel = new JPanel();
	        
	        
	        JTextField textfield1 = new JTextField(15);
	        searchPanel.add(textfield1);
	        //meintextfield =new JTextField(15);
	        //searchPanel.add(meintextfield);
	        
	        JButton button6 = new JButton("Suchen");
	    	
	        button6.addActionListener(new ActionListener() 
					{
							public void actionPerformed(ActionEvent event) 
							{
									controller.changeSpeed();
							}	
					});
	        
	        searchPanel.add(button6);
	        
	        gbc = makegbc(0, 2, 1, 1);
	        gbc.weightx = 0;
	        gbc.weighty = 0;
	        gbc.fill = GridBagConstraints.NONE;
	        gbl.setConstraints(searchPanel, gbc);
	        add(searchPanel);
	        
	        BitmapComponent bitmap1 = new BitmapComponent("/home/metalfan/google.gif");
	        
	        gbc = makegbc(0, 0, 1, 1);
	        gbc.weightx = 0;
	        gbc.weighty = 0;
	        gbc.fill = GridBagConstraints.NONE;
	        gbl.setConstraints(bitmap1, gbc);
	        add(bitmap1);

	        speed = new JLabel("");
	        gbc = makegbc(0, 3, 1, 1);
	        gbc.weightx = 30;
	        gbc.weighty = 15;
	        gbc.fill = GridBagConstraints.NONE;
	        gbl.setConstraints(speed, gbc);
	        add(speed);
		}
   
		// diese Methode wird vom Controller aufgerufen, damit
		// die GUI aktualisiert werden kann
		public void update(Observable arg0, Object arg1) 
		{
				Wind wind = (Wind) arg1;
				direction.setText(wind.getDir().toString());
				speed.setText(String.valueOf(wind.getSpeed()));
		}
		// Erweiterung: Fensterposition auf Festplatte/AD speichern, neustart der App an gewohntem Platz
		
		// Hinzugefügt, wiederspricht dem MVC Modell?
		public void centerScreen() 
		{
				Dimension dim = getToolkit().getScreenSize();
				Rectangle abounds = getBounds();
				setLocation((dim.width - abounds.width) / 2,(dim.height - abounds.height) / 2);
				super.setVisible(true);
				requestFocus();
		}

		 private GridBagConstraints makegbc(int x, int y, int width, int height)
		    {
		         GridBagConstraints gbc = new GridBagConstraints();
		         gbc.gridx = x;
		         gbc.gridy = y;
		         gbc.gridwidth = width;
		         gbc.gridheight = height;
		         gbc.insets = new Insets(1, 1, 1, 1);
		         return gbc;
		    }

}


Oben stehende Code ist das MVC Beispiel von dbac, habe jetzt ein Gridbaglayout hinzugefügt und wollte darauf ein Label ändern, Fehlermeldung:


Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at test.view.WindViewer.update(WindViewer.java:202)
at java.util.Observable.notifyObservers(Unknown Source)
at test.controll.WindController.changeSpeed(WindController.java:55)
at test.view.WindViewer$1.actionPerformed(WindViewer.java:158)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)


Liegt es am Zusammebspiel mit dem Gridbaglayout?

Julius
 

Illuvatar

Top Contributor
Du willst den Text von JLabel direction ändern, aber du initialisierst das nirgendwo. Deshalb ist direction null, und wenn du da eine Methode aufrufen willst, gibts ne NullPointerException ;)
 

metalfan

Aktives Mitglied
Ah falscher Fehler....
wollte das speed Objekt über den Button benutzen, hab jetzt direction.set in WindViewer ausdokumentiert....
die Zahl ändert sich jetzt, muss das erstmal nachvollziehen was da jetzt passiert

Julius
 

metalfan

Aktives Mitglied
Ok, //direction.setText(wind.getDir().toString()); das wars. Der Rest stimmte :)

Nun habe ich mein Textfield und will den Text auslesen und wiedergeben, das "mini" Beispiel wurde schon hier im Forum zusammengeflickt. Danke nochmal.

Wie sieht nun die richtige Aufteilung anhand des MVC Patterns aus?

View
Klasse Windviewer
erstellung des TextFields, hinzufügen des ActionListeners, zum Frame hinzufügen:

Code:
meintextfield =new JTextField(15);
	    meintextfield.addActionListener(new ActionListener() 
	        {
	        		public void actionPerformed(ActionEvent event)
	        		{
	        				controller.changeText();
	        		}
	        });
	        searchPanel.add(meintextfield);

Controller
Interface WindControllable erweitern:

Code:
public interface WindControllable 
{
	...
		public void changeText();


}


Controller
Klasse WindController (implementiert WindControllable)

Code:
		public void changeText()
		{
				// Wie bekommt man hier Zugriff auf den Inhalt des JTextFields das in der Klasse WindViewer (View) erstellt wurde? Die Aufgabe des Auslesens gehört zum Controller, richtig?

                                wind.setTexteingabe(meintextfield.getActionCommand());   // <- so funktionierts nicht

				setChanged();
				notifyObservers(wind);
		}
Model
Klasse Wind

Set/Get Methoden für changeText() hinzufügen

Code:
public class Wind 
{
...
		private String text;
...		
	public String getTexteingabe()
		{
				return text;
		}
		
		public void setTexteingabe(String text)
		{
				this.text=text;
		}
}

Julius
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Swing Frage zu jDialog AWT, Swing, JavaFX & SWT 7
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
MJannek 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
B SWT Frage zu MVC und Data-Binding AWT, Swing, JavaFX & SWT 8
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

Ähnliche Java Themen

Neue Themen


Oben