From 33613a85afc4b1481367fbe92a17ee59c240250b Mon Sep 17 00:00:00 2001 From: Sven Eisenhauer Date: Fri, 10 Nov 2023 15:11:48 +0100 Subject: add new repo --- .../hjp5/examples/LightedPushButton.java | 134 +++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 Master/Reference Architectures and Patterns/hjp5/examples/LightedPushButton.java (limited to 'Master/Reference Architectures and Patterns/hjp5/examples/LightedPushButton.java') diff --git a/Master/Reference Architectures and Patterns/hjp5/examples/LightedPushButton.java b/Master/Reference Architectures and Patterns/hjp5/examples/LightedPushButton.java new file mode 100644 index 0000000..1d63754 --- /dev/null +++ b/Master/Reference Architectures and Patterns/hjp5/examples/LightedPushButton.java @@ -0,0 +1,134 @@ +/* LightedPushButton.java */ + +import java.awt.*; +import java.awt.event.*; +import java.io.*; +import java.beans.*; + +public class LightedPushButton +extends Canvas +implements Serializable +{ + //---Instanzvariablen---------------------------------------- + protected Color linecolor; + protected Color framecolor; + protected Color lightoncolor; + protected Color lightoffcolor; + protected boolean lighton; + transient protected PropertyChangeSupport pchglisteners; + transient protected VetoableChangeSupport vchglisteners; + + //---Methoden------------------------------------------------ + public LightedPushButton() + { + linecolor = Color.black; + framecolor = Color.darkGray; + lightoncolor = Color.red; + lightoffcolor = new Color(127, 0, 0); //dark red + lighton = false; + initTransientState(); + } + + //---Zustandsumschaltung Licht an/aus--- + public void setLightOn(boolean on) + throws PropertyVetoException + { + boolean oldvalue = this.lighton; + vchglisteners.fireVetoableChange("lighton", oldvalue, on); + this.lighton = on; + if (oldvalue != on) { + repaint(); + } + pchglisteners.firePropertyChange("lighton", oldvalue, on); + } + + public boolean getLightOn() + { + return this.lighton; + } + + //---Verwaltung der PropertyChangeListener--- + public void addPropertyChangeListener(PropertyChangeListener l) + { + pchglisteners.addPropertyChangeListener(l); + } + + public void removePropertyChangeListener(PropertyChangeListener l) + { + pchglisteners.removePropertyChangeListener(l); + } + + //---Verwaltung der VetoableChangeListener--- + public void addVetoableChangeListener(VetoableChangeListener l) + { + vchglisteners.addVetoableChangeListener(l); + } + + public void removeVetoableChangeListener(VetoableChangeListener l) + { + vchglisteners.removeVetoableChangeListener(l); + } + + //---Implementierung der Oberfläche--- + public void paint(Graphics g) + { + int width = getSize().width; + int height = getSize().height; + //Rahmen + g.setColor(framecolor); + g.fillOval(0, 0, width, height); + //Beleuchtung + g.setColor(lighton ? lightoncolor : lightoffcolor); + g.fillOval(4, 4, width - 8, height - 8); + //Konturlinien + g.setColor(linecolor); + g.drawOval(0, 0, width - 1, height - 1); + g.drawOval(3, 3, width - 7, height - 7); + } + + public Dimension getPreferredSize() + { + return new Dimension(32, 32); + } + + public Dimension getMinimumSize() + { + return new Dimension(16, 16); + } + + //---Private Klassen--------------------------------------- + /** + * Initialisierung der nicht-persistenten Instanzvariablen. + */ + private void initTransientState() + { + pchglisteners = new PropertyChangeSupport(this); + vchglisteners = new VetoableChangeSupport(this); + addMouseListener(new MouseClickAdapter()); + } + + /** + * Wird überlagert, um nach dem Deserialisieren den transienten + * Zustand zu initialisieren. + */ + private void readObject(ObjectInputStream stream) + throws IOException, ClassNotFoundException + { + stream.defaultReadObject(); + initTransientState(); + } + + //---Lokale Klassen---------------------------------------- + class MouseClickAdapter + extends MouseAdapter + { + public void mouseClicked(MouseEvent event) + { + try { + setLightOn(!getLightOn()); + } catch (PropertyVetoException e) { + //no change if vetoed + } + } + } +} \ No newline at end of file -- cgit v1.2.3