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