[SOLVED]MVC Beispiel von dbac

Status
Nicht offen für weitere Antworten.

metalfan

Aktives Mitglied
Hi,

bekomme das MVC Beispiel einfach nicht zum laufen, benutze eclipse 3.1.1 mit java 1.5, enum erkennt er.
Habe die importe ergänzt sowie ein Panel im WindViewer erzeugt, das Programm startet zeigt aber nur 2 Knöpfe mit den Aufschriften: Change Direction, Change Speed
Was übersehe ich?

Die Fehlermeldung nach dem betätigen von Change Direction:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at test.view.WindViewer.update(WindViewer.java:68)
at java.util.Observable.notifyObservers(Unknown Source)
at test.controll.WindController.changeDirection(WindController.java:30)
at test.view.WindViewer$1.actionPerformed(WindViewer.java:46)
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)

Die Fehlermeldung nach dem betätigen von Change Speed:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at test.view.WindViewer.update(WindViewer.java:68)
at java.util.Observable.notifyObservers(Unknown Source)
at test.controll.WindController.changeSpeed(WindController.java:36)
at test.view.WindViewer$2.actionPerformed(WindViewer.java:54)
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)


Code:
package test.controll;

/**
* @author deathbyaclown
*/
public interface WindControllable {
   public void changeSpeed();
   public void changeDirection();
}




package test.controll;

import test.model.*;
import test.view.*;
import java.util.*;

/**
* @author deathbyaclown
*/
public class WindController extends Observable implements WindControllable {
   private Wind wind;

   public WindController() {
      WindViewer viewer = new WindViewer( this );
      addObserver( viewer );
      wind = new Wind();
   }

   public void changeDirection() {
      Direction[] dir = Direction.values();
      wind.setDir( dir[ ( int ) ( Math.random() * 4 ) ] );
      setChanged();
      notifyObservers( wind );
   }

   public void changeSpeed() {
      wind.setSpeed( ( int ) ( Math.random() * 100 ) );
      setChanged();
      notifyObservers( wind );
   }

   public static void main(String[] args) {
      new WindController();
   }
}



package test.model;

/**
* @author deathbyaclown
*/
public enum Direction {
   NORTH, EAST, SOUTH, WEST
}



package test.model;

/**
* @author deathbyaclown
*/
public class Wind {
   private Direction dir = Direction.NORTH;
   private int speed = 0;
   
   /**
    * @return Returns the dir.
    */
   public Direction getDir() {
      return dir;
   }

   /**
    * @param dir The dir to set.
    */
   public void setDir(Direction dir) {
      this.dir = dir;
   }

   /**
    * @return Returns the speed.
    */
   public int getSpeed() {
      return speed;
   }

   /**
    * @param speed The speed to set.
    */
   public void setSpeed(int speed) {
      this.speed = speed;
   }
}



package test.view;

import test.model.*;
import test.controll.*;

import javax.swing.*;

import java.awt.*;
import java.awt.event.*;
import java.util.*;


/**
* @author deathbyaclown
*/
public class WindViewer extends JFrame implements Observer {
   private WindControllable controller;
   private JLabel direction;
   private JLabel speed;

   public WindViewer( WindControllable controller ) {
      super( "WindoController" );
      this.controller = controller;
      setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
      init();
      pack();
      setVisible( true );
   }

   private void init() {
      // code für die elemente wurde weggelassen
	   //Panel erstellen
	   JPanel buttonPanel = new JPanel(); // hinzugefügt ---------------------------------------------------------------------------------
	   
      JButton button = new JButton( "Change Direction" );
      button.addActionListener( new ActionListener() {
         public void actionPerformed(ActionEvent event) {
            controller.changeDirection();
         }
      } );
      buttonPanel.add( button );

      button = new JButton( "Change Speed" );
      button.addActionListener( new ActionListener() {
         public void actionPerformed(ActionEvent event) {
            controller.changeSpeed();
         }
      } );
      buttonPanel.add( button );
      getContentPane().add( buttonPanel, BorderLayout.SOUTH );
   }

   /*
    * (non-Javadoc)
    *
    * @see java.util.Observer#update(java.util.Observable, java.lang.Object)
    */
   public void update(Observable arg0, Object arg1) {
      Wind wind = ( Wind ) arg1;
      direction.setText( wind.getDir().toString() );
      speed.setText( String.valueOf( wind.getSpeed() ) );
   }
}

Julius
 

WPNCC1701D

Mitglied
Hallo Julius,

ich hab's mal zum laufen bekommen.
Ich habe mir ein paar Anmerkungen gemacht, da ich aber selber noch Anfänger bin, müssen
die nicht stimmen.
Wenn einer der Profis hier erkennt, dass meine Annahmen falsch sind, so möge er mich doch
bitte korrigieren.
Was ich aber geändert habe, kann ich Dir leider nicht sagen, aber hier ist mein Quellcode.

Gruß
Wolfgang

Code:
//- WindController:
package test.controll;

import java.util.Observable;

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

/**
 * @author deathbyaclown
 * 
 * Das ist das Hauptprogramm
 * abgeleitet von Observable, d.h. diese Klasse benachrichtigt die 
 * anderen Klassen bei dem Aufruf von  notifyObservers()
 * 
 * implements das Interface WindControllable mit den Methoden 
 * implements WindControllable und changeDirection, welche hier mit "Leben" gefüllt werden 
 * 
 */
public class WindController extends Observable implements WindControllable {

	private Wind wind; // Das Datenobjekt 

	// InitMethode 
	public WindController() {
		// Ein GUI Objekt erstellen  
		WindViewer viewer = new WindViewer(this);

		// Dem Viewer die änderungen weiterleiten 
		addObserver(viewer);

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

	public void changeDirection() {
		// wird aufgerufen, wenn in der View ein Button gedrückt wird  
		Direction[] dir = Direction.values();
		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();
	}
}


//- WindControllable:
package test.controll;

/**
* @author
* 
*  Definition des Interfaces 
*  
*/

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

//- Direction:
package test.model;


/**
* @author deathbyaclown
* 
* Das ist das Datenobjekt
*  
*/
public enum Direction {
   NORTH, EAST, SOUTH, WEST
}


//- Wind :
package test.model;

/**
 * @author deathbyaclown
 * 
 * Das ist das Datenobjekt 
 * 
 */
public class Wind {

	// Die Klasse hat zwei Eigenschaften Direction und speed  	
	private Direction dir = Direction.NORTH;

	private int speed = 0;

	// ab hier die Getter und Setter Methoden 
	/**
	 * @return Returns the dir.
	 */
	public Direction getDir() {
		return dir;
	}

	/**
	 * @param dir The dir to set.
	 */
	public void setDir(Direction dir) {
		this.dir = dir;
	}

	/**
	 * @return Returns the speed.
	 */
	public int getSpeed() {
		return speed;
	}

	/**
	 * @param speed The speed to set.
	 */
	public void setSpeed(int speed) {
		this.speed = speed;
	}
}


//- NewJFrame:
package test.view;

import javax.swing.WindowConstants;

public class NewJFrame extends javax.swing.JFrame {

	/**
	* Auto-generated main method to display this JFrame
	*/
	public static void main(String[] args) {
		NewJFrame inst = new NewJFrame();
		inst.setVisible(true);
	}
	
	public NewJFrame() {
		super();
		initGUI();
	}
	
	private void initGUI() {
		try {
			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
			pack();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

//- WindViewer:
package test.view;

import java.awt.BorderLayout;
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 test.controll.WindControllable;
import test.model.Wind;

/**
 * @author deathbyaclown
 * 
 * Das ist die GUI des Programms 
 * 
 */
public class WindViewer extends JFrame implements Observer {
	/**
	 * 
	 * extends JFrame ==> abgeleitet von JFrame 
	 * 
	 * implements Observer ==> kann sich bei einem Observer registieren, und dann 
	 * benachrichtigt werden.
	 * 
	 */

	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("WindoController");

		// Referenz auf das Controller in einer Klasseneigenschft speichern 
		this.controller = controller;

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

		// eigene INIT Methode aufrufen 
		init();

		// Rahmen rechts und links anlegen 
		// pack();
                setSize(500,100);

		// und Fenster anzeigen 
		setVisible(true);
	}

	private void init() {
		// 1. Button und ein Panel erzeugen
		JButton button = new JButton("Change Direction");
		JPanel buttonPanel = new JPanel();

		// Wenn auf den Button geklickt wird, 
		// die Methode changeDirection des Controllers aufrufen 
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent event) {
				controller.changeDirection();
			}
		});
		buttonPanel.add(button);

		// 2. Button erstellen 
		button = new JButton("Change Speed");
		direction = new JLabel("");
		speed = new JLabel("");

		// Wenn auf den Button geklickt wird, 
		// die Methode changeSpeed des Controllers aufrufen 
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent event) {
				controller.changeSpeed();
			}
		});
		
		// GUI zusammenbauen 
		buttonPanel.add(button);
		buttonPanel.add(direction);
		buttonPanel.add(speed);

		getContentPane().add(buttonPanel, BorderLayout.SOUTH);
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see java.util.Observer#update(java.util.Observable, java.lang.Object)
	 */
	
	// 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()));
	}
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H virtuelle Konsole [solved] AWT, Swing, JavaFX & SWT 9
M [SOLVED]komponenten unter einem JTabbedPane AWT, Swing, JavaFX & SWT 2
M [SOLVED]Hinzugefügter JTable+volle Fensterbreite ein AWT, Swing, JavaFX & SWT 3
M [SOLVED]Automatischer Methodenaufruf? AWT, Swing, JavaFX & SWT 4
melaniemueller JavaFX Beispiel kann nicht ausgeführt werden AWT, Swing, JavaFX & SWT 4
F Swing TextField Eingabe in Variable umwandeln um zum Beispiel zu rechnen. AWT, Swing, JavaFX & SWT 3
J Swing MVC-Beispiel unklar(ListSelectionListener und ListDataListener) AWT, Swing, JavaFX & SWT 2
S Beispiel für Kollisionserkennung gesucht AWT, Swing, JavaFX & SWT 24
S Bitte um ein Beispiel von JXTreeTable AWT, Swing, JavaFX & SWT 12
J AWT Einmal FileDialog-Beispiel für Dumme bitte AWT, Swing, JavaFX & SWT 6
H Tutorial bzw. Beispiel eines "GUI Ablaufs" AWT, Swing, JavaFX & SWT 8
Spin Window Event Beispiel AWT, Swing, JavaFX & SWT 6
C Mehrer Fragen zu großem kompletten Swing Beispiel AWT, Swing, JavaFX & SWT 5
A Ein Beispiel für Microba AWT, Swing, JavaFX & SWT 3
W Suche großes vollständiges Swing GUI Beispiel nach MVC Model AWT, Swing, JavaFX & SWT 5
P GridBagLayout einfaches Beispiel geht nicht? AWT, Swing, JavaFX & SWT 5
G Text rotieren: Frage zu einem Beispiel AWT, Swing, JavaFX & SWT 5
V Frage zu JScrollPane mit Custom Headern, mit Beispiel AWT, Swing, JavaFX & SWT 2
M treetable einfaches beispiel gesucht AWT, Swing, JavaFX & SWT 6
P Prefuse: Beispiel mit beschrifteten Kanten gesucht? AWT, Swing, JavaFX & SWT 9
S Fragen zu einem Beispiel(Swings und AWT) AWT, Swing, JavaFX & SWT 33
R Falsches Beispiel im Buch? AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben