diff --git a/EierUhr/src/controller/EieruhrController.java b/EierUhr/src/controller/EieruhrController.java new file mode 100644 index 0000000..ea23701 --- /dev/null +++ b/EierUhr/src/controller/EieruhrController.java @@ -0,0 +1,39 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package controller; + +import java.util.Observable; +import java.util.Observer; +import model.Model; +import view.View; + +/** + * + * @author nobody + */ +public class EieruhrController implements Observer +{ + private View view; + private Model model; + + public EieruhrController(View view, Model model) + { + this.view = view; + this.model = model; + } + + public void registerEvents() + { + model.addObserver(this); + } + + @Override + public void update(Observable o, Object arg) + { + view.getLblCounter().setText(Integer.toString(model.getZahl())); + } +} \ No newline at end of file diff --git a/EierUhr/src/eieruhr/Fassade.java b/EierUhr/src/eieruhr/Fassade.java new file mode 100644 index 0000000..387acb5 --- /dev/null +++ b/EierUhr/src/eieruhr/Fassade.java @@ -0,0 +1,141 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package eieruhr; + +import controller.EieruhrController; +import java.awt.Dimension; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.lang.System.Logger; +import java.util.Observable; +import java.util.Observer; +import java.util.concurrent.CopyOnWriteArrayList; +import javax.swing.JComponent; +import model.Model; +import view.View; + +/** + * Builder Class + * @author Apollo + */ +public class Fassade extends JComponent implements PropertyChangeListener, Observer +{ + Dimension preferredSize; + Dimension minimumSize; + private static Logger log; + + private static Model model; + private static View view; + private static EieruhrController controller; + + private CopyOnWriteArrayList listenerListe; + private static int neu,alt; + + public Fassade() + { + minimumSize = new Dimension(100,50); + preferredSize = new Dimension(200,100); + + model = new Model(); + view = new View(); + controller = new EieruhrController(view, model); + controller.registerEvents(); + registerEvents(); + + this.listenerListe = new CopyOnWriteArrayList(); + + alt = 0; + } + + public void setZahl(int x) + { + model.setStartZahl(x); + } + + public int getZahl() + { + return model.getZahl(); + } + + public Dimension getPreferredSize() + { + return preferredSize; + } + + public Dimension getMinimumSize() + { + return minimumSize; + } + + public void isWarten(boolean warten) + { + if(warten) { + model.isWarten(); + } + } + + public void isWeiterlaufen(boolean weiter){ + if(weiter) { + model.isWeiterlaufen(); + } + } + + public void starten() + { + model.start(); + } + + public void setaktuelleZahl() + { + neu = model.getZahl(); + this.firePropertyChange("aktuelle Zahl", alt, neu); + alt = neu; + } + + public void propertyChange(PropertyChangeEvent evt) + { + Object obj = evt.getNewValue(); + if (obj instanceof Boolean) + { + // Reaktion auf die Nachricht: + this.starten(); + } + } + + public synchronized void addEigenerListener(TimerListener horcher) + { + listenerListe.add(horcher); + } + + public synchronized void removeEignerListener(TimerListener horcher) + { + listenerListe.remove(horcher); + } + + public void fireTimerEvent(TimerEvent evt) + { + listenerListe.forEach(listener -> listener.timerabgelaufen(evt)); + } + + public void registerEvents() + { + model.addObserver(this); + } + + @Override + public void update(Observable arg0, Object arg1) + { + if(model.getZahl() == 0) + { + fireTimerEvent(new TimerEvent(this)); + } + else + { + setaktuelleZahl(); + } + } +} diff --git a/EierUhr/src/eieruhr/FassadeBeanInfo.java b/EierUhr/src/eieruhr/FassadeBeanInfo.java new file mode 100644 index 0000000..0904f7c --- /dev/null +++ b/EierUhr/src/eieruhr/FassadeBeanInfo.java @@ -0,0 +1,279 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package eieruhr; + +import java.beans.*; + +/** + * + * @author Apollo + */ +public class FassadeBeanInfo extends SimpleBeanInfo +{ + + // Bean descriptor//GEN-FIRST:BeanDescriptor + /*lazy BeanDescriptor*/ + private static BeanDescriptor getBdescriptor(){ + BeanDescriptor beanDescriptor = new BeanDescriptor ( eieruhr.Fassade.class , null ); // NOI18N//GEN-HEADEREND:BeanDescriptor + // Here you can add code for customizing the BeanDescriptor. + + return beanDescriptor; }//GEN-LAST:BeanDescriptor + + + // Property identifiers//GEN-FIRST:Properties + private static final int PROPERTY_zahl = 0; + + // Property array + /*lazy PropertyDescriptor*/ + private static PropertyDescriptor[] getPdescriptor(){ + PropertyDescriptor[] properties = new PropertyDescriptor[1]; + + try { + properties[PROPERTY_zahl] = new PropertyDescriptor ( "zahl", eieruhr.Fassade.class, "getZahl", "setZahl" ); // NOI18N + } + catch(IntrospectionException e) { + e.printStackTrace(); + }//GEN-HEADEREND:Properties + // Here you can add code for customizing the properties array. + + return properties; }//GEN-LAST:Properties + + // EventSet identifiers//GEN-FIRST:Events + + // EventSet array + /*lazy EventSetDescriptor*/ + private static EventSetDescriptor[] getEdescriptor(){ + EventSetDescriptor[] eventSets = new EventSetDescriptor[0];//GEN-HEADEREND:Events + // Here you can add code for customizing the event sets array. + + return eventSets; }//GEN-LAST:Events + + // Method identifiers//GEN-FIRST:Methods + private static final int METHOD_addEigenerListener0 = 0; + private static final int METHOD_addPropertyChangeListener1 = 1; + private static final int METHOD_isWarten2 = 2; + private static final int METHOD_isWeiterlaufen3 = 3; + private static final int METHOD_removeEignerListener4 = 4; + private static final int METHOD_removePropertyChangeListener5 = 5; + private static final int METHOD_setaktuelleZahl6 = 6; + private static final int METHOD_starten7 = 7; + + // Method array + /*lazy MethodDescriptor*/ + private static MethodDescriptor[] getMdescriptor(){ + MethodDescriptor[] methods = new MethodDescriptor[8]; + + try { + methods[METHOD_addEigenerListener0] = new MethodDescriptor(eieruhr.Fassade.class.getMethod("addEigenerListener", new Class[] {eieruhr.TimerListener.class})); // NOI18N + methods[METHOD_addEigenerListener0].setDisplayName ( "" ); + methods[METHOD_addPropertyChangeListener1] = new MethodDescriptor(java.awt.Container.class.getMethod("addPropertyChangeListener", new Class[] {java.lang.String.class, java.beans.PropertyChangeListener.class})); // NOI18N + methods[METHOD_addPropertyChangeListener1].setDisplayName ( "" ); + methods[METHOD_isWarten2] = new MethodDescriptor(eieruhr.Fassade.class.getMethod("isWarten", new Class[] {})); // NOI18N + methods[METHOD_isWarten2].setDisplayName ( "" ); + methods[METHOD_isWeiterlaufen3] = new MethodDescriptor(eieruhr.Fassade.class.getMethod("isWeiterlaufen", new Class[] {})); // NOI18N + methods[METHOD_isWeiterlaufen3].setDisplayName ( "" ); + methods[METHOD_removeEignerListener4] = new MethodDescriptor(eieruhr.Fassade.class.getMethod("removeEignerListener", new Class[] {eieruhr.TimerListener.class})); // NOI18N + methods[METHOD_removeEignerListener4].setDisplayName ( "" ); + methods[METHOD_removePropertyChangeListener5] = new MethodDescriptor(java.awt.Component.class.getMethod("removePropertyChangeListener", new Class[] {java.lang.String.class, java.beans.PropertyChangeListener.class})); // NOI18N + methods[METHOD_removePropertyChangeListener5].setDisplayName ( "" ); + methods[METHOD_setaktuelleZahl6] = new MethodDescriptor(eieruhr.Fassade.class.getMethod("setaktuelleZahl", new Class[] {})); // NOI18N + methods[METHOD_setaktuelleZahl6].setDisplayName ( "" ); + methods[METHOD_starten7] = new MethodDescriptor(eieruhr.Fassade.class.getMethod("starten", new Class[] {})); // NOI18N + methods[METHOD_starten7].setDisplayName ( "" ); + } + catch( Exception e) {}//GEN-HEADEREND:Methods + // Here you can add code for customizing the methods array. + + return methods; }//GEN-LAST:Methods + + private static java.awt.Image iconColor16 = null;//GEN-BEGIN:IconsDef + private static java.awt.Image iconColor32 = null; + private static java.awt.Image iconMono16 = null; + private static java.awt.Image iconMono32 = null;//GEN-END:IconsDef + private static String iconNameC16 = null;//GEN-BEGIN:Icons + private static String iconNameC32 = null; + private static String iconNameM16 = null; + private static String iconNameM32 = null;//GEN-END:Icons + + private static final int defaultPropertyIndex = -1;//GEN-BEGIN:Idx + private static final int defaultEventIndex = -1;//GEN-END:Idx + + +//GEN-FIRST:Superclass + // Here you can add code for customizing the Superclass BeanInfo. + +//GEN-LAST:Superclass + /** + * Gets the bean's BeanDescriptors. + * + * @return BeanDescriptor describing the editable properties of this bean. May + * return null if the information should be obtained by automatic analysis. + */ + @Override + public BeanDescriptor getBeanDescriptor() + { + return getBdescriptor(); + } + + /** + * Gets the bean's PropertyDescriptors. + * + * @return An array of PropertyDescriptors describing the editable properties + * supported by this bean. May return null if the information should be + * obtained by automatic analysis. + *

+ * If a property is indexed, then its entry in the result array will belong to + * the IndexedPropertyDescriptor subclass of PropertyDescriptor. A client of + * getPropertyDescriptors can use "instanceof" to check if a given + * PropertyDescriptor is an IndexedPropertyDescriptor. + */ + @Override + public PropertyDescriptor[] getPropertyDescriptors() + { + return getPdescriptor(); + } + + /** + * Gets the bean's EventSetDescriptors. + * + * @return An array of EventSetDescriptors describing the kinds of events + * fired by this bean. May return null if the information should be obtained + * by automatic analysis. + */ + @Override + public EventSetDescriptor[] getEventSetDescriptors() + { + return getEdescriptor(); + } + + /** + * Gets the bean's MethodDescriptors. + * + * @return An array of MethodDescriptors describing the methods implemented by + * this bean. May return null if the information should be obtained by + * automatic analysis. + */ + @Override + public MethodDescriptor[] getMethodDescriptors() + { + return getMdescriptor(); + } + + /** + * A bean may have a "default" property that is the property that will mostly + * commonly be initially chosen for update by human's who are customizing the + * bean. + * + * @return Index of default property in the PropertyDescriptor array returned + * by getPropertyDescriptors. + *

+ * Returns -1 if there is no default property. + */ + @Override + public int getDefaultPropertyIndex() + { + return defaultPropertyIndex; + } + + /** + * A bean may have a "default" event that is the event that will mostly + * commonly be used by human's when using the bean. + * + * @return Index of default event in the EventSetDescriptor array returned by + * getEventSetDescriptors. + *

+ * Returns -1 if there is no default event. + */ + @Override + public int getDefaultEventIndex() + { + return defaultEventIndex; + } + + /** + * This method returns an image object that can be used to represent the bean + * in toolboxes, toolbars, etc. Icon images will typically be GIFs, but may in + * future include other formats. + *

+ * Beans aren't required to provide icons and may return null from this + * method. + *

+ * There are four possible flavors of icons (16x16 color, 32x32 color, 16x16 + * mono, 32x32 mono). If a bean choses to only support a single icon we + * recommend supporting 16x16 color. + *

+ * We recommend that icons have a "transparent" background so they can be + * rendered onto an existing background. + * + * @param iconKind The kind of icon requested. This should be one of the + * constant values ICON_COLOR_16x16, ICON_COLOR_32x32, ICON_MONO_16x16, or + * ICON_MONO_32x32. + * @return An image object representing the requested icon. May return null if + * no suitable icon is available. + */ + @Override + public java.awt.Image getIcon(int iconKind) + { + switch (iconKind) + { + case ICON_COLOR_16x16: + if (iconNameC16 == null) + { + return null; + } + else + { + if (iconColor16 == null) + { + iconColor16 = loadImage(iconNameC16); + } + return iconColor16; + } + case ICON_COLOR_32x32: + if (iconNameC32 == null) + { + return null; + } + else + { + if (iconColor32 == null) + { + iconColor32 = loadImage(iconNameC32); + } + return iconColor32; + } + case ICON_MONO_16x16: + if (iconNameM16 == null) + { + return null; + } + else + { + if (iconMono16 == null) + { + iconMono16 = loadImage(iconNameM16); + } + return iconMono16; + } + case ICON_MONO_32x32: + if (iconNameM32 == null) + { + return null; + } + else + { + if (iconMono32 == null) + { + iconMono32 = loadImage(iconNameM32); + } + return iconMono32; + } + default: + return null; + } + } + +} diff --git a/EierUhr/src/eieruhr/TimerEvent.java b/EierUhr/src/eieruhr/TimerEvent.java new file mode 100644 index 0000000..02300dc --- /dev/null +++ b/EierUhr/src/eieruhr/TimerEvent.java @@ -0,0 +1,21 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package eieruhr; + +import java.util.EventObject; + +/** + * + * @author Apollo + */ +public class TimerEvent extends EventObject +{ + public TimerEvent(Object source) + { + super(source); + } +} diff --git a/EierUhr/src/eieruhr/TimerListener.java b/EierUhr/src/eieruhr/TimerListener.java new file mode 100644 index 0000000..b1d950c --- /dev/null +++ b/EierUhr/src/eieruhr/TimerListener.java @@ -0,0 +1,17 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package eieruhr; + +import java.util.EventListener; + +/** + * + * @author Apollo + */ +public interface TimerListener extends EventListener +{ + public void timerabgelaufen(TimerEvent evt); +} diff --git a/EierUhr/src/logger/MyFormatter/MyFormatter.java b/EierUhr/src/logger/MyFormatter/MyFormatter.java new file mode 100644 index 0000000..d2a91c9 --- /dev/null +++ b/EierUhr/src/logger/MyFormatter/MyFormatter.java @@ -0,0 +1,35 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package logger.MyFormatter; + +import java.util.Date; +import java.util.logging.LogRecord; +import java.util.logging.SimpleFormatter; + +/** + * + * @author nobody + */ +public class MyFormatter extends SimpleFormatter +{ + private String message; + private final Date dat = new Date(); + + @Override + public String format(LogRecord record) + { + dat.setTime(record.getMillis()); + message = "| " + dat + " | " + record.getLevel() + " | " + + record.getSourceClassName() + " | " + record.getMessage() + " |\n"; + + return message; + } + public MyFormatter() + { + + } +} \ No newline at end of file diff --git a/EierUhr/src/logger/OhmLogger.java b/EierUhr/src/logger/OhmLogger.java new file mode 100644 index 0000000..08f0d37 --- /dev/null +++ b/EierUhr/src/logger/OhmLogger.java @@ -0,0 +1,57 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package logger; + +import java.io.File; +import java.io.IOException; +import java.util.logging.ConsoleHandler; +import java.util.logging.FileHandler; +import java.util.logging.Level; +import java.util.logging.Logger; +import logger.MyFormatter.MyFormatter; + +/** + * + * @author nobody + */ +public class OhmLogger +{ + private static Logger lg = null; + + public static Logger getLogger() + { + if (lg == null) + { + lg = Logger.getLogger("OhmLogger"); + initLogger(); + } + return lg; + } + + private static void initLogger() + { + try + { + String datei = System.getProperty("java.io.tmpdir") + File.separator + "log.txt"; + FileHandler fh = new FileHandler(datei); + ConsoleHandler ch = new ConsoleHandler(); + lg.setUseParentHandlers(false); + lg.addHandler(fh); + ch.setFormatter(new MyFormatter()); + lg.addHandler(ch); + lg.setLevel(Level.ALL); + } + catch (IOException ioex) + { + System.err.println(ioex); + } + } + + public OhmLogger() + { + + } +} \ No newline at end of file diff --git a/EierUhr/src/model/Model.java b/EierUhr/src/model/Model.java new file mode 100644 index 0000000..6880c25 --- /dev/null +++ b/EierUhr/src/model/Model.java @@ -0,0 +1,119 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model; + +import java.util.Observable; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.JOptionPane; + +/** + * + * @author nobody + */ +public class Model extends Observable implements Runnable +{ + private int zahl; + private boolean status; + private Thread thr; + private boolean notify; + private boolean schlafen; + + public Model() + { + zahl = 0; + status = false; + thr = null; + } + + public void start() + { + if (status == true) + { + //1 + //notify = true; + synchronized (thr) + { + thr.notify(); + schlafen = false; + } + } + if (status == false && thr == null) + { + zahl = 0; + thr = new Thread(this); + thr.start(); + status = true; + notify = true; + } + } + + @Override + public void run() + { + while (status == true) + { + if (schlafen == true) + { + synchronized (thr) + { + try + { + thr.wait(); + } + catch (InterruptedException ex) + { + JOptionPane.showMessageDialog(null, "Alles Kaputt"); + } + } + } + // Zahl incrementieren + zahl--; + // Zahl ändern + if (notify == true) + { + this.setChanged(); + this.notifyObservers(); + } + // Zahl zurücksetzen + if (zahl == 0) + { + zahl = 10; + } + // kurze Wartezeit + try + { + Thread.sleep(1000); + } + catch (InterruptedException ex) + { + Logger.getLogger(Model.class.getName()).log(Level.SEVERE, null, ex); + } + } + } + + /** + * @return the zahl + */ + public int getZahl() + { + return zahl; + } + + public void setStartZahl(int zahl) + { + this.zahl = zahl; + } + + public void isWarten() + { + schlafen = true; + } + + public void isWeiterlaufen(){ + schlafen = false; + } +} \ No newline at end of file diff --git a/EierUhr/src/view/View.form b/EierUhr/src/view/View.form new file mode 100644 index 0000000..a740731 --- /dev/null +++ b/EierUhr/src/view/View.form @@ -0,0 +1,46 @@ + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/EierUhr/src/view/View.java b/EierUhr/src/view/View.java new file mode 100644 index 0000000..b4543db --- /dev/null +++ b/EierUhr/src/view/View.java @@ -0,0 +1,76 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package view; + +/** + * + * @author Apollo + */ +public class View extends javax.swing.JPanel +{ + /** + * @return the LblCounter + */ + public javax.swing.JLabel getLblCounter() + { + return LblCounter; + } + + /** + * @param LblCounter the LblCounter to set + */ + public void setLblCounter(javax.swing.JLabel LblCounter) + { + this.LblCounter = LblCounter; + } + + + /** + * Creates new form view + */ + public View() + { + initComponents(); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() + { + + LblCounter = new javax.swing.JLabel(); + + LblCounter.setFont(new java.awt.Font("Lucida Grande", 0, 36)); // NOI18N + LblCounter.setText("10"); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(23, 23, 23) + .addComponent(LblCounter, javax.swing.GroupLayout.PREFERRED_SIZE, 51, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap(26, Short.MAX_VALUE)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(36, 36, 36) + .addComponent(LblCounter, javax.swing.GroupLayout.PREFERRED_SIZE, 38, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap(38, Short.MAX_VALUE)) + ); + }// //GEN-END:initComponents + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JLabel LblCounter; + // End of variables declaration//GEN-END:variables +}