NullPointerException im MVC Muster

CortPoker

Aktives Mitglied
Hi zusammen!
Bin momentan dabei, eine GUI nach MVC Muster zu erstellen. Hier mal der wichtige Code:
View:
Java:
package gUI;

import java.awt.BorderLayout;
import java.awt.Color;
import java.util.Observable;
import java.util.Observer;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.border.BevelBorder;

import net.miginfocom.swing.MigLayout;

public class ViewShop extends JFrame implements Observer {
	
	private ModelShop model;
	private JMenuBar menu;
	private JPanel panelLeft, panelRight, panelDown;
	private JMenu chooseONoff;
	private JRadioButtonMenuItem workOn, workOff;
	private JLabel name, quantity, price, orders, nameDown, quantityDown, priceDown;
	private JList<String> orderList;
	private JTextField enterName, enterQuantity, enterPrice;
	private JButton showOnOff, addProduct;
	private String[] data = {};
	private JScrollPane scrollpane;
	
	public ViewShop(ModelShop model) {
		super("Hardware Shop");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLocation(400, 300);
//		this.setSize(600,400);
		this.setLayout(new BorderLayout());
		this.setResizable(false);
		this.model = model;
		model.addObserver(this);
		
		// adding MenuBar and all of its components
		chooseONoff = new JMenu("Offline");
		workOn = new JRadioButtonMenuItem("Work Online");
		workOff = new JRadioButtonMenuItem("Work Offline");
		menu = new JMenuBar();
		chooseONoff.add(workOff);
		chooseONoff.add(workOn);
		showOnOff = new JButton();
		showOnOff.setEnabled(false);
		showOnOff.setBackground(Color.red);
		menu.add(showOnOff);
		menu.add(chooseONoff);
		this.add(menu, BorderLayout.NORTH);
		
		// designing Panel on the left
		panelLeft = new JPanel();
		panelLeft.setLayout(new MigLayout());
		name = new JLabel("Name");
		quantity = new JLabel("Quantity");
		price = new JLabel("Price");
		name.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
		quantity.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
		price.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));

		panelLeft.add(name, "w 100!");
		panelLeft.add(quantity, "w 100!");
		panelLeft.add(price, "w 100!");
		this.add(panelLeft, BorderLayout.WEST);
		
		// designing Panel on the right
		panelRight = new JPanel();
		panelRight.setLayout(new BoxLayout(panelRight, BoxLayout.Y_AXIS));
		orders = new JLabel("Orders");
		orderList = new JList<String>(data);
		orders.add(orderList);
		panelRight.add(orders);
		panelRight.add(orderList);
		scrollpane = new JScrollPane(orderList);
		panelRight.add(scrollpane);
		this.add(panelRight, BorderLayout.EAST);
		
		// designing Panel on the bottom
		panelDown = new JPanel();
		nameDown = new JLabel("Name:");
		quantityDown = new JLabel("Quantity:");
		priceDown = new JLabel("Price:");
		enterName = new JTextField(15);
		enterPrice = new JTextField(15);
		enterQuantity = new JTextField(15);
		addProduct = new JButton("Add Product");
		panelDown.setLayout(new MigLayout());
		
		panelDown.add(nameDown);
		panelDown.add(quantityDown);
		panelDown.add(priceDown, "wrap");
		panelDown.add(enterName);
		panelDown.add(enterQuantity);
		panelDown.add(enterPrice);
		panelDown.add(addProduct);
		this.add(panelDown, BorderLayout.SOUTH);
		
		this.pack();
		this.setVisible(true);
	}
	
	@Override
	public void update(Observable arg0, Object arg1) {
		
		this.pack();
	}

	public JRadioButtonMenuItem getWorkOn() {
		return workOn;
	}

	public JRadioButtonMenuItem getWorkOff() {
		return workOff;
	}

	public JButton getAddProduct() {
		return addProduct;
	}

	public JTextField getEnterName() {
		return enterName;
	}

	public JTextField getEnterQuantity() {
		return enterQuantity;
	}

	public JTextField getEnterPrice() {
		return enterPrice;
	}
	
	public String returnName() {
		return enterName.getText();
	}
	
	public int returnQuantity() {
		return Integer.parseInt(enterQuantity.getText());
	}
	
	public double returnPrice() {
		return Double.parseDouble(enterPrice.getText());
	}

}

Control:
Java:
package gUI;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class ControllerShop {

	private final ModelShop model;
	private final ViewShop view;
	
	public ControllerShop(final ModelShop model, final ViewShop view) {
		this.model = model;
		this.view = view;
		this.control();
	}
	
	public void control() {
		// interaction with Add Product Button
		view.getAddProduct().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				try {
					model.addProduct(view.returnName(), view.returnQuantity(), view.returnPrice());
				} catch (NumberFormatException ex) {
					System.err.println("Was soll das!");
				}
			}
		});
		
		// interaction with RadioMenuBar
		view.getWorkOff().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				model.onlineOfflineMode();
			}
		});
		view.getWorkOn().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				model.onlineOfflineMode();
			}
		});
	}
}

Model:
Java:
package gUI;

import java.util.Observable;

public class ModelShop extends Observable {

	private ViewShop view;
	private Product p;
	
	public ModelShop() {
		super();
	}
	
	public void addProduct(String name, int quantity, double price) {
		try {
			if (view.getEnterName().getText() != null && view.getEnterQuantity().getText() != null && 
					view.getEnterPrice().getText() != null) {
				this.p = new Product(name, quantity, price);
			}
		} catch (NullPointerException e) {
			e.printStackTrace();
//			System.err.println("Die Eingaben müssen Zahlen sein!");
		}
	}
	
	public void onlineOfflineMode() {
		if (view.getWorkOff().isEnabled()) {
			System.out.println("huhu");
			view.getWorkOn().setEnabled(false);
		}
		
		super.setChanged();
		super.notifyObservers();
	}
}

Starte ich das Programm und mache Eingaben in meinen Textfeldern, ballert Eclipse mir ne NullPointerException um die Ohren:
Java:
java.lang.NullPointerException
	at gUI.ModelShop.addProduct(ModelShop.java:16)
	at gUI.ControllerShop$1.actionPerformed(ControllerShop.java:20)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
	at java.awt.Component.processMouseEvent(Component.java:6504)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3312)
	at java.awt.Component.processEvent(Component.java:6269)
	at java.awt.Container.processEvent(Container.java:2229)
	at java.awt.Component.dispatchEventImpl(Component.java:4860)
	at java.awt.Container.dispatchEventImpl(Container.java:2287)
	at java.awt.Component.dispatchEvent(Component.java:4686)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
	at java.awt.Container.dispatchEventImpl(Container.java:2273)
	at java.awt.Window.dispatchEventImpl(Window.java:2713)
	at java.awt.Component.dispatchEvent(Component.java:4686)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
	at java.awt.EventQueue.access$000(EventQueue.java:101)
	at java.awt.EventQueue$3.run(EventQueue.java:666)
	at java.awt.EventQueue$3.run(EventQueue.java:664)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.awt.EventQueue$4.run(EventQueue.java:680)
	at java.awt.EventQueue$4.run(EventQueue.java:678)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Mache ich keine Eingaben, greift mein try-catch Block die NumberFormatException auf. Ich weiß, dass da irgendwas mit den Referenzen der Klassen untereinander nicht stimmt, aber ich sehe einfach nicht, wo genau der Wurm drin ist.
Der Code ist natürlich noch lang nicht fertig, also nicht über evtl. Redundanzen o.Ä. wundern.

Danke schon mal :)
 
G

Gast2

Gast
Code:
view
in ModelShop ist null und wird scheinbar nirgends mit nem Wert belegt.
 

CortPoker

Aktives Mitglied
EIn Objekt der Klasse ViewShop erzeuge ich an anderer Stelle, die Variable view ist eigentlich nur da, damit ich auf die Methoden der Klasse zugreifen kann.
Aber ich merk schon, dass dann wohl die Logik nicht ganz stimmt.
Läuft wohl nur, wenn ich die Variable auch in ModelShop initialisiere, ganz egal, ob an anderer Stelle ein Objekt erzeugt wird oder nicht, richtig?

Danke dir schon mal :)
 
G

Gast2

Gast
Genauso wie du dem Controller Referenzen auf deinen View und das Model übergibst musst du dem Model auch ne Referenz auf den selben (!) view übergeben wenn du darauf Methoden aufrufen willst.

Wo erstellst du die ganzen instanzen?
 

CortPoker

Aktives Mitglied
Die Instanzen erstelle ich in einer eigenen Klasse:
Java:
package gUI;

public class HardwareShop {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ModelShop model = new ModelShop();
		ViewShop view = new ViewShop(model);
		ControllerShop controller = new ControllerShop(model, view);
	}
}
Das soll auch so erfolgen, ist für die Uni und da wurd explizit gesagt, extra MainClass erstellen.
Frage mich jetzt nur, wie ich dem Model nun die richtige Referenz übergebe, wenn ich die Instanzen in einer anderen Klasse erzeuge und View schon Model als Parameter übergeben bekommt :/
 
G

Gast2

Gast
Du müsstest für dein Model ne Methode setView(ViewShop view) schreiben mit der du die Referenz auf den erstellten View setzen kannst.
 

CortPoker

Aktives Mitglied
Des Rätsels Lösung, hätte man mit ein wenig Hirnschmalz auch selbst drauf kommen können :D Aber vor lauter Code sieht man manchmal gar nichts mehr.
Klappt jetzt auf jeden Fall :) In dem Sinne: Vielen Dank für die schnelle Hilfe! :applaus:
 

GUI-Programmer

Top Contributor
Aber eigentlich dennoch ziemlich unpassend. Denn da es dir ja darum nach MVC dein Programm aufzubauen, wäre es wichtig, dass das Model erst gar keine Instanz der View hat - schließlich arbeitest du ja schon mit Observer und Observable. Also schnellst möglich die View Instanz vom Model entfernen - ansonsten passt der Code und entspricht MVC.
 

CortPoker

Aktives Mitglied
Ohne die Instanz würde das Programm wieder Exceptions werfen.
Es sei denn, ich hab den Dreh mit Observer und Observable noch nicht so ganz raus
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
_user_q Objekte vom MainController in anderen Controller verwenden und andersherum (NullPointerException) AWT, Swing, JavaFX & SWT 14
Jose05 Nullpointerexception bei toArray() AWT, Swing, JavaFX & SWT 9
Jose05 NullPointerException bei Beschreiben eines Labels aus einem Array AWT, Swing, JavaFX & SWT 12
J Java FX NullPointerException, ObservableList wird in View nicht angezeigt.. AWT, Swing, JavaFX & SWT 34
N Nur bei einem Textfiled Nullpointerexception bei getText() AWT, Swing, JavaFX & SWT 1
R NullPointerException beim Start des Fensters AWT, Swing, JavaFX & SWT 1
D JavaFX Nullpointerexception wegen TableView AWT, Swing, JavaFX & SWT 2
ZH1896ZH JavaFX kann NullPointerException nicht auflösen... :( AWT, Swing, JavaFX & SWT 3
M NullPointerException / Controller AWT, Swing, JavaFX & SWT 4
R Swing Java9 NullPointerException bei JComboBox AWT, Swing, JavaFX & SWT 13
L java.lang.NullPointerException - Fehlermeldung AWT, Swing, JavaFX & SWT 2
M NullPointerException bei Übergabe eines RadioButtons AWT, Swing, JavaFX & SWT 11
zhermann NullPointerException bei Label.setText() AWT, Swing, JavaFX & SWT 5
it_is_all jLabel.setText -> Char in Str: NullpointerException AWT, Swing, JavaFX & SWT 1
D NullPointerException observableList AWT, Swing, JavaFX & SWT 4
J NullPointerException bei getText() AWT, Swing, JavaFX & SWT 3
S JavaFX NullPointerException bei Versuch ImageView zu ändern AWT, Swing, JavaFX & SWT 1
K JFileChooser NullPointerException AWT, Swing, JavaFX & SWT 7
T Swing NullPointerException beim auslesen von jTextField - Anfänger! AWT, Swing, JavaFX & SWT 3
S Swing [CLOSED] NullPointerException bei BorderLayout() AWT, Swing, JavaFX & SWT 8
G Swing NullPointerException und JXImageView AWT, Swing, JavaFX & SWT 4
L exception in thread awt-eventqueue-0 java.lang.nullpointerexception AWT, Swing, JavaFX & SWT 2
U Swing NullPointerException trotz Referenz auf Textfield & Button AWT, Swing, JavaFX & SWT 6
L NullpointerException und Probleme mit repaint() AWT, Swing, JavaFX & SWT 11
G JavaFX NullPointerException bei Zugriff auf FXML Element AWT, Swing, JavaFX & SWT 0
K JavaFX Pfad öffen NullPointerException AWT, Swing, JavaFX & SWT 4
H SWT NullPointerException bei Zugriff auf Variablen des Hauptfensters AWT, Swing, JavaFX & SWT 6
L Event Handling windowAdapter - NullPointerException beim Schließen AWT, Swing, JavaFX & SWT 5
J JTable verursacht NullPointerException.Ratlos. AWT, Swing, JavaFX & SWT 5
C JButton NullPointerException AWT, Swing, JavaFX & SWT 2
Q getGraphics() - NullPointerException AWT, Swing, JavaFX & SWT 8
V Nullpointerexception (etwas mit thread und jframe) AWT, Swing, JavaFX & SWT 3
M JTable Drucken NullpointerException +JTable speichern AWT, Swing, JavaFX & SWT 6
T Swing Laden eines Icons auf JButton liefert NullPointerException AWT, Swing, JavaFX & SWT 8
M Exception in thread "Thread-3" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 18
C Swing NullPointerException beim Hinzufügen von Checkboxes in eine ArrayList AWT, Swing, JavaFX & SWT 5
1 JComponent -> java.lang.NullPointerException AWT, Swing, JavaFX & SWT 13
B Swing NullPointerException bei actionPerformed() AWT, Swing, JavaFX & SWT 2
E java.lang.NullPointerException AWT, Swing, JavaFX & SWT 14
R NullPointerException AWT, Swing, JavaFX & SWT 16
xehpuk Swing NullPointerException: Random-Instanz anfangs nicht initialisiert AWT, Swing, JavaFX & SWT 4
3 Swing NullPointerException in AW Event-0? AWT, Swing, JavaFX & SWT 5
C SWT NullPointerException AWT, Swing, JavaFX & SWT 12
J NullPointerException bei Benutzung vom TableCellRenderer AWT, Swing, JavaFX & SWT 3
A AWT Methodenaufruf "AWT-EventQueue-0" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 4
X NullPointerException beim Einfügen einer JMenuBar AWT, Swing, JavaFX & SWT 4
B NullPointerException bei JFrame AWT, Swing, JavaFX & SWT 2
D JPanel / NullPointerException AWT, Swing, JavaFX & SWT 4
G LookAndFeel Dynamisches Einlesen von LookAndFeels - NullPointerException AWT, Swing, JavaFX & SWT 4
E Login wird durch NullPointerException abgebrochen AWT, Swing, JavaFX & SWT 10
K NullPointerException ohne CodeLink AWT, Swing, JavaFX & SWT 6
L NullPointerException JFreeChart AWT, Swing, JavaFX & SWT 10
F NullPointerException - HILFE!! AWT, Swing, JavaFX & SWT 20
martinyyyy AWT Parameter erzeugen NullpointerException obwohl sie vorhanden sind? AWT, Swing, JavaFX & SWT 4
H Swing NullPointerException in JTable bei vielen Einträgen AWT, Swing, JavaFX & SWT 2
S Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 7
S NullPointerException bei JFileChooser AWT, Swing, JavaFX & SWT 8
X JList Probleme mit NullPointerException AWT, Swing, JavaFX & SWT 3
S NullPointerException bei Aufruf von updateUI() beim JFrame AWT, Swing, JavaFX & SWT 12
Z NullPointerException bei SplashScreen AWT, Swing, JavaFX & SWT 5
C NullPointerException bei Doppelpufferung AWT, Swing, JavaFX & SWT 3
F CardLayout.show() -> NullPointerException AWT, Swing, JavaFX & SWT 4
B NullPointerException bei String vergleich AWT, Swing, JavaFX & SWT 5
K NullPointerException bei JTextField AWT, Swing, JavaFX & SWT 8
L Problem mit "NullPointerException" bei grafischer AWT, Swing, JavaFX & SWT 3
D bei Thread in JComponent malen NullPointerException AWT, Swing, JavaFX & SWT 3
loadbrain JTextFields & java.lang.NullPointerException AWT, Swing, JavaFX & SWT 2
F JProgressBar und NullPointerException AWT, Swing, JavaFX & SWT 4
D javax.swing.Timer bringt NullPointerException AWT, Swing, JavaFX & SWT 4
R TextField bringt NullPointerException bei setVisible() AWT, Swing, JavaFX & SWT 12
A NullPointerException in einer JList AWT, Swing, JavaFX & SWT 7
F Fehler: java.lang.NullPointerException AWT, Swing, JavaFX & SWT 2
S Brauche Hilfe mit JFrame - NullPointerException AWT, Swing, JavaFX & SWT 7
A NullPointerException - warum? AWT, Swing, JavaFX & SWT 5
G NullPointerException bei Aufruf von JTabbedPane.getSelectedI AWT, Swing, JavaFX & SWT 7
G Problem mit NullPointerException AWT, Swing, JavaFX & SWT 11
M JTable verursacht NullPointerException AWT, Swing, JavaFX & SWT 8
M NullPointerException AWT, Swing, JavaFX & SWT 3
J NullPointerException bei getSelectedItem AWT, Swing, JavaFX & SWT 10
G Bekomme immer: NullPointerException AWT, Swing, JavaFX & SWT 2
F Swing Wie zeichne/animiere ich im MVC Muster? AWT, Swing, JavaFX & SWT 8
C Eclipse Filter-Muster AWT, Swing, JavaFX & SWT 2
M Swing Dateien auf Muster analysieren AWT, Swing, JavaFX & SWT 30
W Swing anklickbares Sechseck-Muster AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen


Oben