/************************************************************/ /* PetriFrame.java Version 2003/03/28 */ /* */ /* Tom Fellmann, Christoph Weißenborn */ /* */ /************************************************************/ import java.awt.*; import java.awt.event.*; import java.io.*; import javax.swing.*; import javax.swing.border.*; /********************************************************************/ /* Klasse MainMenu */ /********************************************************************/ class PetriFrame extends JFrame{ /* sonstig wichtige Datenstrukturen */ public static final int WEITER_OPTION = 8; //für Mitteilungsdialoge public static final int ABBRUCH_OPTION = 16; //für Mitteilungsdialoge public static final String[] FARB_NAME = {"hellgrün", "gelb", "blau", "pink", "weiß", "orange", "rot", "schwarz", "türkis", "violet", "rosa", "grau", "dunkelblau", "grün", "braun"}; public static final Color[] FARB_WERT = {Color.green, Color.yellow, Color.blue, Color.magenta, Color.white, Color.orange, Color.red, Color.black, Color.cyan, new Color(160,32,160), new Color(255,144,144), Color.lightGray, new Color(0,0,160), new Color(16,128,16), new Color(144,96,8) }; public static final Color[] FARB_WERT_TEXTFARBE = {Color.black, Color.black, Color.white, Color.black, Color.black, Color.black, Color.white, Color.white, Color.black, Color.white, Color.black, Color.black, Color.white, Color.white, Color.white}; protected Maus maus = new Maus(); // Struktur zur Mausbehandlung /* alle "großen" Darstellungskomponenten */ protected Netz gefNetz = null; protected PlatzMatrixPanel PlatzMatrixRE, PlatzMatrixUN; protected KanteMatrixPanel KanteMatrixRE, KanteMatrixUN; protected JPanel MatrizenRE, MatrizenUN; protected boolean MatrizenSindRechts; protected JMenuBar jMenuBar; protected JScrollPane zeichenflaeche; private JPopupMenu popupEingabe = null; private JPopupMenu popupSimul = null; protected StatusZeile jStatusBar; private NeuDialog neuDialog; //NeuesNetz-Eigenschaften-Dialog private JFileChooser dateiDialog; //Öffnen/Speichern-Dialog private DefDialog defDialog; //Hilfe-Def-Dialog private HilfeDialog hilfeDialog; //Hilfe-Hilfe-Dialog private InfoDialog infoDialog; //Hilfe-Info-Dialog /* notwendige "kleine" Darstellungskomponenten */ protected myJMenuItem jMenuItemDSchli, jMenuItemDSpeic, jMenuItemDSpeicU; protected myJMenu jMenuItemBAnleg, jMenuItemBEntf; protected myJMenuItem jMenuItemBEigen; protected myJMenuItem jMenuItemAMatrR, jMenuItemAMatrU, jMenuItemAVergr; protected myJMenuItem jMenuItemSimBeg, jMenuItemSimEnde; /***************************************************/ /* Konstruktor */ /***************************************************/ public PetriFrame() { enableEvents( AWTEvent.WINDOW_EVENT_MASK); try { init(); } catch (Exception e) { e.printStackTrace(); } }//PetriFrame-Konstruktor /***************************************************/ /* Initialisierung */ /***************************************************/ private void init() throws Exception { JPanel contentPane = (JPanel) this.getContentPane(); contentPane.setLayout(new BorderLayout()); jStatusBar = new StatusZeile(); setJMenuBar( jMenuBar = createMenu()); dateiDialog = new JFileChooser(); dateiDialog.addChoosableFileFilter( new DateiFilter("pngm","*.pngm (Petrinetz; gefärbten Marken)")); dateiDialog.setCurrentDirectory( new File(System.getProperty("user.dir"))); gefNetz = new Netz(0); //benötigt existierendes Menü!!! aktualisiereTitel( ""); zeichenflaeche = new JScrollPane( gefNetz, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); MatrizenRE = new JPanel( new BorderLayout( 0, 20)); //new GridLayout( 2, 1, 0, 3)); MatrizenRE.setBorder( new EmptyBorder(5,5,5,5)); MatrizenUN = new JPanel( new BorderLayout( 20, 0)); //new GridLayout( 1, 2, 3, 0)); MatrizenUN.setBorder( new EmptyBorder(5,5,5,5)); MatrizenRE.add( PlatzMatrixRE = new PlatzMatrixPanel( false), BorderLayout.NORTH); MatrizenRE.add( KanteMatrixRE = new KanteMatrixPanel( false), BorderLayout.SOUTH); MatrizenUN.add( PlatzMatrixUN = new PlatzMatrixPanel( false), BorderLayout.WEST); MatrizenUN.add( KanteMatrixUN = new KanteMatrixPanel( false), BorderLayout.EAST); MatrizenRE.setVisible(false); MatrizenUN.setVisible(false); JPanel jpanel = new JPanel( new BorderLayout(3,3)); jpanel.setBorder( new EmptyBorder( 3,3,3,3)); jpanel.add( zeichenflaeche, BorderLayout.CENTER); jpanel.add( MatrizenRE, BorderLayout.EAST); jpanel.add( MatrizenUN, BorderLayout.SOUTH); contentPane.add( jpanel, BorderLayout.CENTER); contentPane.add( jStatusBar, BorderLayout.SOUTH); defDialog = new DefDialog(this, "Definitionen"); hilfeDialog = new HilfeDialog(this, "Hilfe"); infoDialog = new InfoDialog(this, "Info"); neuDialog = new NeuDialog(this, "Eigenschaften des Netzes"); }//init private JMenuBar createMenu() { JMenuBar jMB = new JMenuBar(); myJMenu jMenu, jMenu2; /************************/ /* Untermenü Datei */ jMB.add( jMenu = new myJMenu("%Datei")); jMenu.add( new myJMenuItem("%Neu", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemDateiNeu_ActionPerformed(e); } })); jMenu.add( new myJMenuItem("Ö%ffnen...", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemDateiOeffnen_ActionPerformed(e); } })); jMenu.add( jMenuItemDSchli = new myJMenuItem("S%chließen", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemDateiSchliessen_ActionPerformed(e); } }, false)); jMenu.addSeparator(); jMenu.add( jMenuItemDSpeic = new myJMenuItem("%Speichern", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemDateiSpeichern_ActionPerformed(e); } }, false)); jMenu.add( jMenuItemDSpeicU = new myJMenuItem("Speichern %unter...", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemDateiSpeichernUnter_ActionPerformed(e); } }, false)); jMenu.addSeparator(); jMenu.add( new myJMenuItem("%Beenden", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemDateiBeenden_ActionPerformed(e); } })); /************************/ /* Untermenü Bearbeiten */ /************************/ jMB.add( jMenu = new myJMenu("%Bearbeiten")); jMenu.add( jMenuItemBAnleg = (jMenu2 = new myJMenu("%Anlegen von", false))); jMenu2.add( new myJMenuItem("%Plätzen", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemPlatzNeu_ActionPerformed(e); } })); jMenu2.add( new myJMenuItem("%Transitionen", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemTransitionNeu_ActionPerformed(e); } })); jMenu2.add( new myJMenuItem("%Kanten", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemKanteNeu_ActionPerformed(e); } })); jMenu.add( jMenuItemBEntf = (jMenu2 = new myJMenu("Ent%fernen von", false))); jMenu2.add( new myJMenuItem("%Plätzen", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemPlatzEntfernen_ActionPerformed(e); } })); jMenu2.add( new myJMenuItem("%Transitionen", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemTransitionEntfernen_ActionPerformed(e); } })); jMenu2.add( new myJMenuItem("%Kanten", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemKanteEntfernen_ActionPerformed(e); } })); jMenu.add( jMenuItemBEigen = new myJMenuItem("%Eigenschaften", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemEigenschaften_ActionPerformed(e); } }, false)); /************************/ /* Untermenü Ansicht */ jMB.add( jMenu = new myJMenu("%Ansicht")); jMenu.add( jMenuItemAVergr = new myJMenuItem("Netz %Vergrößern", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemAnsichtNetzVergroessern_ActionPerformed(e); } }, false)); jMenu.addSeparator(); jMenu.add( jMenuItemAMatrR = new myJMenuItem("Matrizen %Rechts", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemAnsichtMatrizenRechts_ActionPerformed(e); } }, false, false)); jMenu.add( jMenuItemAMatrU = new myJMenuItem("Matrizen %Unten", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemAnsichtMatrizenUnten_ActionPerformed(e); } }, false, false)); MatrizenSindRechts = false; /************************/ /* Untermenü Simulation */ jMB.add( jMenu = new myJMenu("%Simulation")); jMenu.add( jMenuItemSimBeg = new myJMenuItem("%Starten", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemSimulationStarten_ActionPerformed(e); } }, false)); jMenu.add( jMenuItemSimEnde = new myJMenuItem("%Beenden", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemSimulationBeenden_ActionPerformed(e); } }, false)); /************************/ /* Untermenü Beispiele */ jMB.add( jMenu = new myJMenu("B%eispiele")); jMenu.add( new myJMenuItem("Netz %1", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemBeispieleNetz1_ActionPerformed(e); } })); jMenu.add( new myJMenuItem("Netz %2", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemBeispieleNetz2_ActionPerformed(e); } })); jMenu.add( new myJMenuItem("Netz %3", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemBeispieleNetz3_ActionPerformed(e); } })); jMenu.add( new myJMenuItem("Netz %4", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemBeispieleNetz4_ActionPerformed(e); } })); jMenu.add( new myJMenuItem("Netz %5", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemBeispieleNetz5_ActionPerformed(e); } })); /************************/ /* Untermenü Hilfe */ jMB.add( jMenu = new myJMenu("%Hilfe")); jMenu.add( new myJMenuItem("%Erläuterungen", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemHilfeErlaeuterungen_ActionPerformed(e); } })); jMenu.add( new myJMenuItem("%Definitionen", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemHilfeDefinitionen_ActionPerformed(e); } })); jMenu.addSeparator(); jMenu.add( new myJMenuItem("%Info", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemHilfeInfo_ActionPerformed(e); } })); return jMB; }//createMenu /***************************************************/ /* weiterer funktioneller Teil */ /***************************************************/ private boolean NetzSpeichernUnter() { if (JFileChooser.APPROVE_OPTION==dateiDialog.showSaveDialog(this)) { repaint(); return NetzSpeichern(dateiDialog.getSelectedFile().getPath(), true); } return false; }//NetzSpeichernUnter private boolean NetzSpeichern(String dateiname, boolean ueberschreibenBestaetigen) { try { File Datei = new File (dateiname); //anlegen eines Datei-Objektes mit entsprechendem dateiname if (Datei.exists()) { //eine Datei (bzw. ein Objekt) mit diesem Namen existiert bereits if (!Datei.isFile()) //ist es keine Datei? throw new PetriNetzSpeichernException("Das Zeilobjekt [" + dateiname + "] ist keine Datei!"); if (!Datei.canWrite()) //ist es schreibgeschützt? throw new PetriNetzSpeichernException("Die Zieldatei [" + dateiname + "] ist schreibgeschützt!"); //Datei existiert und ist nicht schreibgeschützt //vom Benutzer Überscheiben Bestätigen lassen: (außer bei Datei|Speichern) if (ueberschreibenBestaetigen) { switch( Mitteilung( "Datei [" + dateiname + "] existiert bereits!
Soll sie überschreiben werden?", "Speichern", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE) ){ case JOptionPane.YES_OPTION: //Weitermachen und Datei überschreiben break; case JOptionPane.NO_OPTION: //nach neuem DateiNamen fragen menuItemDateiSpeichernUnter_ActionPerformed(null); return false; case JOptionPane.CANCEL_OPTION: //Speichern Abbrechen default: return false; } } } else { //KEINE Datei/Objekt mit diesem Namen existiert bereits File parentdir = parentDir(Datei); if (!parentdir.exists()) throw new PetriNetzSpeichernException( "Verzeichnis der Datei [" + dateiname + "] existiert nicht!"); if (!parentdir.canWrite()) throw new PetriNetzSpeichernException( "Verzeichnis der Datei [" + dateiname + "] ist schreibgeschützt!"); } //nun sind alle Eventualitäten ausgeschlossen! if (!gefNetz.Speichern(Datei)) throw new PetriNetzSpeichernException( "Beim Schreiben in die Datei [" + dateiname + "] ist ein unbekannter Fehler aufgetreten!"); jStatusBar.setText("Das Netz wurde in der Datei [" + dateiname + "] erfolgreich gespeichert."); return true; } catch (PetriNetzSpeichernException ex) { Mitteilung( "Beim Speichern ist folgender Fehler aufgetreten:
"+ ex.getMessage(), "Speichern misslungen", ABBRUCH_OPTION, JOptionPane.ERROR_MESSAGE); jStatusBar.setText("Fehler beim Speichern!"); } catch (IOException ex) { Mitteilung( "Beim Speichern ist folgender Fehler aufgetreten:
"+ ex.getMessage(), "Speichern misslungen", ABBRUCH_OPTION, JOptionPane.ERROR_MESSAGE); jStatusBar.setText("Fehler beim Speichern!"); } return false; }//NetzSpeichern private boolean NetzLaden(String dateiname) { try { File Datei = new File (dateiname); //anlegen eines Datei-Objektes mit entsprechendem dateiname if (!Datei.exists()) throw new PetriNetzLadenException("Die Zieldatei [" + dateiname + "] existiert nicht!"); if (!Datei.isFile()) throw new PetriNetzLadenException("Das Zielobjekt [" + dateiname + "] ist keine Datei!"); if (!Datei.canRead()) throw new PetriNetzLadenException("Die Zieldatei [" + dateiname + "] kann nicht gelesen werden!"); //nun sind alle Eventualitäten ausgeschlossen! //Objekt existiert, ist Datei und lesbar if (!gefNetz.Laden(Datei)) throw new PetriNetzLadenException("Beim Lesen der Datei [" + dateiname + "] ist ein unbekannter Fehler aufgetreten!"); jStatusBar.setText("Das Netz wurde aus der Datei [" + dateiname + "] erfolgreich gelesen."); return true; } catch (PetriNetzLadenException ex) { Mitteilung( "Beim Laden ist folgender Fehler aufgetreten:
"+ ex.getMessage(), "Laden misslungen", ABBRUCH_OPTION, JOptionPane.ERROR_MESSAGE); jStatusBar.setText("Fehler beim Laden!"); } catch (IOException ex) { Mitteilung( "Beim Laden ist folgender Fehler aufgetreten:
"+ ex.getMessage(), "Laden misslungen", ABBRUCH_OPTION, JOptionPane.ERROR_MESSAGE); jStatusBar.setText("Fehler beim Laden!"); } return false; }//NetzLaden private boolean AenderungenVerwerfen() { //wenn aktuelles Netz überschrieben wird, vorher nachfragen ob das passieren soll if (!gefNetz.getVeraendert()) return true; switch( Mitteilung( "Änderungen am aktuellen Netz speichern?", "Aenderungen Speichern?", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE) ){ case JOptionPane.YES_OPTION: if (gefNetz.hatDateiName()) return NetzSpeichern(gefNetz.getDateiName(), true); else return NetzSpeichernUnter(); // ja, Änderungen speichern //(also wenn Speichern erfolgreich true, sonst abbrechen mit false) case JOptionPane.NO_OPTION: return true; // nein, Änderungen verwerfen (also true zurückgeben ohne Speichern) case JOptionPane.CANCEL_OPTION: default: return false; // Abbrechen } }//AenderungenVerwerfen private static File parentDir(File f) {//gibt uebergeordnetes Objekt im Pfad von f zurück String dirname = f.getParent(); if( dirname==null ){ if (f.isAbsolute()) return new File(File.separator); else return new File(System.getProperty("user.dir")); } else return new File(dirname); }//parentDir // Anzeige des Dateinamens und des Geändert-Status in der Titelleiste der Anwendung protected void aktualisiereTitel(String DateiNameTitel) { setTitle( new String("Petrinetz: gefaerbte Marken - [" + DateiNameTitel + "]")); }//aktualisiereTitel //Beenden soll auch mit Kontextmenü/Rahmenelementen des Fensters möglich sein public void processWindowEvent(WindowEvent e) { if (e.getID() == WindowEvent.WINDOW_CLOSING) { if (AenderungenVerwerfen()) System.exit(0); else return; //sonst Abbrechen } super.processWindowEvent(e); }//processWindowEvent /***************************************************/ /* MouseEvents linke Taste InputEvent.BUTTON1_MASK mittlere Taste InputEvent.BUTTON2_MASK rechte Taste InputEvent.BUTTON3_MASK */ /***************************************************/ private class MyMouseListener implements MouseListener, MouseMotionListener { public void mouseClicked(MouseEvent e) { if( gefNetz.istModusEingabe() ) checkPopupMenuEingabe(e); else if( gefNetz.istModusSimulation() ) checkPopupMenuSimul(e); if( e.isConsumed() ) return; if( (e.getModifiers() & e.BUTTON1_MASK) == e.BUTTON1_MASK ){ //linke Maustaste Point mausKlickPkt = e.getPoint(); KlickBehandlung: { int objektTyp = gefNetz.getObjektTyp( mausKlickPkt); if( gefNetz.istModusEingabe() ){ if( maus.istStatus( Maus.STATUS.PLATZ_ANLEG) ){ //PlatzAnlegen Platz ePlatz; if( (ePlatz = gefNetz.PlatzAnlegen( mausKlickPkt)) != null ){ e.consume(); (new PlatzDialog( ePlatz)).show(); repaint(); } } else if( maus.istStatus( Maus.STATUS.PLATZ_ENTF) && (objektTyp==Netz.TYP_PLATZ) ){ //PlatzEntfernen if( gefNetz.PlatzEntfernen( mausKlickPkt) ) e.consume(); } else if( maus.istStatus( Maus.STATUS.TRANS_ANLEG) ){ //TransitionAnlegen Transition eTrans; if( (eTrans = gefNetz.TransitionAnlegen( mausKlickPkt)) != null ){ e.consume(); (new TransDialog( eTrans)).show(); repaint(); } } else if( maus.istStatus( Maus.STATUS.TRANS_ENTF) && (objektTyp==Netz.TYP_TRANS) ){ //TransitionEntfernen if( gefNetz.TransitionEntfernen( mausKlickPkt) ) e.consume(); } else if( maus.istStatus( Maus.STATUS.KANTE_ANLEG) ){ //KanteAnlegen if( maus.KanteKlickenStartPkt!=null ) { //Klick-Variante der Kanteneingabe Kante eKante; if( (eKante = gefNetz.KanteAnlegen( maus.KanteKlickenStartPkt, mausKlickPkt)) != null ){ e.consume(); Dialog dialog = new KanteDialog( eKante); dialog.show(); repaint(); } maus.KanteKlickenStartPkt = null; repaint(); } else if( (objektTyp==Netz.TYP_PLATZ) || (objektTyp==Netz.TYP_TRANS) ){ if( (maus.KanteKlickenStartPkt = gefNetz.getObjekt(mausKlickPkt).getMittelPkt()) != null ) e.consume(); } } else if( maus.istStatus( Maus.STATUS.KANTE_ENTF) && (objektTyp==Netz.TYP_KANTE) ){ //KanteEntfernen if( gefNetz.KanteEntfernen( mausKlickPkt) ) e.consume(); } if( !e.isConsumed() && (e.getClickCount()>=2) && (objektTyp!=Netz.TYP_NICHTDEF)){ //Eigenschaften ändern PN_Knoten pn = gefNetz.getObjekt(mausKlickPkt); if( pn==null ){ jStatusBar.setText("Kein gültiges Objekt zum Ändern von Eigenschaften gefunden!"); break KlickBehandlung; } switch( objektTyp) { case Netz.TYP_PLATZ: gefNetz.PlatzMarkieren( mausKlickPkt); (new PlatzDialog( (Platz)pn)).show(); break; case Netz.TYP_TRANS: gefNetz.TransitionMarkieren( mausKlickPkt); (new TransDialog( (Transition)pn)).show(); break; case Netz.TYP_KANTE: gefNetz.NichtsMarkieren(); (new KanteDialog( (Kante)pn)).show(); break; default: break KlickBehandlung; } e.consume(); repaint(); } } else if( maus.istStatus( Maus.STATUS.SIMULATION) ){ //Simulationsmodus if( objektTyp==Netz.TYP_TRANS ) { if( gefNetz.TransitionSchalten( mausKlickPkt) ) e.consume(); } } else { } }//KlickBehandlung } else if( (e.getModifiers() & e.BUTTON2_MASK) == e.BUTTON2_MASK ){ //mittlere Maustaste } else if( (e.getModifiers() & e.BUTTON3_MASK) == e.BUTTON3_MASK ){ //rechte Maustaste } }//mouseClicked public void mousePressed(MouseEvent e) { if( gefNetz.istModusEingabe() ) checkPopupMenuEingabe(e); else if( gefNetz.istModusSimulation() ) checkPopupMenuSimul(e); if( e.isConsumed() ) return; if( (e.getModifiers() & e.BUTTON1_MASK) == e.BUTTON1_MASK ){ //linke Maustaste Point p = e.getPoint(); if( gefNetz.istModusEingabe() ){ maus.ZiehtObjekt = null; if( maus.istStatus( Maus.STATUS.KANTE_ANLEG) ){ switch( gefNetz.getObjektTyp( p) ){ case Netz.TYP_PLATZ: case Netz.TYP_TRANS: if( (maus.KanteZiehenStartPkt = gefNetz.getObjekt( p).getMittelPkt()) != null ) e.consume(); break; default: maus.KanteZiehenStartPkt = null; } } } maus.LetztesLPress = p; } else if( (e.getModifiers() & e.BUTTON2_MASK) == e.BUTTON2_MASK ){ //mittlere Maustaste Point p = e.getPoint(); if( gefNetz.istModusEingabe() ){ maus.ZiehtObjekt = null; } maus.LetztesMPress = p; } else if( (e.getModifiers() & e.BUTTON3_MASK) == e.BUTTON3_MASK ){ //rechte Maustaste } }//mousePressed public void mouseReleased(MouseEvent e) { if( gefNetz.istModusEingabe() ) checkPopupMenuEingabe(e); else if( gefNetz.istModusSimulation() ) checkPopupMenuSimul(e); if( e.isConsumed() ) return; if( (e.getModifiers() & e.BUTTON1_MASK) == e.BUTTON1_MASK ){ //linke Maustaste Point p = e.getPoint(); if( gefNetz.istModusEingabe() ){ if( maus.istStatus( Maus.STATUS.KANTE_ANLEG) ){ if( maus.KanteZiehenStartPkt!=null ){ switch( gefNetz.getObjektTyp(p) ){ case Netz.TYP_PLATZ: case Netz.TYP_TRANS: Kante eKante; if( (eKante = gefNetz.KanteAnlegen( maus.KanteZiehenStartPkt, p)) != null ){ e.consume(); (new KanteDialog( eKante)).show(); repaint(); } default: } repaint(); } } maus.aktualisiereMausZeiger(); } //mausLetztesRelease = p; maus.KanteZiehenStartPkt = null; maus.ZiehtObjekt = null; } else if( (e.getModifiers() & e.BUTTON2_MASK) == e.BUTTON2_MASK ){ //mittlere Maustaste Point p = e.getPoint(); if( gefNetz.istModusEingabe() ){ maus.aktualisiereMausZeiger(); } //mausLetztesRelease = p; maus.KanteZiehenStartPkt = null; maus.ZiehtObjekt = null; } else if( (e.getModifiers() & e.BUTTON3_MASK) == e.BUTTON3_MASK ){ //rechte Maustaste } }//mouseReleased public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mouseDragged(MouseEvent e) { if( (e.getModifiers() & e.BUTTON1_MASK) == e.BUTTON1_MASK ){ //linke Maustaste Point p = e.getPoint(); if( gefNetz.istModusEingabe() ) if( maus.istStatus( Maus.STATUS.KANTE_ANLEG) ) if( maus.KanteZiehenStartPkt!=null ){ gefNetz.paint( gefNetz.getGraphics()); gefNetz.getGraphics().drawLine( maus.KanteZiehenStartPkt.x, maus.KanteZiehenStartPkt.y, p.x, p.y); e.consume(); } else; else { maus.setMausZeiger( Maus.ZEIGER.SCHIEBEN); if( maus.ZiehtObjekt==null ) switch( gefNetz.getObjektTyp(p) ){ case Netz.TYP_PLATZ: if( (maus.ZiehtObjekt = gefNetz.PlatzVerschieben( maus.LetztesLPress, p)) != null ) e.consume(); break; case Netz.TYP_TRANS: if( (maus.ZiehtObjekt = gefNetz.TransitionVerschieben( maus.LetztesLPress, p)) != null ) e.consume(); break; default: } else if( maus.ZiehtObjekt.isKlasse("Platz") ){ if( gefNetz.PlatzVerschieben( (Platz)maus.ZiehtObjekt, p) != null ) e.consume(); } else { if( gefNetz.TransitionVerschieben( (Transition)maus.ZiehtObjekt, p) != null ) e.consume(); } } } else if( (e.getModifiers() & e.BUTTON2_MASK) == e.BUTTON2_MASK ){ //mittlere Maustaste Point p = e.getPoint(); if( gefNetz.istModusEingabe() ) if( !maus.istStatus( Maus.STATUS.SIMULATION) ){ maus.setMausZeiger( Maus.ZEIGER.SCHIEBEN); if( maus.ZiehtObjekt==null ) switch( gefNetz.getObjektTyp(p) ){ case Netz.TYP_PLATZ: if( (maus.ZiehtObjekt = gefNetz.PlatzVerschieben( maus.LetztesMPress, p)) != null ) e.consume(); break; case Netz.TYP_TRANS: if( (maus.ZiehtObjekt = gefNetz.TransitionVerschieben( maus.LetztesMPress, p)) != null ) e.consume(); break; default: } else if( maus.ZiehtObjekt.isKlasse("Platz") ){ if( gefNetz.PlatzVerschieben( (Platz)maus.ZiehtObjekt, p) != null ) e.consume(); } else { if( gefNetz.TransitionVerschieben( (Transition)maus.ZiehtObjekt, p) != null ) e.consume(); } } } else if( (e.getModifiers() & e.BUTTON3_MASK) == e.BUTTON3_MASK ){ //rechte Maustaste } }//mouseDragged public void mouseMoved(MouseEvent e) { if( maus.istStatus( Maus.STATUS.KANTE_ANLEG) ){ if( maus.KanteKlickenStartPkt!=null ){ gefNetz.paint( gefNetz.getGraphics()); gefNetz.getGraphics().drawLine( maus.KanteKlickenStartPkt.x, maus.KanteKlickenStartPkt.y, e.getX(), e.getY()); } } }//mouseMoved }//MouseMenu private void createPopupSimul() { if( popupSimul==null ){ popupSimul = new JPopupMenu(); popupSimul.add( new myJMenuItem("%Simulation beenden", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemSimulationBeenden_ActionPerformed(e); } })); } }//createPopupSimul private void checkPopupMenuSimul(MouseEvent event) { if (event.isPopupTrigger()) { maus.setMausZeiger( Maus.ZEIGER.NORMAL); createPopupSimul(); popupSimul.show( event.getComponent(), event.getX(), event.getY()); } }//checkPopupMenuSimul private void createPopupEingabe() { if( popupEingabe==null ){ popupEingabe = new JPopupMenu(); JMenu jMenu2; popupEingabe.add( jMenu2 = new myJMenu("%Anlegen von")); jMenu2.add( new myJMenuItem("%Plätzen", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemPlatzNeu_ActionPerformed(e); } })); jMenu2.add( new myJMenuItem("%Transitionen", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemTransitionNeu_ActionPerformed(e); } })); jMenu2.add( new myJMenuItem("%Kanten", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemKanteNeu_ActionPerformed(e); } })); popupEingabe.add( jMenu2 = new myJMenu("Ent%fernen von")); jMenu2.add( new myJMenuItem("%Plätzen", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemPlatzEntfernen_ActionPerformed(e); } })); jMenu2.add( new myJMenuItem("%Transitionen", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemTransitionEntfernen_ActionPerformed(e); } })); jMenu2.add( new myJMenuItem("%Kanten", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemKanteEntfernen_ActionPerformed(e); } })); popupEingabe.add( new myJMenuItem("%Eigenschaften", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemEigenschaften_ActionPerformed(e); } })); popupEingabe.addSeparator(); popupEingabe.add( new myJMenuItem("%Simulation starten", new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemSimulationStarten_ActionPerformed(e); } })); } }//createPopupEingabe private void checkPopupMenuEingabe(MouseEvent event) { if (event.isPopupTrigger()) { maus.setMausZeiger( Maus.ZEIGER.NORMAL); createPopupEingabe(); popupEingabe.show( event.getComponent(), event.getX(), event.getY()); } }//checkPopupMenuEingabe protected class Maus { private int status; private int zeigerTyp; private boolean behandlungInstalliert; private MyMouseListener ereignisbehandlung; private Point LetztesLPress = null; private Point LetztesMPress = null; //private static Point LetztesRelease = null; bisher ohne Verwendung private PN_Knoten ZiehtObjekt = null; private Point KanteZiehenStartPkt = null; private Point KanteKlickenStartPkt = null; public class STATUS { public static final int NICHTS = 0; public static final int PLATZ_ANLEG = 1; public static final int PLATZ_ENTF = 2; public static final int TRANS_ANLEG = 4; public static final int TRANS_ENTF = 8; public static final int KANTE_ANLEG = 16; public static final int KANTE_ENTF = 32; public static final int EIGENSCHAFTEN = 64; public static final int SIMULATION = 128; private static final int ANLEG = PLATZ_ANLEG | TRANS_ANLEG | KANTE_ANLEG; private static final int ENTF = PLATZ_ENTF | TRANS_ENTF | KANTE_ENTF; //public static final int = ; } public class ZEIGER { public static final int NORMAL = 0; public static final int ZIELEN = 1; public static final int SCHIEBEN = 2; } public Maus() { status = STATUS.NICHTS; zeigerTyp = ZEIGER.NORMAL; setCursor( new Cursor(Cursor.DEFAULT_CURSOR)); behandlungInstalliert = false; ereignisbehandlung = new MyMouseListener(); } protected void setEreignisBehandlung(boolean enable) { if( enable && !behandlungInstalliert ){ zeichenflaeche.addMouseListener( ereignisbehandlung); zeichenflaeche.addMouseMotionListener( ereignisbehandlung); behandlungInstalliert = true; } else if( !enable && behandlungInstalliert ){ zeichenflaeche.addMouseListener( ereignisbehandlung); zeichenflaeche.addMouseMotionListener( ereignisbehandlung); behandlungInstalliert = false; } }//setEreignisBehandlung protected boolean istStatus(int testwert) { if( testwert == STATUS.NICHTS ) return status == STATUS.NICHTS; return (status & testwert) != STATUS.NICHTS; }//istStatus protected void setStatus(int neuerWert) { status = neuerWert; if( (neuerWert & STATUS.ANLEG ) != STATUS.NICHTS ) { gefNetz.NichtsMarkieren(); setMausZeiger( ZEIGER.ZIELEN); } else if( (neuerWert & (STATUS.ENTF | STATUS.EIGENSCHAFTEN | STATUS.SIMULATION)) != STATUS.NICHTS) { gefNetz.NichtsMarkieren(); setMausZeiger( ZEIGER.NORMAL); //} else if( (neuerWert & ) == ) { } else { /* NICHTS */ } jStatusBar.setText(""); }//setStatus protected void aktualisiereMausZeiger() { if( (status & STATUS.ANLEG) != STATUS.NICHTS ) { setMausZeiger( ZEIGER.ZIELEN); } else if( (status & (STATUS.ENTF | STATUS.EIGENSCHAFTEN | STATUS.SIMULATION)) != STATUS.NICHTS) { setMausZeiger( ZEIGER.NORMAL); } else { /* NICHTS */ setMausZeiger( ZEIGER.NORMAL); } }//aktualisiereMausZeiger protected boolean setMausZeiger(int neuerZeigerTyp) { if( neuerZeigerTyp==zeigerTyp ) return true; switch( neuerZeigerTyp ){ case ZEIGER.NORMAL: setCursor( new Cursor(Cursor.DEFAULT_CURSOR)); break; case ZEIGER.ZIELEN: setCursor( new Cursor(Cursor.CROSSHAIR_CURSOR)); break; case ZEIGER.SCHIEBEN: setCursor( new Cursor(Cursor.MOVE_CURSOR)); break; default: return false; } zeigerTyp = neuerZeigerTyp; return true; } }//Klasse: MausStatus /*************************************************************************/ /* ActionEvent-Funktionen für sämtliche (Haupt)-Menü-Einträge */ /*************************************************************************/ public void menuItemDateiNeu_ActionPerformed(ActionEvent e) { if (!AenderungenVerwerfen()) return; //Abbrechen neuDialog.show(); if (gefNetz.istGueltigeFarbanzahl( neuDialog.FarbAnzahl)) { repaint(); gefNetz.NeuesNetz(Netz.MODUS_EINGABE, neuDialog.FarbAnzahl); jStatusBar.setText("Ein neues Netz mit "+ neuDialog.FarbAnzahl+ " Farben wurde angelegt."); } else jStatusBar.setText("Erstellen eines neuen Netzes wurde abgebrochen!"); repaint(); }//menuItemDateiNeu_ActionPerformed public void menuItemDateiOeffnen_ActionPerformed(ActionEvent e) { if (!AenderungenVerwerfen()) return; //Abbrechen // mit dem Öffnen-Teil des dateiDialog den Namen der Datei erfragen // (wenn Benutzer abbricht, wird nicht geladen, altes Netz bleibt) if (JFileChooser.APPROVE_OPTION == dateiDialog.showOpenDialog(this)) { repaint(); // Laden des Netzes aus Datei (für Konsistenz bei Fehlern wird dort gesorgt!) NetzLaden( dateiDialog.getSelectedFile().getPath()); } repaint(); }//menuItemDateiOeffnen_ActionPerformed public void menuItemDateiSchliessen_ActionPerformed(ActionEvent e) { String alterdateiname; if (!AenderungenVerwerfen()) return; //Abbrechen if (gefNetz.hatDateiName()) alterdateiname = gefNetz.getDateiName(); else alterdateiname = "Unbenannt"; gefNetz.NeuesNetz(Netz.MODUS_NICHTS); jStatusBar.setText("Das Netz aus Datei [" + alterdateiname + "] wurde geschlossen."); repaint(); }//menuItemDateiSchliessen_ActionPerformed public void menuItemDateiSpeichern_ActionPerformed(ActionEvent e) { if (!gefNetz.hatDateiName()) { NetzSpeichernUnter(); } else { NetzSpeichern(gefNetz.getDateiName(), false); } repaint(); }//menuItemDateiSpeichern_ActionPerformed public void menuItemDateiSpeichernUnter_ActionPerformed(ActionEvent e) { NetzSpeichernUnter(); repaint(); }//menuItemDateiSpeichernUnter_ActionPerformed public void menuItemDateiBeenden_ActionPerformed(ActionEvent e) { if (AenderungenVerwerfen()) System.exit(0); //sonst Abbrechen von Beenden }//menuItemDateiBeenden_ActionPerformed /*********************************************************************/ /* Behandlung der Bearbeiten- & KontextMenü-Einträge */ /*********************************************************************/ public void menuItemPlatzNeu_ActionPerformed(ActionEvent e) { maus.setStatus( Maus.STATUS.PLATZ_ANLEG); repaint(); }//menuItemPlatzNeu_ActionPerformed public void menuItemPlatzEntfernen_ActionPerformed(ActionEvent e) { maus.setStatus( Maus.STATUS.PLATZ_ENTF); repaint(); }//menuItemPlatzEntfernen_ActionPerformed public void menuItemTransitionNeu_ActionPerformed(ActionEvent e) { maus.setStatus( Maus.STATUS.TRANS_ANLEG); repaint(); }//menuItemTransitionNeu_ActionPerformed public void menuItemTransitionEntfernen_ActionPerformed(ActionEvent e) { maus.setStatus( Maus.STATUS.TRANS_ENTF); repaint(); }//menuItemTransitionEntfernen_ActionPerformed public void menuItemKanteNeu_ActionPerformed(ActionEvent e) { maus.setStatus( Maus.STATUS.KANTE_ANLEG); jStatusBar.modusInfo("Kanten-Anlegen: Maus von Knoten zu Knoten, ziehen oder nacheinander anklicken"); repaint(); }//menuItemKanteNeu_ActionPerformed public void menuItemKanteEntfernen_ActionPerformed(ActionEvent e) { maus.setStatus( Maus.STATUS.KANTE_ENTF); repaint(); }//menuItemKanteEntfernen_ActionPerformed public void menuItemEigenschaften_ActionPerformed(ActionEvent e) { maus.setStatus( Maus.STATUS.EIGENSCHAFTEN); jStatusBar.modusInfo("Eigenschaften-Ändern: Doppelklicken"); repaint(); }//menuEinstellungen_ActionPerformed public void menuItemAnsichtMatrizenRechts_ActionPerformed(ActionEvent e) { jMenuItemAMatrU.setVisible( true); jMenuItemAMatrR.setVisible( false); MatrizenSindRechts = true; if( KanteMatrixUN.isVisible() ){ KanteMatrixRE.setVisible( true); KanteMatrixUN.setVisible( false); } if( PlatzMatrixUN.isVisible() ){ PlatzMatrixRE.setVisible( true); PlatzMatrixUN.setVisible( false); } MatrizenRE.setVisible( true); MatrizenUN.setVisible( false); }//menuItemAnsichtMatrizenRechts_ActionPerformed public void menuItemAnsichtMatrizenUnten_ActionPerformed(ActionEvent e) { jMenuItemAMatrR.setVisible( true); jMenuItemAMatrU.setVisible( false); MatrizenSindRechts = false; if( KanteMatrixRE.isVisible() ){ KanteMatrixUN.setVisible( true); KanteMatrixRE.setVisible( false); } if( PlatzMatrixRE.isVisible() ){ PlatzMatrixUN.setVisible( true); PlatzMatrixRE.setVisible( false); } MatrizenUN.setVisible( true); MatrizenRE.setVisible( false); }//menuItemAnsichtMatrizenUnten_ActionPerformed public void menuItemAnsichtNetzVergroessern_ActionPerformed(ActionEvent e) { gefNetz.Vergroessern( Netz.KOMPONENTEN_ABSTAND, Netz.KOMPONENTEN_ABSTAND, Netz.KOMPONENTEN_ABSTAND, Netz.KOMPONENTEN_ABSTAND); }//menuItemAnsichtNetzVergroessern_ActionPerformed public void menuItemSimulationStarten_ActionPerformed(ActionEvent e) { gefNetz.setModus(Netz.MODUS_SIMULATION); maus.setStatus( Maus.STATUS.SIMULATION); gefNetz.TransitionenTestSchalten(); //schaltfaehige Transitionen markieren jStatusBar.setText("...gestartet"); }//menuItemSimulationStarten_ActionPerformed public void menuItemSimulationBeenden_ActionPerformed(ActionEvent e) { gefNetz.setModus(Netz.MODUS_EINGABE); maus.setStatus( Maus.STATUS.NICHTS); gefNetz.TransitionenEndeSchalten(); jStatusBar.setText("Simulation beendet."); }//menuItemSimulationBeenden_ActionPerformed public void menuItemBeispieleNetz1_ActionPerformed(ActionEvent e) { if (!AenderungenVerwerfen()) return; //Abbrechen if( NetzLaden("BspNetz1.pngm") ) jStatusBar.setText("Beispiel Netz 1 geladen.");// Laden der Beispiel-Datei else jStatusBar.setText("Probleme beim Laden der Datei des Beispiel Netzes 1!"); repaint(); }//menuItemBeispielNetz1_ActionPerformed public void menuItemBeispieleNetz2_ActionPerformed(ActionEvent e) { if (!AenderungenVerwerfen()) return; //Abbrechen if( NetzLaden("BspNetz2.pngm") ) jStatusBar.setText("Beispiel Netz 2 geladen.");// Laden der Beispiel-Datei else jStatusBar.setText("Probleme beim Laden der Datei des Beispiel Netzes 2!"); repaint(); }//menuItemBeispielNetz2_ActionPerformed public void menuItemBeispieleNetz3_ActionPerformed(ActionEvent e) { if (!AenderungenVerwerfen()) return; //Abbrechen if( NetzLaden("BspNetz3.pngm") ) jStatusBar.setText("Beispiel Netz 3 geladen.");// Laden der Beispiel-Datei else jStatusBar.setText("Probleme beim Laden der Datei des Beispiel Netzes 3!"); repaint(); }//menuItemBeispielNetz3_ActionPerformed public void menuItemBeispieleNetz4_ActionPerformed(ActionEvent e) { if (!AenderungenVerwerfen()) return; //Abbrechen if( NetzLaden("BspNetz4.pngm") ) jStatusBar.setText("Beispiel Netz 4 geladen.");// Laden der Beispiel-Datei else jStatusBar.setText("Probleme beim Laden der Datei des Beispiel Netzes 4!"); repaint(); }//menuItemBeispielNetz4_ActionPerformed public void menuItemBeispieleNetz5_ActionPerformed(ActionEvent e) { if (!AenderungenVerwerfen()) return; //Abbrechen if( NetzLaden("BspNetz5.pngm") ) jStatusBar.setText("Beispiel Netz 5 geladen.");// Laden der Beispiel-Datei else jStatusBar.setText("Probleme beim Laden der Datei des Beispiel Netzes 5!"); repaint(); }//menuItemBeispielNetz5_ActionPerformed public void menuItemHilfeErlaeuterungen_ActionPerformed(ActionEvent e) { hilfeDialog.show(); repaint(); }//menuItemHilfeErlaeuterungen_ActionPerformed public void menuItemHilfeDefinitionen_ActionPerformed(ActionEvent e) { defDialog.show(); repaint(); }//menuItemHilfeDefinitionen_ActionPerformed public void menuItemHilfeInfo_ActionPerformed(ActionEvent e) { infoDialog.show(); repaint(); }//menuItemHilfeInfo_ActionPerformed /**************************************************/ /* lokale, wiederkehrende Methoden */ /**************************************************/ protected static int Mitteilung(String mitteilung, String titel, int mitteilungsTyp, Object[] buttonTexte, Object standardwert) { JFrame p = null; if( Petri.frame!=null ) p = Petri.frame; return JOptionPane.showOptionDialog( p, ""+ mitteilung+ "", titel, JOptionPane.DEFAULT_OPTION, mitteilungsTyp, null, buttonTexte, standardwert); } protected static int Mitteilung(String mitteilung, String titel, int option, int mitteilungsTyp) { JFrame p = null; if( Petri.frame!=null ) p = Petri.frame; Object[] buttontexte; int ergebnis; switch( option) { case JOptionPane.DEFAULT_OPTION: buttontexte = new Object[] {"OK"}; ergebnis = JOptionPane.showOptionDialog( p, ""+ mitteilung+ "", titel, JOptionPane.DEFAULT_OPTION, mitteilungsTyp, null, buttontexte, buttontexte[0]); if( ergebnis==0 ) return JOptionPane.OK_OPTION; return ergebnis; case JOptionPane.OK_CANCEL_OPTION: buttontexte = new Object[] {"OK", "Abbrechen"}; ergebnis = JOptionPane.showOptionDialog( p, ""+ mitteilung+ "", titel, JOptionPane.DEFAULT_OPTION, mitteilungsTyp, null, buttontexte, null); if( ergebnis==0 ) return JOptionPane.OK_OPTION; if( ergebnis==1 ) return JOptionPane.CANCEL_OPTION; return ergebnis; case JOptionPane.YES_NO_CANCEL_OPTION: buttontexte = new Object[] {"Ja", "Nein", "Abbrechen"}; ergebnis = JOptionPane.showOptionDialog( p, ""+ mitteilung+ "", titel, JOptionPane.DEFAULT_OPTION, mitteilungsTyp, null, buttontexte, null); if( ergebnis==0 ) return JOptionPane.YES_OPTION; if( ergebnis==1 ) return JOptionPane.NO_OPTION; if( ergebnis==2 ) return JOptionPane.CANCEL_OPTION; return ergebnis; case JOptionPane.YES_NO_OPTION: buttontexte = new Object[] {"Ja", "Nein"}; ergebnis = JOptionPane.showOptionDialog( p, ""+ mitteilung+ "", titel, JOptionPane.DEFAULT_OPTION, mitteilungsTyp, null, buttontexte, null); if( ergebnis==0 ) return JOptionPane.YES_OPTION; if( ergebnis==1 ) return JOptionPane.NO_OPTION; return ergebnis; case WEITER_OPTION: buttontexte = new Object[] {"Weiter"}; ergebnis = JOptionPane.showOptionDialog( p, ""+ mitteilung+ "", titel, JOptionPane.DEFAULT_OPTION, mitteilungsTyp, null, buttontexte, buttontexte[0]); if( ergebnis==0 ) return WEITER_OPTION; return ergebnis; case ABBRUCH_OPTION: buttontexte = new Object[] {"Abbrechen"}; ergebnis = JOptionPane.showOptionDialog( p, ""+ mitteilung+ "", titel, JOptionPane.DEFAULT_OPTION, mitteilungsTyp, null, buttontexte, buttontexte[0]); if( ergebnis==0 ) return ABBRUCH_OPTION; return ergebnis; default: return JOptionPane.showOptionDialog( p, ""+ mitteilung+ "", titel, option, mitteilungsTyp, null, null, null); } } protected class StatusZeile extends JLabel{ private String alterEinfacherText; public void modusInfo(String info) { setText(info); alterEinfacherText = null; }//modusInfo public void setText(String text) { String anfang = ""; if( (Petri.frame!=null) && (gefNetz!=null) ){ if( gefNetz.istModusEingabe() ){ anfang = "Eingabemodus"; if( maus.istStatus( Maus.STATUS.KANTE_ANLEG) ) anfang+= "   |   Kante anlegen"; if( maus.istStatus( Maus.STATUS.KANTE_ENTF) ) anfang+= "   |   Kante entfernen"; if( maus.istStatus( Maus.STATUS.PLATZ_ANLEG) ) anfang+= "   |   Platz anlegen"; if( maus.istStatus( Maus.STATUS.PLATZ_ENTF) ) anfang+= "   |   Platz entfernen"; if( maus.istStatus( Maus.STATUS.TRANS_ANLEG) ) anfang+= "   |   Transition anlegen"; if( maus.istStatus( Maus.STATUS.TRANS_ENTF) ) anfang+= "   |   Transition entfernen"; if( maus.istStatus( Maus.STATUS.EIGENSCHAFTEN) ) anfang += "   |   Eigenschaften ändern"; } else if( gefNetz.istModusSimulation() ) anfang = "Simulation"; else if( gefNetz.istModusNichts() ) anfang = "kein Netz"; } if( (text.length()==0) && (alterEinfacherText!=null) ){ super.setText( "" + anfang+ "    =>    "+ alterEinfacherText + ""); } else { super.setText( "" + anfang+ "    =>    "+ text + ""); alterEinfacherText = text; } }//setText }//StatusZeile }//PetriFrame /*****************************************************************************/ /* Exception-Deklarationen */ /*****************************************************************************/ class PetriNetzSpeichernException extends IOException { public PetriNetzSpeichernException(String botschaft) { super(botschaft); } }//PetriNetzSpeichernException class PetriNetzLadenException extends IOException { public PetriNetzLadenException(String botschaft) { super(botschaft); } }//PetriNetzLadenException