> Inhalt: JavaScout-Fat-Client-Framework (JS-FCF) 

> Verzeichnis der Dokumente mit den Muster-Codes 

Muster-Code für die Klassen eines Task-Frames

* Bitte beachten Sie die Hinweise und Bestimmungen bezüglich Urheberrecht, Haftungsausschluß und geschützte Marken oder Warenzeichen die für dieses Web-Dokument und möglicherweise auch für 'verlinkte' Dokumente gelten.

  • Der Betreiber dieser Web-Site (www.javascout.biz) ist nicht verantwortlich für den Inhalt von Web-Sites, die innerhalb dieses Web-Dokumentes oder anderer Dokumente von www.javascout.biz verlinkt sind.

  • Wenn dieses Web-Dokument oder andere Dokumente dieser Web-Site (www.javascout.biz) Rechte von Ihnen verletzen, oder sie glauben, dass Rechte Anderer (Dritter Personen) dadurch verletzt werden, informieren Sie bitte den Betreiber dieser Web-Site.
    Eine E-Mail können Sie ganz einfach durch anklicken des Symbols oder Textes im Frame rechts oben senden.

Dieses Dokument drucken.

 Letzte Bearbeitung dieses  Dokuments:
2013-01-15

Voraussetzungen für das Verständnis dieses Dokuments:

Grundkenntnisse in der Programmierung von Java (Klassen, Methoden, Schleifen).

Ungefährer Zeitbedarf zum Durcharbeiten dieses Dokuments:

Arbeitszeit: 
Abhängig von der Routine beim 'Find and Replace'.
Als Basis für das Erstellen der Klasse sind ca. 30 bis 60 Minuten zu kalkulieren.
Dazu kommen noch ca. 30 bis 60 Minuten für jedes zu definierende GUI-Element.

Ist ein komplexer Algorithmus notwendig (z.B. die Änderung von Feldern mit verpflichtender Eingabe in Abhängigkeit von der Auswahl in einer Combo-Box) ist die dafür notwendige Zeit zusätzlich zu schätzen.

Dieses Dokument enthält Code-Muster für die Klasse für ein Task-Frame und Erweiterungen, die entsprechend den jeweiligen Anforderungen zusätzlich implementiert werden können.

Inhaltsverzeichnis:

Vorbedingung 
Muster-Code für die Klasse für das Frame (GUI)
 
Muster-Code für die Klasse für den ActionHandler
 
Muster-Code für die Klasse für den DocumentListener
 

Anleitung zur Adaptierung in allen Klassen 
* Änderung des Namens des Java-Packages 
* Änderung des Namens der Klassen 
* Adaptieren der Kommentare 
* Änderung der Variablen-Namen für die BO-Klassen (BO und BOC) 


Anleitung zur Adaptierung in der Klasse für das Frame (GUI) 
* Änderung des Namens der Klasse des CommandCenters 
* Definieren der Variablen für die 'aufzuhebenden' Selektionskriterien für die Anzeige der Liste 
* Definieren der Variablen für die GUI-Elemente 
* Einsetzen des internen Codes für den Aufruf des Task-Frames 
* Adaptieren der 'Constructor'-Methoden für jedes GUI-Element 
* Aufnehmen der GUI-Elemente in das
pnl_DetailFields 
* Aufnehmen der GUI-Elemente in das
pnl_ListFields (nach Bedarf) 
* Festlegen von Feldern mit verpflichtender Eingabe 
* Reagieren auf Änderungen der Spaltenbreite in JTables - Methode
columnMarginChanged(...) 

Anleitung zur Adaptierung bei Verwendung von Währungen in der Klasse für die GUI 
* Adaptieren in der Methode
initialize_frame 
* Adaptieren in der Methode
initialize_after_frame 

Anleitung zur Adaptierung in der Klasse für den ActionHandler 
* Festlegen des 'ActionCommand' für eine Schaltfläche zur Anzeige der Liste – Methode
handleEvent(...) 
* 'Aufheben' der Werte für die Auswahlkriterien - Methode
getSelectionCriteria(...)
* Eventuelle Adaptierungen in der Methode 
processAfterConstruction(...)
* Verarbeiten eventuell im CommandCenter eingegebener Parameter - Methode 
processCCParameter(...)
* Adaptieren der Methode 
setToGUI(...)
* Adaptieren der Methoden 
setFieldsForInsert(...) und setFieldsForUpdate(...)
* Adaptieren der Methode 
redisplayBOList(...)
* Adaptieren der Methode 
store(...)
* Adaptieren der Methode 
copy(...)
* Adaptieren der Methoden
getNext(...) und getPrevious(...)
* Adaptieren der Methode 
getSingleBO(...)
* Adaptieren der Methode 
getForUpdate(...)
* Adaptieren der Methode 
processDeactivate(...)

Anleitung zur Adaptierung in der Klasse für den DocumentListener 
* Definieren der Variable für 'Document's und 'Flag's 
* Zuweisen der Referenz auf das 'Document' des GUI-Elements im 'Constructor' 
* Erstmaliges Setzen der 'Flag's im 'Constructor' 
* Reagieren auf Eingaben - Methode
anyUpdate(...) 
* Reagieren auf Änderungen bei CheckBoxes, RadioButtons und ComboBoxes - Methode 
itemStateChanged(...) 
* Zusammenfassen der Flags für korrekte / fehlerhafte Eingaben - Methode 
checkEntriesOK() 

Spezieller Muster-Code 
* Übernehmen von Werten aus den Parameter-Feldern des CommandCenter 


Weitere Schritte und verwandte Dokumentation 

Vorbedingung:

zum Inhaltsverzeichnis

Muster-Code für die Klasse für das Frame (GUI)

Welche Platzhalter durch Bezeichnungen des eigentlichen Projektes zu ersetzen sind finden Sie im Abschnitt
Anleitung zur Adaptierung in allen Klassen und
Anleitung zur Adaptierung in der Klasse für das Frame (GUI) .

package application_package.client;
/*
 * Packages mit den GUI-Elementen. */

import java.awt.*;
import javax.swing.*;
/*
 * Packages mit den Klassen zum Bearbeiten von Events */

import java.awt.event.*;
import javax.swing.event.*;
/*
 * Package mit der Basisklasse für das TaskFrame. */

import js_base.frame.*;
/*
 * Package mit den Business-Objects. */

import application_package.boc.*;
/**
 * 
 * @author name[at]company
 * @date 20xx-xx-xx
 *
 * @description
 *  Klasse für den Aufbau der Benutzeroberfläche eines Frames (Fensters)
 *  für die Geschäftsanwendung (Task)
 *  
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.
 *
 *  Die Geschäftsanwendung (Task) ermöglicht
 *  
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.
 * 
 * @change-log
 * when          who                       why
 * -----------------------------------------------------------------
 * 
 */

public class application_task extends JSBS_TaskFrame {
/*
 * Variable für die Referenz auf die Klasse des Start-Frame (CommandCenter). */

    
protected application_CommandCenter frmCC;
/*
 * Zugehöriges DocumentListener Objekt definieren. */

    
protected application_task__DocumentListener
                
structapplication_task__DocumentListener;
/*
 * Business-Objects (Client-Side-Klasse)
 * für die Detail-Anzeige und-Bearbeitung definieren. */

    
protected application_entity_BOC
                
structapplication_entity_BOC_Read;
    
protected application_entity_BOC
                
structapplication_entity_BOC_Processed;
/*
 * Liste mit Business-Objects (Client-Side-Klasse)
 * für die Auswahl-Liste definieren. */

    
protected application_entity_BOC_Set
                
structapplication_entity_BOC_Set;
/*
 * Werte der Selektion für die Anzeige der Auswahl-Liste.
 * Diese werden gesetzt wenn die Liste neu angezeigt wird und werden gebraucht,
 * wenn die Liste neu angezeigt werden soll aber die GUI-Elemente für die Auswahl
 * schon geändert sein können.
 * Das ist der Fall, wenn ein BO gelöscht wurde. */

    
protected int int_Selection_VariableName_1 = 0;
    
protected String str_Selection_VariableName_2 = "";
/*
 * Muster-GUI-Elemente;
 * Diese sind durch jene GUI-Elemente, die für diesen Task-Frame spezifisch sind,
 * zu ersetzen. */

    
private JSBS_Dividerline dl_Sample_Areas_To_Be_Separated;
    
protected JLabel lbl_Sample_JLabel_Right;
    
protected JLabel lbl_Sample_JLabel_Left;
    
protected JTextField txt_Sample_JTextField;
    
protected JTextArea txt_Sample_JTextArea;
    
protected JList lst_Sample_JList;
    
protected JComboBox combo_Sample_JComboBox;
    
protected JCheckBox chk_Sample_JCheckBox;
    
protected JRadioButton rbtn_Sample_JRadioButton_1;
    
protected JRadioButton rbtn_Sample_JRadioButton_2;
    
protected ButtonGroup btngrp_Sample_ButtonGroup = new ButtonGroup();
    
protected JButton btn_Sample_JButton;
    
protected JSBS_ImagePane img_Sample_ImagePane;
/*
 * Constructor der Klasse.
 * Code darin wird aufgerufen wenn ein Objekt dieser Klasse erstellt wird.
 * Als Parameter wird das StartFrame (CommandCenter) und die Parameter,
 * die der Anwender bereits im StartFrame erfaßt hat, übernommen.
 * Das StartFrame enthält alle Einstellungen, die für die gesamte Anwendung gelten
 * und die Klassen für die Verbindung zur Datenbank oder
 * zum Java-Application-Server (JAS).
 * Die Parameter, die der Anwender bereits im StartFrame erfaßt hat,
 * steuern individuell für jedes TaskFrame, welche Liste oder welches einzelne BO
 * sofort nach der 'Konstruktion' des TaskFrame angezeigt wird. */

    public application_task(application_CommandCenter parmCC) {
/*
 * Aufruf des Constructors der Basisklasse (JSBS_TaskFrame).
 * Darin werden die Klasse des StartFrames und eventuell Werte einzelner Variablen
 * in lokale Variablen übertragen. */

        
super (parmCC, parmCC.get_txt_Parameter1().getText(),
               parmCC.get_txt_Parameter2().getText(), parmCC.get_txt_Parameter3().getText());
/*
 * Übernehmen der Klasse des CommandCenters in die dafür bestimmte Variable dieser Klasse. */

        
frmCC = parmCC;
/* 
 * Aufrufen der Methoden mit den individuellen Initialisierungen für diese Klasse. */

        initialize_before_frame();
        initialize_frame();
        initialize_after_frame();
    }
/* 
 * Methode mit den Initialisierungen die notwendig sind bevor das Frame (Window)
 * angezeigt wird. */

    
private void initialize_before_frame() {
/* 
 * 'Konstruieren' der Business-Objects, die in diesem Task-Frame verwendet werden. */

      
structapplication_entity_BOC_Read =
                
new application_entity_BOC(frmCC, this);
      
structapplication_entity_BOC_Processed =
                
new application_entity_BOC(frmCC, this);
      
structapplication_entity_BOC_Set =
                
new application_entity_BOC_Set(frmCC, this);
    }
/* 
 * Methode mit der das Frame (Window) angezeigt wird. */

    
private void initialize_frame() {
/* Frame (Window) sichtbar machen (anzeigen). */
      setVisible(
true);
/* Anfangsgröße festlegen. */
      setSize(800, 600);
/* Grund-Panel mit den weiteren GUI-Elementen anzeigen.
 * Die GUI-Elemente und deren Anordnung sind in der geerbten Klasse
 * (JSBS_TaskFrame) festgelegt. */

      setContentPane(get_pnl_Main());
/* 
 * Wenn in Ihrer Anwendung die Auswahl von Währungen möglich sein soll,
 * dann kommentieren Sie bitte die folgende Zeile aus und setzen die
 * Zeile oberhalb unter Kommentar. */

//      setContentPane(get_pnl_Main_With_Currency_Selection());
/*
 * Methode aufrufen die die Größe und Position des Fensters beim letzten Schließen
 * wieder herstellen.
 * Die dafür notwendige Datenstruktur und die aufgerufenen Methode ist in der
 * geerbten Basisklasse codiert. */

      setFramePosition();

/* Mouse-Listener zu der JTable, in der die auswählbaren Business-Objects angezeigt
 * werden, hinzufügen. Damit wird beim Anklicken einer Zeile der JTable die Nummer der
 * Zeile in das JTextField für die Auswahl (txt_Selection) übertragen.
 * Das Feststellen der Zeile und das Übertragen wird durch eine Methode in der
 * geerbten Basisklasse durchgeführt. */

      get_pnl_SelectionListTable().addMouseListener(
this);
    }
/* 
 * Methode mit den Initialisierungen die notwendig sind nachdem das Frame (Window)
 * angezeigt wird. */

    
private void initialize_after_frame() {
/* Methode zum Zuordnen des sprachabhängigen Textes zu den GUI-Elementen aufrufen. */
      JSBS_GUIServices.processLanguageDependantElements(
this);
/* GUI-Elemente, bei denen eine Eingabe zwingend erforderlich ist ('Mandatory'),
 * festlegen. Die Festlegung hier ist 'stärker' als eine eventuelle Prüf-Regel
 * in der Datei 'DisplayStrings.xml'. */

      
structJSBS_EntryRules.addApplicationMandatoryGUIElement(get_txt_SampleJTextField());
/* DocumentListener konstruieren und anschließend die Methode der geerbten Klasse
 * aufrufen mit der die notwendigen Listener zu den GUI-Elementen hinzugefügt werden. */

      
structapplication_task__DocumentListener =
          
new application_task__DocumentListener(this);
      addListeners(
this.getContentPane(), structapplication_task__DocumentListener);
/*
 * Border (Ränder der GUI-Elemente) einfärben damit sie besser sichtbar sind. */

/* Zuerst jenes Elemente vom Typ JPanel festlegen, das eingefärbt werden soll. */
      
arrayJPanelBordersToBeColored = new JPanel[1];
      
arrayJPanelBordersToBeColored[0] = get_pnl_Main();
/* 
 * Wenn in Ihrer Anwendung die Auswahl von Währungen möglich sein soll,
 * dann kommentieren Sie bitte die folgende Zeile aus und setzen die
 * Zeile oberhalb unter Kommentar. */

//      arrayJPanelBordersToBeColored[0] = get_pnl_Main_With_Currency_Selection();
/* 
 * Methode aufrufen mit der die 'Border' eingefärbt werden. */

      JSBS_GUIServices.processBorders(
this);
/*
 * Eintragen dieses Tasks in die Tabelle beim CommandCenter.
 * Der von der aufgerufenen Methode zurückgelieferte ID wird verwendet
 * wenn die angezeigten Daten verändert werden sollen.
 * Das Verändern der angezeigten Daten ist sinnvoll, wenn der Anwender einen
 * Datensatz aus der Liste auswählt (Methode 'getForUpdate(..)' in der Klasse
 * xxx__ActionHandler.
 * Der 2. Parameter beim Aufruf der Methode ist der interne Code dieser Klasse
 * in der Datei 'Tasks.xml'.
 * Der 3. Parameter ist eine Kurzfassung der angezeigten Daten;
 * diese Daten sind jetzt noch nicht vorhanden. */

      
dblCC_TaskID = frmCC.addOpenTaskFrame(this, "internal_Selection_Code", "");
/* 
 * Methode, die nach der 'Construction' der Klasse ausgeführt werden soll, aufrufen.
 * Eine nähere Beschreibung ist im Kommentar zu dieser Methode. */

      
application_task__ActionHandler.processAfterConstruction(this);
/*
 * Methode aufrufen, die die Combobox für die Auswahl der Währung füllt.
 * Anschließend die gewählte Währung aus dem StartFrame (CommandCenter)
 * übernehmen.
 * Wenn in Ihrer Anwendung die Auswahl von Währungen möglich sein soll,
 * dann entfernen Sie bitte den Kommentar vor den folgenden Zeilen. */

//      frmCC.fillComboBoxWithCurrencies(get_combo_CurrencySelection());
//      JSBS_GUIServices.setJComboBoxItem(get_combo_CurrencySelection(),
//            frmCC.structJSBS_UniversalParameters.strPreferredCurrency,
//            frmCC.structJSBS_UniversalParameters, true);
    }
/* 
 * ******************************
 * Methoden zum 'Construct' (Initialisierung) der einzelnen GUI-Elemente.
 * Die Muster-GUI-Elemente sind durch jene für die Geschäftsanwendung zu ersetzen.
 * */

    
private JSBS_Dividerline get_dl_Sample_Areas_To_Be_Separated() {
/* Zuerst Prüfen, ob die Variable bereits 'constructed' (initialisiert) ist. */
      
if (dl_Sample_Areas_To_Be_Separated == null) {
/* Variable noch nicht 'constructed'; Code für die Initialisierung folgt. */
        
try {
          
dl_Sample_Areas_To_Be_Separated = new JSBS_Dividerline();
          
dl_Sample_Areas_To_Be_Separated.setName("dl_Sample_Areas_To_Be_Separated");
        }
        
catch (Throwable Exc) {
/* Fehler beim 'construct' ist sehr unwahrscheinlich und kann nur beim 'Starten'
 * des Tasks auftreten.
 * Deswegen werden Fehlermeldungen nur auf der Konsole ausgegeben. */

          System.
out.println("Error while building dl_Sample_Areas_To_Be_Separated in class application_task.");
          Exc.printStackTrace();
        }
      }
      
return dl_Sample_Areas_To_Be_Separated;
    }
/* */
    
protected JLabel get_lbl_Sample_JLabel_Right() {
/* Zuerst Prüfen, ob die Variable bereits 'constructed' (initialisiert) ist. */
      
if (lbl_Sample_JLabel_Right == null) {
/* Variable noch nicht 'constructed'; Code für die Initialisierung folgt. */
        
try {
          
lbl_Sample_JLabel_Right = new JLabel();
          
lbl_Sample_JLabel_Right.setName("lbl_Sample_JLabel_Right");
          
lbl_Sample_JLabel_Right.setHorizontalAlignment(SwingConstants.TRAILING);
/* Mit folgender Code-Zeile wird das GUI-Element mit einem Text versehen.
 * Damit ist auf der GUI der Name des GUI-Elementes zu sehen solange noch kein
 * sprach-spezifischer Text definiert ist. */

          
lbl_Sample_JLabel_Right.setText("lbl_Sample_JLabel_Right");
        }
        
catch (Throwable Exc) {
/* Fehler beim 'construct' ist sehr unwahrscheinlich und kann nur beim 'Starten'
 * des Tasks auftreten.
 * Deswegen werden Fehlermeldungen nur auf der Konsole ausgegeben. */

          System.
out.println("Error while building lbl_Sample_JLabel_Right in class application_task.");
          Exc.printStackTrace();
        }
      }
      
return lbl_Sample_JLabel_Right;
    }
/* */
    
protected JLabel get_lbl_Sample_JLabel_Left() {
/* Zuerst Prüfen, ob die Variable bereits 'constructed' (initialisiert) ist. */
      
if (lbl_Sample_JLabel_Left == null) {
/* Variable noch nicht 'constructed'; Code für die Initialisierung folgt. */
        
try {
          
lbl_Sample_JLabel_Left = new JLabel();
          
lbl_Sample_JLabel_Left.setName("lbl_Sample_JLabel_Left");
          
lbl_Sample_JLabel_Left.setHorizontalAlignment(SwingConstants.LEADING);
/* Mit folgender Code-Zeile wird das GUI-Element mit einem Text versehen.
 * Damit ist auf der GUI der Name des GUI-Elementes zu sehen solange noch kein
 * sprach-spezifischer Text definiert ist. */

          
lbl_Sample_JLabel_Left.setText("lbl_Sample_JLabel_Left");
        }
        catch (Throwable Exc) {
/* Fehler beim 'construct' ist sehr unwahrscheinlich und kann nur beim 'Starten'
 * des Tasks auftreten.
 * Deswegen werden Fehlermeldungen nur auf der Konsole ausgegeben. */
          System.
out.println("Error while building lbl_Sample_JLabel_Left in class application_task.");
          Exc.printStackTrace();

        }
      }
      return lbl_Sample_JLabel_Left;
    }
/* */
    protected JTextField get_txt_Sample_JTextField() {
/* Zuerst Prüfen, ob die Variable bereits 'constructed' (initialisiert) ist. */
      if (txt_Sample_JTextField == null) {
/* Variable noch nicht 'constructed'; Code für die Initialisierung folgt. */
        try {
          txt_Sample_JTextField = new JTextField();
          txt_Sample_JTextField.setName("txt_Sample_JTextField");
          txt_Sample_JTextField.setHorizontalAlignment(SwingConstants.LEADING);
/* Das folgende Kommando ('TRAILING') wird verwendet wenn das Eingabefeld für einen numerischen Wert ist. */
          
txt_Sample_JTextField.setHorizontalAlignment(SwingConstants.TRAILING);
        }
        catch (Throwable Exc) {
/* Fehler beim 'construct' ist sehr unwahrscheinlich und kann nur beim 'Starten'
 * des Tasks auftreten.
 * Deswegen werden Fehlermeldungen nur auf der Konsole ausgegeben. */
          System.out.println("Error while building txt_Sample_JTextField in class application_task.");
          Exc.printStackTrace();
        }
      }
      return txt_Sample_JTextField;
    }
/* */
    protected JTextArea get_txt_Sample_JTextArea() {
/* Zuerst Prüfen, ob die Variable bereits 'constructed' (initialisiert) ist. */
      if (txt_Sample_JTextArea == null) {
/* Variable noch nicht 'constructed'; Code für die Initialisierung folgt. */
        try {
          txt_Sample_JTextArea = new JTextArea();
          txt_Sample_JTextArea.setName("txt_Sample_JTextArea");
        }
        catch (Throwable Exc) {
/* Fehler beim 'construct' ist sehr unwahrscheinlich und kann nur beim 'Starten'
 * des Tasks auftreten.
 * Deswegen werden Fehlermeldungen nur auf der Konsole ausgegeben. */
          System.out.println("Error while building txt_Sample_JTextArea in class application_task.");
          Exc.printStackTrace();
        }
      }
      return txt_Sample_JTextArea;
    }
/* */
    protected JList get_lst_Sample_JList() {
/* Zuerst Prüfen, ob die Variable bereits 'constructed' (initialisiert) ist. */
      if (lst_Sample_JList == null) {
/* Variable noch nicht 'constructed'; Code für die Initialisierung folgt. */
        try {
          lst_Sample_JList = new JList();
          lst_Sample_JList.setName("lst_Sample_JList");
        }
        catch (Throwable Exc) {
/* Fehler beim 'construct' ist sehr unwahrscheinlich und kann nur beim 'Starten'
 * des Tasks auftreten.
 * Deswegen werden Fehlermeldungen nur auf der Konsole ausgegeben. */
          System.out.println("Error while building lst_Sample_JList in class application_task.");
          Exc.printStackTrace();
        }
      }
      return lst_Sample_JList;
    }
/* */
    protected JComboBox get_combo_Sample_JComboBox() {
/* Zuerst Prüfen, ob die Variable bereits 'constructed' (initialisiert) ist. */
      if (combo_Sample_JComboBox == null) {
/* Variable noch nicht 'constructed'; Code für die Initialisierung folgt. */
        try {
          combo_Sample_JComboBox = new JComboBox();
          combo_Sample_JComboBox.setName("combo_Sample_JComboBox");
        }
        catch (Throwable Exc) {
/* Fehler beim 'construct' ist sehr unwahrscheinlich und kann nur beim 'Starten'
 * des Tasks auftreten.
 * Deswegen werden Fehlermeldungen nur auf der Konsole ausgegeben. */
          System.out.println("Error while building combo_Sample_JComboBox in class application_task.");
          Exc.printStackTrace();
        }
      }
      return combo_Sample_JComboBox;
    }
/* */
    protected JCheckBox get_chk_Sample_JCheckBox() {
/* Zuerst Prüfen, ob die Variable bereits 'constructed' (initialisiert) ist. */
      if (chk_Sample_JCheckBox == null) {
/* Variable noch nicht 'constructed'; Code für die Initialisierung folgt. */
        try {
          chk_Sample_JCheckBox = new JCheckBox();
          chk_Sample_JCheckBox.setName("chk_Sample_JCheckBox");
          chk_Sample_JCheckBox.setHorizontalAlignment(SwingConstants.TRAILING );
          chk_Sample_JCheckBox.setHorizontalTextPosition(SwingConstants.LEADING);
/* Mit folgender Code-Zeile wird das GUI-Element mit einem Text versehen.
 * Damit ist auf der GUI der Name des GUI-Elementes zu sehen solange noch kein
 * sprach-spezifischer Text definiert ist. */

          chk_Sample_JCheckBox.setText("chk_Sample_JCheckBox");
        }
        catch (Throwable Exc) {
/* Fehler beim 'construct' ist sehr unwahrscheinlich und kann nur beim 'Starten'
 * des Tasks auftreten.
 * Deswegen werden Fehlermeldungen nur auf der Konsole ausgegeben. */
          System.out.println("Error while building chk_Sample_JCheckBox in class application_task.");
          Exc.printStackTrace();
        }
      }
      return chk_Sample_JCheckBox;
    }
/* */
    protected JRadioButton get_rbtn_Sample_JRadioButton_1() {
/* Zuerst Prüfen, ob die Variable bereits 'constructed' (initialisiert) ist. */
      if (rbtn_Sample_JRadioButton_1 == null) {
/* Variable noch nicht 'constructed'; Code für die Initialisierung folgt. */
        try {
          rbtn_Sample_JRadioButton_1 = new JRadioButton();
          rbtn_Sample_JRadioButton_1.setName("rbtn_Sample_JRadioButton_1");
          rbtn_Sample_JRadioButton_1.setHorizontalAlignment(SwingConstants.LEADING);
          rbtn_Sample_JRadioButton_1.setHorizontalTextPosition(SwingConstants.TRAILING);
          btngrp_Sample_ButtonGroup.add(rbtn_Sample_JRadioButton_1);
/* Mit folgender Code-Zeile wird das GUI-Element mit einem Text versehen.
 * Damit ist auf der GUI der Name des GUI-Elementes zu sehen solange noch kein
 * sprach-spezifischer Text definiert ist. */

          rbtn_Sample_JRadioButton_1.setText("rbtn_Sample_JRadioButton_1");
        }
        catch (Throwable Exc) {
/* Fehler beim 'construct' ist sehr unwahrscheinlich und kann nur beim 'Starten'
 * des Tasks auftreten.
 * Deswegen werden Fehlermeldungen nur auf der Konsole ausgegeben. */
          System.out.println("Error while building rbtn_Sample_JRadioButton_1 in class application_task.");
          Exc.printStackTrace();
        }
      }
      return rbtn_Sample_JRadioButton_1;
    }
/* */
    protected JRadioButton get_rbtn_Sample_JRadioButton_2() {
/* Zuerst Prüfen, ob die Variable bereits 'constructed' (initialisiert) ist. */
      if (rbtn_Sample_JRadioButton_2 == null) {
/* Variable noch nicht 'constructed'; Code für die Initialisierung folgt. */
        try {
          rbtn_Sample_JRadioButton_2 = new JRadioButton();
          rbtn_Sample_JRadioButton_2.setName("rbtn_Sample_JRadioButton_2");
          rbtn_Sample_JRadioButton_2.setHorizontalAlignment(SwingConstants.TRAILING);
          rbtn_Sample_JRadioButton_2.setHorizontalTextPosition(SwingConstants.LEADING);
          btngrp_Sample_ButtonGroup.add(rbtn_Sample_JRadioButton_2);
/* Mit folgender Code-Zeile wird das GUI-Element mit einem Text versehen.
 * Damit ist auf der GUI der Name des GUI-Elementes zu sehen solange noch kein
 * sprach-spezifischer Text definiert ist. */

          rbtn_Sample_JRadioButton_2.setText("rbtn_Sample_JRadioButton_2");
        }
        catch (Throwable Exc) {
/* Fehler beim 'construct' ist sehr unwahrscheinlich und kann nur beim 'Starten'
 * des Tasks auftreten.
 * Deswegen werden Fehlermeldungen nur auf der Konsole ausgegeben. */
          System.out.println("Error while building rbtn_Sample_JRadioButton_2 in class application_task.");
          Exc.printStackTrace();
        }
      }
      return rbtn_Sample_JRadioButton_2;
    }
/* */
    protected JButton get_btn_Sample_JButton() {
/* Zuerst Prüfen, ob die Variable bereits 'constructed' (initialisiert) ist. */
      if (btn_Sample_JButton == null) {
/* Variable noch nicht 'constructed'; Code für die Initialisierung folgt. */
        try {
          btn_Sample_JButton = new JButton();
          btn_Sample_JButton.setName("btn_Sample_JButton");
/* 
 * Durch den 'ActionListener' wird beim Anklicken des GUI-Elements mit der Maustaste
 * die Methode 'actionPerformed' aufgerufen. */
          btn_Sample_JButton.addActionListener(this);
/* 
 * Über den 'ActionCommand' kann abgefragt werden, welches GUI-Element mit der
 * Maustaste angeklickt wurde. */
          btn_Sample_JButton.setActionCommand("btn_Sample_JButton");
/* Mit folgender Code-Zeile wird das GUI-Element mit einem Text versehen.
 * Damit ist auf der GUI der Name des GUI-Elementes zu sehen solange noch kein
 * sprach-spezifischer Text definiert ist. */

          btn_Sample_JButton.setText("btn_Sample_JButton");
        }
        catch (Throwable Exc) {
/* Fehler beim 'construct' ist sehr unwahrscheinlich und kann nur beim 'Starten'
 * des Tasks auftreten.
 * Deswegen werden Fehlermeldungen nur auf der Konsole ausgegeben. */
          System.out.println("Error while building btn_Sample_JButton in class application_task.");
          Exc.printStackTrace();
        }
      }
      return btn_Sample_JButton;
    }
/* */
    protected JSBS_ImagePane get_img_Sample_ImagePane() {
/* Zuerst Prüfen, ob die Variable bereits 'constructed' (initialisiert) ist. */
      if (img_Sample_ImagePane == null) {
/* Variable noch nicht 'constructed'; Code für die Initialisierung folgt. */
        try {
/* 
 * Die folgenden zwei Zeilen können alternativ verwendet werden.
 * 1. Möglichkeit:
 * In der anschließenden Zeile wird kein 'JLabel' für die Anzeige der Größe des Images übergeben. */
          img_Sample_ImagePane = new JSBS_ImagePane();
/* 2. Möglichkeit:
 * In der anschließenden Zeile wird ein GUI-Element vom Typ 'JLabel' übergeben in dem innerhalb
 * von 'JSBS_ImagePane' die Größe des angezeigten Images (als 'Pixel x Pixel') als Text gesetzt wird. */
          img_Sample_ImagePane = new JSBS_ImagePane(get_lbl_ImageSize());
          img_Sample_ImagePane.setName("img_Sample_ImagePane");
/* 
 * Damit das Image in einer akzeptablen Größe angezeigt wird und nicht zu sehr schrumpfen kann
 * werden Grenzen für die Größe festgelegt. */
          img_Sample_ImagePane.setPreferredSize(new Dimension(400, 400));
          img_Sample_ImagePane.setMinimumSize(new Dimension(300, 300));
          img_Sample_ImagePane.setMaximumSize(new Dimension(1000, 500));
/* 
 * Über das folgende Kommando werden die sprachspezifischen Texte für 'copy' und 'paste' im Kontext-Menu
 * (erscheint wenn der Mauszeiger über dem Image positioniert ist und die rechte Maustaste gedrückt wird)
 * festgelegt. Die aktuellen Texte werden aus der XML-Struktur in der Datei 'DisplayStrings.xml'
 * ausgelesen.
 * Wenn noch keine Texte darin definiert sind kommentieren Sie die Zeile aus – dann werden einfache
 * Standard-Texte angezeigt.
 * Wenn eine Auswahlmöglichkeit nicht angezeigt werden soll dann übergeben Sie statt des Textes den Wert
 * 'null' als Parameter. Sind beide Parameter 'null' dann wird das Kontext-Menu nicht angezeigt. */
          img_Sample_ImagePane.setLanguageSpecificMenuTexts(
                    frmCC.structJSBS_XML_DisplayStrings.getSupplementaryText("MenuItem_CopyToClipboard"),
                    frmCC.structJSBS_XML_DisplayStrings.getSupplementaryText("MenuItem_PasteFromClipboard"));
/* 
 * Wenn das Image über das Kontext-Menu 'paste' eingefügt werden kann dann wird mit dem folgenden Listener
 * und dessen Methode ein Erkennen des geänderten Images möglich.
 * Innerhalb der Methode kann eine weitere Methode aufgerufen werden, die das Image weiter verarbeitet -
 * z.B. eine Vorbereitung für das Speichern auf der Datenbank. */
          img_Sample_ImagePane.addPropertyChangeListener(new PropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent evt) {
/* Aufrufen der Methode, die das Image weiter bearbeitet. */
              
application_task__ActionHandler.processChangedImage(this);
            }
          });
        }
        catch (Throwable Exc) {
/* Fehler beim 'construct' ist sehr unwahrscheinlich und kann nur beim 'Starten'
 * des Tasks auftreten.
 * Deswegen werden Fehlermeldungen nur auf der Konsole ausgegeben. */
          System.out.println("Error while building img_Sample_ImagePane in class application_task.");
          Exc.printStackTrace();
        }
      }
      return img_Sample_ImagePane;
    }
/* */
/* 
 * ******************************
 * Methode zum 'Construct' (Initialisierung) des Panels mit den GUI-Elementen für
 * die Abwicklung des Geschäftsfalles.
 * Diese Methode überschreibt das 'Construct' des JPanel (mit gleichem Namen) in der
 * geerbten Methode aus der Klasse JSBS_TaskFrame.
 * */
    protected JPanel get_pnl_DetailFields() {
/* Zuerst Prüfen, ob die Variable bereits 'constructed' (initialisiert) ist. */
      if (pnl_DetailFields == null) {
/* Variable noch nicht 'constructed'; Code für die Initialisierung folgt. */
        try {
          pnl_DetailFields = new JPanel();
          pnl_DetailFields.setName("pnl_DetailFields");
/* 
 * Mit der folgenden Anweisung wird die Eigenschaft 'GridBagLayout festgelegt
 * 'GridBagLayout' unterteilt das JPanel in 'dehnbare' Felder; damit 'wachsen' oder
 * 'schrumpfen' darin platzierte GUI-Elemente abhängig von der Größe des JPanel. */
          pnl_DetailFields.setLayout(new GridBagLayout());
/* 
 * Die folgenden Anweisungen platzieren GUI-Elemente in den 'Feldern' des JPanel. */
/* Zuerst wird eine Variable für die Platzierungs-Eigenschaften erstellt. */
          GridBagConstraints gbc_dl_Sample_Areas_To_Be_Separated = new GridBagConstraints();
/* Definition der Platzierungs-Eigenschaften. */
          gbc_dl_Sample_Areas_To_Be_Separated.gridx = 0;
          gbc_dl_Sample_Areas_To_Be_Separated.gridy = 0;
          gbc_dl_Sample_Areas_To_Be_Separated.gridwidth = 4;
          gbc_dl_Sample_Areas_To_Be_Separated.weightx = 1;
          gbc_dl_Sample_Areas_To_Be_Separated.fill = GridBagConstraints.HORIZONTAL;
          gbc_dl_Sample_Areas_To_Be_Separated.anchor = GridBagConstraints.CENTER;
          gbc_dl_Sample_Areas_To_Be_Separated.insets = new Insets(3, 3, 3, 3);
/* Platzieren des GUI-Elements auf dem JPanel. */
          get_pnl_DetailFields().add(get_dl_Sample_Areas_To_Be_Separated(), gbc_dl_Sample_Areas_To_Be_Separated);
/* 
 * Platzieren des nächsten GUI-Elements. */
          GridBagConstraints gbc_lbl_Sample_JLabel_Right = new GridBagConstraints();
/* Definition der Platzierungs-Eigenschaften. */
          gbc_lbl_Sample_JLabel_Right.gridx = 0;
          gbc_lbl_Sample_JLabel_Right.gridy = 0;
          gbc_lbl_Sample_JLabel_Right.weightx = 1;
          gbc_lbl_Sample_JLabel_Right.fill = GridBagConstraints.HORIZONTAL;
          gbc_lbl_Sample_JLabel_Right.anchor = GridBagConstraints.LINE_END;
          gbc_lbl_Sample_JLabel_Right.insets = new Insets(3, 3, 3, 3);
/* Platzieren des GUI-Elements auf dem JPanel. */
          get_pnl_DetailFields().add(get_lbl_Sample_JLabel_Right(), gbc_lbl_Sample_JLabel_Right);
/* 
 * Platzieren des nächsten GUI-Elements. */
          GridBagConstraints gbc_txt_Sample_JTextField = new GridBagConstraints();
/* Definition der Platzierungs-Eigenschaften. */
          gbc_txt_Sample_JTextField.gridx = 0;
          gbc_txt_Sample_JTextField.gridy = 1;
          gbc_txt_Sample_JTextField.weightx = 1;
          gbc_txt_Sample_JTextField.fill = GridBagConstraints.HORIZONTAL;
          gbc_txt_Sample_JTextField.anchor = GridBagConstraints.LINE_START;
          gbc_txt_Sample_JTextField.insets = new Insets(3, 3, 3, 3);
/* Platzieren des GUI-Elements auf dem JPanel. */
          get_pnl_DetailFields().add(get_txt_Sample_JTextField(), gbc_txt_Sample_JTextField);
/* 
 * Platzieren des nächsten GUI-Elements. */
          GridBagConstraints gbc_combo_Sample_JComboBox = new GridBagConstraints();
/* Definition der Platzierungs-Eigenschaften. */
          gbc_combo_Sample_JComboBox.gridx = 0;
          gbc_combo_Sample_JComboBox.gridy = 2;
          gbc_combo_Sample_JComboBox.weightx = 1;
          gbc_combo_Sample_JComboBox.fill = GridBagConstraints.HORIZONTAL;
          gbc_combo_Sample_JComboBox.anchor = GridBagConstraints.LINE_START;
          gbc_combo_Sample_JComboBox.insets = new Insets(3, 3, 3, 3);
/* Platzieren des GUI-Elements auf dem JPanel. */
          get_pnl_DetailFields().add(get_combo_Sample_JComboBox(), gbc_combo_Sample_JComboBox);
/* 
 * Platzieren des nächsten GUI-Elements. */
          GridBagConstraints gbc_chk_Sample_JCheckBox = new GridBagConstraints();
/* Definition der Platzierungs-Eigenschaften. */
          gbc_chk_Sample_JCheckBox.gridx = 0;
          gbc_chk_Sample_JCheckBox.gridy = 3;
          gbc_chk_Sample_JCheckBox.weightx = 1;
          gbc_chk_Sample_JCheckBox.fill = GridBagConstraints.HORIZONTAL;
          gbc_chk_Sample_JCheckBox.anchor = GridBagConstraints.LINE_END;
          gbc_chk_Sample_JCheckBox.insets = new Insets(3, 3, 3, 3);
/* Platzieren des GUI-Elements auf dem JPanel. */
          get_pnl_DetailFields().add(get_chk_Sample_JCheckBox(), gbc_chk_Sample_JCheckBox);
/* 
 * Platzieren des nächsten GUI-Elements. */
          GridBagConstraints gbc_rbtn_Sample_JRadioButton_1 = new GridBagConstraints();
/* Definition der Platzierungs-Eigenschaften. */
          gbc_rbtn_Sample_JRadioButton_1.gridx = 0;
          gbc_rbtn_Sample_JRadioButton_1.gridy = 4;
          gbc_rbtn_Sample_JRadioButton_1.weightx = 1;
          gbc_rbtn_Sample_JRadioButton_1.fill = GridBagConstraints.HORIZONTAL;
          gbc_rbtn_Sample_JRadioButton_1.anchor = GridBagConstraints.LINE_START;
          gbc_rbtn_Sample_JRadioButton_1.insets = new Insets(3, 3, 3, 3);
/* Platzieren des GUI-Elements auf dem JPanel. */
          get_pnl_DetailFields().add(get_rbtn_Sample_JRadioButton_1(), gbc_rbtn_Sample_JRadioButton_1);
/* 
 * Platzieren des nächsten GUI-Elements. */
          GridBagConstraints gbc_rbtn_Sample_JRadioButton_2 = new GridBagConstraints();
/* Definition der Platzierungs-Eigenschaften. */
          gbc_rbtn_Sample_JRadioButton_2.gridx = 0;
          gbc_rbtn_Sample_JRadioButton_2.gridy = 5;
          gbc_rbtn_Sample_JRadioButton_2.weightx = 1;
          gbc_rbtn_Sample_JRadioButton_2.fill = GridBagConstraints.HORIZONTAL;
          gbc_rbtn_Sample_JRadioButton_2.anchor = GridBagConstraints.LINE_END;
          gbc_rbtn_Sample_JRadioButton_2.insets = new Insets(3, 3, 3, 3);
/* Platzieren des GUI-Elements auf dem JPanel. */
          get_pnl_DetailFields().add(get_rbtn_Sample_JRadioButton_2(), gbc_rbtn_Sample_JRadioButton_2);
/* 
 * Platzieren des nächsten GUI-Elements. */
          GridBagConstraints gbc_lbl_Sample_JLabel_Left = new GridBagConstraints();
/* Definition der Platzierungs-Eigenschaften. */
          gbc_lbl_Sample_JLabel_Left.gridx = 1;
          gbc_lbl_Sample_JLabel_Left.gridy = 0;
          gbc_lbl_Sample_JLabel_Left.weightx = 1;
          gbc_lbl_Sample_JLabel_Left.fill = GridBagConstraints.HORIZONTAL;
          gbc_lbl_Sample_JLabel_Left.anchor = GridBagConstraints.LINE_START;
          gbc_lbl_Sample_JLabel_Left.insets = new Insets(3, 3, 3, 3);
/* Platzieren des GUI-Elements auf dem JPanel. */
          get_pnl_DetailFields().add(get_lbl_Sample_JLabel_Left(), gbc_lbl_Sample_JLabel_Left);
/* 
 * Platzieren des nächsten GUI-Elements. */
          GridBagConstraints gbc_txt_Sample_JTextArea = new GridBagConstraints();
/* Definition der Platzierungs-Eigenschaften. */
          gbc_txt_Sample_JTextArea.gridx = 1;
          gbc_txt_Sample_JTextArea.gridy = 1;
          gbc_txt_Sample_JTextArea.gridwidth = 1;
          gbc_txt_Sample_JTextArea.gridheight = 5;
          gbc_txt_Sample_JTextArea.weightx = 1;
          gbc_txt_Sample_JTextArea.fill = GridBagConstraints.BOTH;
          gbc_txt_Sample_JTextArea.anchor = GridBagConstraints.LINE_START;
          gbc_txt_Sample_JTextArea.insets = new Insets(3, 3, 3, 3);
/* Platzieren des GUI-Elements auf dem JPanel. */
          get_pnl_DetailFields().add(get_txt_Sample_JTextArea(), gbc_txt_Sample_JTextArea);
/* 
 * Platzieren des nächsten GUI-Elements. */
          GridBagConstraints gbc_lst_Sample_JList = new GridBagConstraints();
/* Definition der Platzierungs-Eigenschaften. */
          gbc_lst_Sample_JList.gridx = 2;
          gbc_lst_Sample_JList.gridy = 1;
          gbc_lst_Sample_JList.gridwidth = 1;
          gbc_lst_Sample_JList.gridheight = 5;
          gbc_lst_Sample_JList.weightx = 1;
          gbc_lst_Sample_JList.fill = GridBagConstraints.BOTH;
          gbc_lst_Sample_JList.anchor = GridBagConstraints.LINE_START;
          gbc_lst_Sample_JList.insets = new Insets(3, 3, 3, 3);
/* Platzieren des GUI-Elements auf dem JPanel. */
          get_pnl_DetailFields().add(get_lst_Sample_JList(), gbc_lst_Sample_JList);
/* 
 * Platzieren des nächsten GUI-Elements. */
          GridBagConstraints gbc_btn_Sample_JButton = new GridBagConstraints();
/* Definition der Platzierungs-Eigenschaften. */
          gbc_btn_Sample_JButton.gridx = 0;
          gbc_btn_Sample_JButton.gridy = 6;
          gbc_btn_Sample_JButton.gridwidth = 3;
          gbc_btn_Sample_JButton.weightx = 1;
          gbc_btn_Sample_JButton.fill = GridBagConstraints.BOTH;
          gbc_btn_Sample_JButton.anchor = GridBagConstraints.LINE_START;
          gbc_btn_Sample_JButton.insets = new Insets(3, 3, 3, 3);
/* Platzieren des GUI-Elements auf dem JPanel. */
          get_pnl_DetailFields().add(get_btn_Sample_JButton(), gbc_btn_Sample_JButton);
/* 
 * Platzieren des nächsten GUI-Elements. */
          GridBagConstraints gbc_img_Sample_ImagePane = new GridBagConstraints();
/* Definition der Platzierungs-Eigenschaften. */
          gbc_img_Sample_ImagePane.gridx = 0;
          gbc_img_Sample_ImagePane.gridy = 8;
          gbc_img_Sample_ImagePane.gridwidth = 3;
          gbc_img_Sample_ImagePane.weightx = 1;
          gbc_img_Sample_ImagePane.fill = GridBagConstraints.BOTH;
          gbc_img_Sample_ImagePane.anchor = GridBagConstraints.LINE_START;
          gbc_img_Sample_ImagePane.insets = new Insets(3, 3, 3, 3);
/* Platzieren des GUI-Elements auf dem JPanel. */
          get_pnl_DetailFields().add(get_img_Sample_ImagePane(), gbc_img_Sample_ImagePane);
        }
        catch (Throwable Exc) {
/* Fehler beim 'construct' ist sehr unwahrscheinlich und kann nur beim 'Starten'
 * des Tasks auftreten.
 * Deswegen werden Fehlermeldungen nur auf der Konsole ausgegeben. */
          System.out.println("Error while building pnl_DetailFields in class application_task.");
          Exc.printStackTrace();
        }
      }
      return pnl_DetailFields;
    }
/* */
/* 
 * ******************************
 * Methode zum 'Construct' (Initialisierung) des Panels mit den GUI-Elementen zum Filtern,
 * welche BO (Datensätze) in der angezeigten Liste für die Auswahl enthalten sind.
 * Diese Methode überschreibt das 'Construct' des JPanel (mit gleichem Namen) in der
 * geerbten Methode aus der Klasse JSBS_TaskFrame.
 * **********
 * Wenn in der Benutzeroberfläche (GUI) dieses Teilprogramms (Tasks) keine Auswahlmöglichkeiten
 * für Filterkriterien vorgesehen sind dann löschen Sie bitte diese Methode.
 * */
    protected JPanel get_pnl_ListFields() {
/* Zuerst Prüfen, ob die Variable bereits 'constructed' (initialisiert) ist. */
      if (pnl_ListFields == null) {
/* Variable noch nicht 'constructed'; Code für die Initialisierung folgt. */
        try {
/* Das 'Konstruieren' des GUI-Elements ist in der geerbten Klasse definiert.
 * Dort ist auch die JTable für die Anzeige der Liste der ausgewählten Datensätze und
 * das Eingabefeld für die Auswahl definiert. */

          super.get_pnl_ListFields();
/* 
 * Die folgenden Anweisungen platzieren GUI-Elemente in den 'Feldern' des JPanel. */
/* Zuerst wird eine Variable für die Platzierungs-Eigenschaften erstellt. */
          GridBagConstraints gbc_lbl_Sample_JLabel_Right = new GridBagConstraints();
/* Definition der Platzierungs-Eigenschaften. */
          gbc_lbl_Sample_JLabel_Right.gridx = 0;
          gbc_lbl_Sample_JLabel_Right.gridy = 0;
          gbc_lbl_Sample_JLabel_Right.weightx = 1;
          gbc_lbl_Sample_JLabel_Right.fill = GridBagConstraints.HORIZONTAL;
          gbc_lbl_Sample_JLabel_Right.anchor = GridBagConstraints.LINE_END;
          gbc_lbl_Sample_JLabel_Right.insets = new Insets(3, 3, 3, 3);
/* Platzieren des GUI-Elements auf dem JPanel. */
          get_pnl_ListFields().add(get_lbl_Sample_JLabel_Right(), gbc_lbl_Sample_JLabel_Right);
/* 
 * Platzieren des nächsten GUI-Elements. */
          GridBagConstraints gbc_txt_Sample_JTextField = new GridBagConstraints();
/* Definition der Platzierungs-Eigenschaften. */
          gbc_txt_Sample_JTextField.gridx = 0;
          gbc_txt_Sample_JTextField.gridy = 1;
          gbc_txt_Sample_JTextField.weightx = 1;
          gbc_txt_Sample_JTextField.fill = GridBagConstraints.HORIZONTAL;
          gbc_txt_Sample_JTextField.anchor = GridBagConstraints.LINE_START;
          gbc_txt_Sample_JTextField.insets = new Insets(3, 3, 3, 3);
/* Platzieren des GUI-Elements auf dem JPanel. */
          get_pnl_ListFields().add(get_txt_Sample_JTextField(), gbc_txt_Sample_JTextField);
/* 
 * Platzieren des nächsten GUI-Elements. */
          GridBagConstraints gbc_combo_Sample_JComboBox = new GridBagConstraints();
/* Definition der Platzierungs-Eigenschaften. */
          gbc_combo_Sample_JComboBox.gridx = 0;
          gbc_combo_Sample_JComboBox.gridy = 2;
          gbc_combo_Sample_JComboBox.weightx = 1;
          gbc_combo_Sample_JComboBox.fill = GridBagConstraints.HORIZONTAL;
          gbc_combo_Sample_JComboBox.anchor = GridBagConstraints.LINE_START;
          gbc_combo_Sample_JComboBox.insets = new Insets(3, 3, 3, 3);
/* Platzieren des GUI-Elements auf dem JPanel. */
          get_pnl_ListFields().add(get_combo_Sample_JComboBox(), gbc_combo_Sample_JComboBox);
/* 
 * Platzieren des nächsten GUI-Elements. */
          GridBagConstraints gbc_chk_Sample_JCheckBox = new GridBagConstraints();
/* Definition der Platzierungs-Eigenschaften. */
          gbc_chk_Sample_JCheckBox.gridx = 0;
          gbc_chk_Sample_JCheckBox.gridy = 3;
          gbc_chk_Sample_JCheckBox.weightx = 1;
          gbc_chk_Sample_JCheckBox.fill = GridBagConstraints.HORIZONTAL;
          gbc_chk_Sample_JCheckBox.anchor = GridBagConstraints.LINE_END;
          gbc_chk_Sample_JCheckBox.insets = new Insets(3, 3, 3, 3);
/* Platzieren des GUI-Elements auf dem JPanel. */
          get_pnl_ListFields().add(get_chk_Sample_JCheckBox(), gbc_chk_Sample_JCheckBox);
/* 
 * Platzieren des nächsten GUI-Elements. */
          GridBagConstraints gbc_rbtn_Sample_JRadioButton_1 = new GridBagConstraints();
/* Definition der Platzierungs-Eigenschaften. */
          gbc_rbtn_Sample_JRadioButton_1.gridx = 0;
          gbc_rbtn_Sample_JRadioButton_1.gridy = 4;
          gbc_rbtn_Sample_JRadioButton_1.weightx = 1;
          gbc_rbtn_Sample_JRadioButton_1.fill = GridBagConstraints.HORIZONTAL;
          gbc_rbtn_Sample_JRadioButton_1.anchor = GridBagConstraints.LINE_START;
          gbc_rbtn_Sample_JRadioButton_1.insets = new Insets(3, 3, 3, 3);
/* Platzieren des GUI-Elements auf dem JPanel. */
          get_pnl_ListFields().add(get_rbtn_Sample_JRadioButton_1(), gbc_rbtn_Sample_JRadioButton_1);
/* 
 * Platzieren des nächsten GUI-Elements. */
          GridBagConstraints gbc_rbtn_Sample_JRadioButton_2 = new GridBagConstraints();
/* Definition der Platzierungs-Eigenschaften. */
          gbc_rbtn_Sample_JRadioButton_2.gridx = 0;
          gbc_rbtn_Sample_JRadioButton_2.gridy = 5;
          gbc_rbtn_Sample_JRadioButton_2.weightx = 1;
          gbc_rbtn_Sample_JRadioButton_2.fill = GridBagConstraints.HORIZONTAL;
          gbc_rbtn_Sample_JRadioButton_2.anchor = GridBagConstraints.LINE_END;
          gbc_rbtn_Sample_JRadioButton_2.insets = new Insets(3, 3, 3, 3);
/* Platzieren des GUI-Elements auf dem JPanel. */
          get_pnl_ListFields().add(get_rbtn_Sample_JRadioButton_2(), gbc_rbtn_Sample_JRadioButton_2);
/* 
 * Platzieren des nächsten GUI-Elements. */
          GridBagConstraints gbc_lbl_Sample_JLabel_Left = new GridBagConstraints();
/* Definition der Platzierungs-Eigenschaften. */
          gbc_lbl_Sample_JLabel_Left.gridx = 1;
          gbc_lbl_Sample_JLabel_Left.gridy = 0;
          gbc_lbl_Sample_JLabel_Left.weightx = 1;
          gbc_lbl_Sample_JLabel_Left.fill = GridBagConstraints.HORIZONTAL;
          gbc_lbl_Sample_JLabel_Left.anchor = GridBagConstraints.LINE_START;
          gbc_lbl_Sample_JLabel_Left.insets = new Insets(3, 3, 3, 3);
/* Platzieren des GUI-Elements auf dem JPanel. */
          get_pnl_ListFields().add(get_lbl_Sample_JLabel_Left(), gbc_lbl_Sample_JLabel_Left);
/* 
 * Platzieren des nächsten GUI-Elements. */
          GridBagConstraints gbc_txt_Sample_JTextArea = new GridBagConstraints();
/* Definition der Platzierungs-Eigenschaften. */
          gbc_txt_Sample_JTextArea.gridx = 1;
          gbc_txt_Sample_JTextArea.gridy = 1;
          gbc_txt_Sample_JTextArea.gridwidth = 1;
          gbc_txt_Sample_JTextArea.gridheight = 5;
          gbc_txt_Sample_JTextArea.weightx = 1;
          gbc_txt_Sample_JTextArea.fill = GridBagConstraints.BOTH;
          gbc_txt_Sample_JTextArea.anchor = GridBagConstraints.LINE_START;
          gbc_txt_Sample_JTextArea.insets = new Insets(3, 3, 3, 3);
/* Platzieren des GUI-Elements auf dem JPanel. */
          get_pnl_ListFields().add(get_txt_Sample_JTextArea(), gbc_txt_Sample_JTextArea);
/* 
 * Platzieren des nächsten GUI-Elements. */
          GridBagConstraints gbc_lst_Sample_JList = new GridBagConstraints();
/* Definition der Platzierungs-Eigenschaften. */
          gbc_lst_Sample_JList.gridx = 2;
          gbc_lst_Sample_JList.gridy = 1;
          gbc_lst_Sample_JList.gridwidth = 1;
          gbc_lst_Sample_JList.gridheight = 5;
          gbc_lst_Sample_JList.weightx = 1;
          gbc_lst_Sample_JList.fill = GridBagConstraints.BOTH;
          gbc_lst_Sample_JList.anchor = GridBagConstraints.LINE_START;
          gbc_lst_Sample_JList.insets = new Insets(3, 3, 3, 3);
/* Platzieren des GUI-Elements auf dem JPanel. */
          get_pnl_ListFields().add(get_lst_Sample_JList(), gbc_lst_Sample_JList);
/* 
 * Platzieren des nächsten GUI-Elements. */
          GridBagConstraints gbc_btn_Sample_JButton = new GridBagConstraints();
/* Definition der Platzierungs-Eigenschaften. */
          gbc_btn_Sample_JButton.gridx = 0;
          gbc_btn_Sample_JButton.gridy = 6;
          gbc_btn_Sample_JButton.gridwidth = 3;
          gbc_btn_Sample_JButton.weightx = 1;
          gbc_btn_Sample_JButton.fill = GridBagConstraints.BOTH;
          gbc_btn_Sample_JButton.anchor = GridBagConstraints.LINE_START;
          gbc_btn_Sample_JButton.insets = new Insets(3, 3, 3, 3);
/* Platzieren des GUI-Elements auf dem JPanel. */
          get_pnl_ListFields().add(get_btn_Sample_JButton(), gbc_btn_Sample_JButton);
        }
        catch (Throwable Exc) {
/* Fehler beim 'construct' ist sehr unwahrscheinlich und kann nur beim 'Starten'
 * des Tasks auftreten.
 * Deswegen werden Fehlermeldungen nur auf der Konsole ausgegeben. */
          System.out.println("Error while building pnl_ListFields in class application_task.");
          Exc.printStackTrace();
        }
      }
      return pnl_ListFields;
    }
/*
 * METHODE die ausgeführt wird wenn das Fenster geschlossen wird.
 * In dieser Methode wird:
 * * Die Spaltenbreiten der JTable(s) in die entsprechende (in der geerbten Klasse
 *   definierten) Datenstruktur übertragen damit sie auf der Datenbank gespeichert
 *   werden können.
 * * Die Methode zur Prüfung, ob Daten geändert aber nicht gespeichert wurden,
 *   aufgerufen.
 * * Zuletzt wird die Methode gleichen Namens in der geerbten Klasse aufgerufen;
 *   in dieser wird der für alle Task-Frames gleichbleibende Code ausgeführt. */
    public void windowClosing(WindowEvent e) {
/*
 * 'Art', welche Verarbeitung nach dem Anklicken des 'Close'-Icons des Fensters
 * ausgeführt wird, verändern.
 * Nur so kann im Code abgefragt werden, ob das Fenster wirklich geschlossen werden
 * soll. */
      this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
/*
 * Methode aufrufen, die prüft ob die Eingabe-Daten geändert aber nicht gespeichert
 * wurden. Diese Methode liefert nur dann 'false' zurück wenn der Anwender ungespeicherte
 * Daten noch prüfen und eventuell korrigieren will. */
      if (application_task__ActionHandler.checkForUnstoredChanges(this)) {
/* Frame kann geschlossen werden; gleichnamige Methode der geerbten Klasse den Code, der
 * für alle Task-Frames gleich ist, ausführen lassen. */
        super.windowClosing(e);
      }
      else {
/* Anwender hat entschieden, dass das Fenster nicht geschlossen werden soll.
 * Fenster wieder sichtbar machen. */
        this.setVisible(true);
      }
    }
/*
 * METHODE die ausgeführt wird wenn sich der Status eines GUI-Elementes, dem
 * ein 'ItemListener' hinzugefügt ist, ändert. */
    public void itemStateChanged(ItemEvent e) {
/*
 * Zur Verarbeitung des Ereignisses die Methode in der zu dieser Klasse gehörenden
 * 'DocumentListener'-Klasse aufrufen.
 * Grund für die Implementierung des Codes im 'DocumentListener' ist, dass im
 * 'DocumentListener' auch alle Eingabe-Prüfungen und das Aktivieren/Deaktivieren von
 * Schaltflächen implementiert ist. */
      structapplication_task__DocumentListener.itemStateChanged(e);
    }
/*
 * METHODE die ausgeführt wird wenn der Rand einer Spalte verschoben wird.
 * Dieses Ereignis tritt dann auf, wenn der Anwender die Breite der Spalten
 * einer JTable verändert.
 * In dieser Methode werden dann die neuen Spaltenbreiten auf die Datenstruktur,
 * die beim Schliessen des Fensters auf der Datenbank gespeichert wird, übernommen. */
    public void columnMarginChanged(ChangeEvent e) {
/*
 * Weil der Wert von 'bolInhibitColumnMarginChangeStore' auch von parallel laufenden
 * Methoden verändert werden kann wird der gesamte Code in der Methode 'synchronized'
 * ausgeführt. */
      
synchronized (this) {
/*
 * Prüfen, ob der Code in dieser Methode überhaupt ausgeführt werden soll.
 * Die Bedeutung von 'bolInhibitColumnMarginChangeStore' ist bei der Definition
 * der Variable (in der geerbten Klasse 'JSBS_TaskFrame') beschrieben. */
        
if (bolInhibitColumnMarginChangeStore) return;
/*
 * Gleichnamige Methode der geerbten Klasse aufrufen.
 * Darin werden die Spaltenbreiten der JTable 'pnl_SelectionListTable' (in der geerbten
 * Methode definiert) auf das BO und die Variable
 * 'structJSBS_FramePosition_BOC.ColumnWidthArray01' (ebenfalls in der geerbten Klasse
 * definiert) übertragen. */
        super.columnMarginChanged(e);
/*
 * Wenn weitere JTables verwendet werden, dann kann hier der Code für das Übernehmen
 * der Spaltenbreite auf die Datenstruktur adaptiert werden.   */
        structJSBS_FramePosition_BOC.ColumnWidthArray0x =
              JSBS_GUIServices.getTableColumnWidth(get_pnl_additional_JTable());
      }
    }
/*
 * METHODE die ausgeführt wird wenn ein Klick mit einer Maustaste
 * auf ein GUI-Element, dem der ActionListener hinzugefügt wurde, erfolgt. */
    public void actionPerformed(ActionEvent e) {
/*
 * Gleichnamige Methode in der geerbten Basisklasse aufrufen.
 * Damit werden die 'geerbten' Verarbeitungen (die für alle Anwendungsprogramme
 * gleich sein können) zuerst ausgeführt. */
      super.actionPerformed(e);
/*
 * Weitere Verarbeitung in einer eigenen Klasse mit statischen Methoden. */
      application_task__ActionHandler.handleEvent(this, e);
    }
}

zum Inhaltsverzeichnis

Muster-Code für die Klasse für den ActionHandler

Welche Platzhalter durch Bezeichnungen des eigentlichen Projektes zu ersetzen sind finden Sie im Abschnitt
Anleitung zur Adaptierung in allen Klassen und
Anleitung zur Adaptierung in der Klasse für den ActionHandler .

package application_package.client;
/*
 * Package mit den Klassen zum Bearbeiten von Events. */

import java.awt.event.*;
/*
 * Package mit den Klassen der GUI-Elemente. */

import java.awt.*;
import javax.swing.*;
/*
 * Package und Klassen mit den Status-Codes zum Prüfen auf erfolgreiche Durchführung oder
 * Fehler bei einer Datenbank-Operation. */

import js_base.bo.JSBS_BO;
/*
 * Package und Klassen mit Methoden zur Verarbeitung von GUI-Elementen, z.B. zum Auslesen von
 * Werten aus GUI-Elementen bzw. Anzeigen von Werten in GUI-Elementen oder Anzeigen von
 * Fehler- und Warnungs-Hinweisen. */

import js_base.frame.*;
/*
 * Package und Klasse für zu bearbeitende Business-Objects. */

import application_package.bo.*;
import application_package.boc.*;
/**
 *
 * @author name[at]company
 * @date 20xx-xx-xx
 *
 * @description
 *  Klasse mit statischen Methoden die ausgeführt werden wenn ein 'event'
 *  (z.B. der Klick einer Maustaste auf eine Schaltfläche) aufgetreten ist.
 *  Detail-Dokumentation finden Sie bei den einzelnen Methoden.
 *
 * @change-log
 * when         who               why
 * --------------------------------------------------------
 *
 */

public class application_task__ActionHandler {
/*
 * Name der Klasse als Konstante festlegen weil bei statischen Methoden der
 * Name der Klasse nicht über 'getClass().getName() ermittelt werden kann. */
    private static String CONST_ClassName = "application_package.client.application_task__ActionHandler";
/*
 * Methode die ermittelt, bei welchem GUI-Element ein 'ActionEvent' ausgelöst wurde
 * und die entsprechende Methode aufruft. */
    protected static void handleEvent(application_task parmTF,
                                   ActionEvent parmActionEvent) {
/* Zuerst wird die 'Identifikation' des GUI-Element aus dem ActionEvent extrahiert. */
      String cmd = parmActionEvent.getActionCommand().trim();
/* Abfragen von welchem GUI-Element der Event ausgelöst wurde und
 * Aufrufen der entsprechenden Methode. */
      if(cmd.equals("btn_Store")) store(parmTF);
      if(cmd.equals("btn_Copy")) copy(parmTF);
      if(cmd.equals("btn_Next")) getNext(parmTF);
      if(cmd.equals("btn_Previous")) getPrevious(parmTF);
      if(cmd.equals("btn_Get")) getForUpdate(parmTF);
      if(cmd.equals("btn_Delete")) processDeactivate(parmTF);
/* Die folgende Abfrage ist notwendig, wenn für die Anzeige der Liste mit den BO
 * Auswahlkriterien festgelegt werden können.
 * Bei der Selektion über die Auswahl aus Combo-Boxes kann auch eine Combo-Box
 * mit einem Action-Handler versehen werden und dessen Auslösung abgefragt werden. */
      if(cmd.equals("btn_ListBO")) {
        getSelectionCriteria(parmTF);
        redisplayBOList(parmTF);
      }
    }
/*
 * METHODE, die Filter-Kriterien für das Anzeigen der Liste mit BOs aus deren Eingabe-Feldern
 * in die Variablen der 'GUI-Klasse' überträgt.
 * Das 'Auslesen' und 'Aufheben' wird gemacht, damit bei einer neuerlichen Anzeige der Liste
 * (z.B. nach dem Speichern eines neuen BO oder dem Löschen/deaktivate) die Liste mit 
 * enstsprechend den ursprünglich eingegebenen Filterkriterien wieder angezeigt werden kann
 * auch wenn der Benutzer inzwischen den Inhalt der Eingabefelder verändert hat. */
    protected static void getSelectionCriteria(application_task parmTF) {
/* 
 * Muster der Übernahme der Werte aus den Eingabefeldern in die Variablen für die Auswahl-Werte. */
      parmTF.int_Selection_VariableName_1 = JSBS_GUIServices.getInteger(parmTF.get_txt_Sample_JTextField);
/* Prüfen ob gültige Werte eingegeben wurden; wenn notwendig ersetzen um späteren Dump zu vermeiden. */
      if (parmTF.int_Selection_VariableName_1 == null) parmTF.int_Selection_VariableName_1 = 0;
/* 
 * Muster der Übernahme des Wertes einer Combo-Box. */
      parmTF.str_Selection_VariableName_2 =
          JSBS_GUIServices.getSelectedTextFromJComboBox(parmTF.get_combo_Sample_JComboBox);
/*
 
* Alternative zum Auslesen eines Codes.
 
* Die Zeichenkette für das Trennzeichen muss gleich jener sein, die beim Füllen der Combobox verwendet wurde. */
//
      parmTF.str_Selection_VariableName_2 =
//
           JSBS_GUIServices.getSelectedCodeFromJComboBox(parmTF.get_combo_Sample_JComboBox(), " - ");
/* Prüfen ob überhaupt ein Wert ausgewählt werden konnte; wenn notwendig ersetzen um späteren Dump zu vermeiden. */
      if (parmTF.str_Selection_VariableName_2 == null) parmTF.str_Selection_VariableName_2 = "";
    }
/*
 * Methode die am Ende der 'Construction' der Klasse für die GUI ausgeführt wird.
 * In dieser Methode ist individuell zu codieren, wenn spezielle Verarbeitungen
 * erforderlich sind bevor dem Anwender eine Eingabe auf der GUI erlaubt ist. */
    protected static void processAfterConstruction(application_task parmTF) {
/*
 * Sofort nach dem Start des Tasks werden die Prüfregeln für das Eingabefeld für die
 * Auswahl des Datensatzes aus der Liste so gesetzt, dass eine Auswahl nicht möglich ist.
 * Die aktuelle Prüfregel wird in der Methode 'redisplayBOList(...)' gesetzt nachdem
 * die gewählten Datensätze angezeigt wurden. */

      parmTF.
structJSBS_EntryRules.setEntryRuleValues(
        parmTF.get_txt_Selection().getName(),
        
null, 1, 0, null, null, null, null);
/* Anschließend ist der Anwendungs-spezifische Code zu implementieren.
 * Hier können die Methoden zum Füllen von Comboboxen mit den Auswahlwerten
 * aufgerufen werden. */
  

/*
 * Mit dem folgenden Kopieren wird das 'gelesene' (read) BO mit den gleichen Daten gefüllt
 * wie das 'bearbeitete' (processed).
 * Damit wird verhindert, dass eine Rückfrage, 'ob
die geänderten Daten gespeichert werden sollen',
 * erscheint wenn das Fenster sofort nach dem Öffnen wieder geschlossen wird.
 * Die 'unterschiedlichen' Werte entstehen, wenn z.B. Combo-Boxes mit
vorgegebene Werten
 * gefüllt worden sind. */

    parmTF.
structapplication_entity_BOC_Read.
            copyFrom
application_entity_BO(
                parmTF.
structapplication_entity_BOC_Processed);   
/* 
 * Prüfen und Aktivieren / Deaktivieren von Schaltflächen (JButtons). */

      
parmTF.structapplication_task__DocumentListener.setButtonStatus();
/*
 * Setzen des Focus auf das Feld für die Eingabe des Auswahl-Codes für einen Datensatz.
 * Damit wird dem Benutzer sofort ermöglicht, eine Auswahl einzugeben. */

      parmTF.get_txt_Selection().requestFocusInWindow();
/*
 * Festlegen der Schaltfläche (JButton) [ Bearbeiten ] als jene,
 * auf die mit der Enter-Taste ein Mausklick ausgelöst wird. */

      parmTF.setEnterTriggeredButton(parmTF.get_btn_Get());
/*
 * Wenn die Geschäftsanwendung keine Möglichkeit zum Drucken vorsieht
 * dann wird die entsprechende Schaltfläche deaktiviert. */

      parmTF.get_btn_Print().setEnabled(
false);
/*
 * Nach dem 'Konstruieren' der Klasse für die GUI ist das Erfassen eines neuen
 * Datensatzes möglich – deswegen die Felder dafür 'aktivieren' bzw. 'deaktivieren'. */

      setFieldsForInsert(parmTF);
/*
 * Wenn in der Auswahlliste alle Datensätze angezeigt werden (d.h. es sind
 * keine Selektionskriterien vorgesehen) dann ist der 'Kommentar' vor der
 * folgenden Zeile zu entfernen. */

//      redisplayBOList(parmTF);
/*
 * Ausführen der Methode, die prüft ob im CommandCenter Parameter für diesen
 * Task eingegeben wurden und die entsprechende Verarbeitung ausführt. */

      processCCParameter(parmTF);

    }
/*
 * METHODE die prüft, ob in den Parameter-Feldern des CommandCenters Werte
 * eingegeben wurden und anschließend die entsprechenden Verarbeitungs-Schritte
 * ausführt. */
    private static void processCCParameter(application_task parmTF) {
/* 
 * Der Algorithmus ist abhängig von der Art wie eine Auswahl des zu bearbeitenden BO
 * getroffen wird
und deshalb wird kein allgemein gültiges Muster vorgegeben.
 * Einige Beispiele sind im Dokument mit den Code-Mustern (aus dem auch das Muster
 * für diese Klasse stammt) im Abschnitt 'Spezieller Muster-Code' gelistet. */
      
    }
/*
 * METHODE, die die von der Datenbank gelesenen Werte in die GUI-Elemente überträgt.
 * Weiters wird eine Methode aufgerufen, die Eingabefelder bei der Version 'MobileClient'
 * für die Eingabe sperrt oder öffnet – je nachdem ob die Verbindung zum JAS aufrecht
 * oder unterbrochen ist.
 * Zuletzt wird die Liste im CommandCenter aktualisiert. */
    private static void setToGUI(application_task parmTF) {
/* Werte auf die GUI-Elemente übertragen. */
      parmTF.structapplication_entity_BOC_Read.setToGUI(
      
  parmTF.get_txt_Sample_JTextField());
/* Spezielle Bearbeitung für Combo-Boxen die Teil des Anwender-bekannten Schlüssels sind.
 * Wenn diese in der Methode 'copy' farblich markiert wurden dann bleibt diese Markierung
 * erhalten.
 * (Java-)systembedingt wird bei einer JCombobox die neuerliche Auswahl des bereits
 * angezeigten Wertes nicht als 'itemStateChanged' gewertet und die Verarbeitung in der
 * zugehörigen 'DocumentListener'-Klasse nicht ausgeführt.
 * Deswegen wird anschliessend die 'normale' Farbe wieder gesetzt.*/
      JSBS_GUIServices.setDefinedForegroundColor(parmTF.get_combo_Sample_JComboBox(), parmTF);
/* Spezielle Bearbeitung für Combo-Boxen die Teil der Anwender-bekannten Identifikation sind.
 * Wenn diese in der Methode 'copy' farblich markiert wurden dann bleibt diese Markierung
 * erhalten.
 * (Java-)systembedingt wird bei einer JCombobox die neuerliche Auswahl des bereits
 * angezeigten Wertes nicht als 'itemStateChanged' gewertet und die Verarbeitung in der
 * zugehörigen 'DocumentListener'-Klasse nicht ausgeführt.
 * Deswegen wird anschliessend die 'normale' Farbe wieder gesetzt.*/

      setFieldsForUpdate(parmTF);
/*
 * Bilden einer Kurzform der angezeigten Daten und aufrufen der Methode, die den Eintrag
 * in der angezeigten Liste 'Aufgerufene Geschäftsanwendungen' ändert. */

      parmTF.frmCC.updateOpenTaskFrame(parmTF.dblCC_TaskID,
        parmTF.structapplication_entity_BOC_Read.attribute1 + " / " +
        parmTF.structapplication_entity_BOC_Read.attribute2);
    }
/*
 * METHODE zum Aktivieren bzw. Deaktivieren der Eingabefelder wenn ein neuer Datensatz
 * eingefügt werden soll.
 * Detaillierte Beschreibungen – besonders für die Version 'MobileClient' bei unterbrochener
 * Verbindung zum JAS (Java Application Server – finden Sie bei den jeweiligen Code-Mustern. */
    protected static void setFieldsForInsert(application_task parmTF) {
/* 
 * Eingabefelder für die Werte, die den Anwender-bekannten Schlüssel bilden,
 * für die Eingabe öffnen.
 * Dazu wird die spezielle Methode verwendet mit der auch die ursprüngliche Farbe
 * des Hintergrunds wieder hergestellt wird.
 * Dieses 'Öffnen' ist bei allen Versionen (Stand-Alone, Fat-Client, MobileClient) erforderlich.*/
      JSBS_GUIServices.processEnableGUIElement(parmTF, parmTF.get_txt_Sample_JTextField());
/* 
 * ----------
 * Der folgende Code ist nur erforderlich wenn das Anwendungsprogramm auch für die Version
 * 'MobileClient' vorgesehen ist.
 * Wird keine 'MobileClient' Version vorgesehen, kann der folgende Code-Muster gelöscht werden. */
/* 
 * Mit den folgenden Markern wird festgelegt wie das aktivieren oder deaktivieren von Schaltflächen
 * gesteuert wird wenn das Anwendungsprogramm in der Version 'MobileClient' läuft und die
 * Verbindung zum JAS unterbrochen ist.
 * Bei anderen Versionen (als 'MobileClient') haben die Werte der Variablen keine Auswirkung –
 * außer es wird der Muster-Code modifiziert.
 * Diese Variablen sind in der Basisklasse 'JSBS_TaskFrame' definiert.
 * 'true' bedeutet, dass die Aktion ausgeführt werden darf auch wenn die Verbindung zum JAS
 * unterbrochen ist.
 * Abgefragt für die Steuerung werden die Werte der Variablen in den Methoden 'setButtonStatus_
xxx'
 * in den Klassen für den DocumentListener – auch in der Basisklasse 'JSBS_TaskFrame__DocumentListener'. */

/* 
 * Marker, ob der Datensatz 'deaktiviert' (logisch gelöscht) werden darf.
 * Das Festlegen des Wertes erfolgt in dieser Methode ('setFieldsForInsert(..)') weil diese Methode
 * auch aufgerufen wird nachdem das Fenster für das Teilprogramm (Task) geöffnet wurde.
 * Das ist die einzige Stelle im Programm an der der Wert für diese Variable festgelegt wird. */
      parmTF.bolAllowDeleteWithMobileClientOffline = false;
/* 
 * Der Marker 'bolAllowInsertWithMobileClientOffline' braucht nicht mit einem Wert versorgt werden weil
 * diese Methode nur aufgerufen wird wenn ein neuer Datensatz eingefügt werden soll.
 * Bevor die Daten des neuen Datensatzes nicht gespeichert sind ist so und so kein 'copy' möglich.
 * Aus diesem Grund ist der Marker zur Steuerung, ob die Schaltfläche 'copy' aktiviert werden darf
 * nicht notwendig. */

/* 
 * Im folgenden 'if' wird abgefragt, ob das Anwendungsprogramm in der Version 'MobileClient' läuft
 * und die Verbindung zum JAS (Java Application Server) unterbrochen ist. */
      if ((parmTF.frmCC.RunVersion == JSBS_StartFrame.CONST_MobileClient) && (! parmTF.frmCC.bolJASConnectionEstablished)) {
/* 
 * Mit dem folgenden Code werden alle Felder für die Eingabe gesperrt, für die bei unterbrochener
 * Verbindung zum JAS keine Werte erfasst werden dürfen.
 * Empfehlung:
 * In diesem Zweig alle Felder bearbeiten – damit wird klar, welche Werte erfasst werden können
 * und welche nicht. */
        JSBS_GUIServices.processDisableGUIElement(parmTF, parmTF.get_txt_Sample_JTextField());
      }
      else {
/* 
 * Im 'else'-Zweig werden alle Felder wieder für die Eingabe geöffnet.
 * Empfehlung:
 * In diesem Zweig alle Felder bearbeiten – unter Umständen können sonst Felder für die Eingabe
 * gesperrt sein wenn ein Datensatz geändert wurde während die Verbindung zum JAS unterbrochen war. */
        JSBS_GUIServices.processEnableGUIElement(parmTF, parmTF.get_txt_Sample_JTextField());
      }
    }
/*
 * METHODE zum Aktivieren bzw. Deaktivieren der Eingabefelder wenn der ausgewählte Datensatz
 * geändert werden soll.
 * Detaillierte Beschreibungen – besonders für die Version 'MobileClient' bei unterbrochener
 * Verbindung zum JAS (Java Application Server – finden Sie bei den jeweiligen Code-Mustern. */
    protected static void setFieldsForUpdate(application_task parmTF) {
/* 
 * Eingabefelder für die Werte, die den Anwender-bekannten Schlüssel bilden,
 * für die Eingabe sperren.
 * Dieses 'Sperren' ist bei allen Versionen (Stand-Alone, Fat-Client, MobileClient) erforderlich.*/
      JSBS_GUIServices.processDisableGUIElement(parmTF, parmTF.get_txt_Sample_JTextField());
/* 
 * ----------
 * Der folgende Code ist nur erforderlich wenn das Anwendungsprogramm auch für die Version
 * 'MobileClient' vorgesehen ist.
 * Wird keine 'MobileClient' Version vorgesehen, kann der folgende Code-Muster gelöscht werden. */
/* 
 * Mit den folgenden Markern wird festgelegt wie das aktivieren oder deaktivieren von Schaltflächen
 * gesteuert wird wenn das Anwendungsprogramm in der Version 'MobileClient' läuft und die
 * Verbindung zum JAS unterbrochen ist.
 * Bei anderen Versionen (als 'MobileClient') haben die Werte der Variablen keine Auswirkung –
 * außer es wird der Muster-Code modifiziert.
 * Diese Variablen sind in der Basisklasse 'JSBS_TaskFrame' definiert.
 * 'true' bedeutet, dass die Aktion ausgeführt werden darf auch wenn die Verbindung zum JAS
 * unterbrochen ist.
 * Abgefragt für die Steuerung werden die Werte der Variablen in den Methoden 'setButtonStatus_
xxx'
 * in den Klassen für den DocumentListener – auch in der Basisklasse 'JSBS_TaskFrame__DocumentListener'. */

/* 
 * Marker, ob der Datensatz 'kopiert' (und damit ein neuer Datensatz eingefügt) werden darf. */
      parmTF.bolAllowInsertWithMobileClientOffline = false;
/* 
 * Im folgenden 'if' wird abgefragt, ob das Anwendungsprogramm in der Version 'MobileClient' läuft
 * und die Verbindung zum JAS (Java Application Server) unterbrochen ist. */
      if ((parmTF.frmCC.RunVersion == JSBS_StartFrame.CONST_MobileClient) && (! parmTF.frmCC.bolJASConnectionEstablished)) {
/* 
 * Mit dem folgenden Code werden alle Felder für die Eingabe gesperrt, für die bei unterbrochener
 * Verbindung zum JAS Werte geändert werden dürfen.
 * Empfehlung:
 * In diesem Zweig alle Felder bearbeiten – damit wird klar, welche Werte erfasst werden können
 * und welche nicht. */
        JSBS_GUIServices.processDisableGUIElement(parmTF, parmTF.get_txt_Sample_JTextField());
      }
      else {
/* 
 * Im 'else'-Zweig werden alle Felder wieder für die Eingabe geöffnet.
 * Empfehlung:
 * In diesem Zweig alle Felder bearbeiten – unter Umständen können sonst Felder für die Eingabe gesperrt
 * sein wenn ein neuer Datensatz eingefügt wurde während die Verbindung zum JAS unterbrochen war. */
        JSBS_GUIServices.processEnableGUIElement(parmTF, parmTF.get_txt_Sample_JTextField());
      }
    }
/*
 * METHODE zum Anzeigen der Liste entsprechend der gewählten Filter-Kriterien. */
    protected static void redisplayBOList(application_task parmTF) {
/* 
 * Methode des BOC-Set zum Selektieren der Daten aufrufen.
 * Die Auswahl-Parameter stammen aus den entsprechenden Eingabe-Feldern und wurden in der
 * Methode
'getSelectionCriteria(...)' in den entsprechenden Variablen der GUI-Klasse
 * gespeichert. */
      parmTF.structapplication_entity_BOC_Set.selectxxx(
                                        parmTF.int_Selection_VariableName_1,
                                        parmTF.str_Selection_VariableName_2);
/* 
 * Prüfen ob die Datenbank-Operation fehlerfrei war; dazu den Status-Code des
 * BOC-Set abfragen. */
      switch(parmTF.structapplication_entity_BOC_Set.StatusCode) {
      case JSBS_BO.CONST_OK:
/* Datenbank-Operation wie erwartet.
 
* Verarbeitung innerhalb dieses 'case' mit 'break' beenden. */
        break;
      case JSBS_BO.CONST_NOT_FOUND:
/* Noch keine Daten erfasst; kein Fehler.
 
* Verarbeitung innerhalb dieses 'case' mit 'break' beenden. */
        break;
      default:
/* Ein anderer Fehler ist beim Selektieren aufgetreten.
 * Fehlerbehandlungs-Methode (in der Basisklasse für das Task-Frame) aufrufen und zusätzlich
 * zur 'Location' (Klassenname, Locationscode "DBError") auch den Status-Code und die
 * Fehler-Meldung des BOC als Parameter übergeben. */
        parmTF.handleErrorEvent(CONST_ClassName, "redisplay_DBError",
          Integer.toString(parmTF.
structapplication_entity_BOC_Set.StatusCode),
          parmTF.
structapplication_entity_BOC_Set.StatusMsg);
      }
/*
 * Weil der Wert von 'bolInhibitColumnMarginChangeStore' auch von parallel laufenden
 * Methoden verändert werden kann wird der folgende Code-Block 'synchronized' ausgeführt. */
      
synchronized (parmTF) {
/* 
 * Werte aus den BO des selektierten Sets auf die JTable der GUI übertragen.
 * Dabei die Methode der BOC-Set-Klasse verwenden.
 * Die Daten-Struktur 'structJSBS_FramePosition_BOC.columnWidthArrey01' ist in der
 * Basisklasse für das Task-Frame (JSBS_TaskFrame) definiert und enthält die Information
 * über die Spaltenbreite für die Tabelle.
 * Davor wird das 'Flag' zum Verhindern, dass durch den 'TableColumnListener' falsche
 * Spaltenbreiten auf die Datenbank übernommen werden, gesetzt.
 * Eine detaillierte Beschreibung zu 'bolInhibitColumnMarginChangeStore' finden Sie
 * bei der Definition der Variable in der Basisklasse 'JSBS_TaskFrame'. */
        
parmTF.bolInhibitColumnMarginChangeStore = true;
        
parmTF.structapplication_entity_BOC_Set.setToGUI(
        parmTF.get_pnl_SelectionListTable(),
        parmTF.structJSBS_FramePosition_BOC.ColumnWidthArray01);
/* 
 * Übernehmen der Spaltenbreiten der JTable auf die Datenbank wieder erlauben. */
        
parmTF.bolInhibitColumnMarginChangeStore = false;
      
}
/* 
 * Zuletzt wird noch ermittelt, wie viele BO in der Liste sind und damit die Eingabe-Regel
 * im GUI-Element für die Eingabe der Auswahl festgelegt.
 * Mit dieser Regel kann später (bei der Auswahl für die Detail-Anzeige) geprüft werden,
 * ob mit dem eingegeben Wert auch ein BO ausgewählt werden kann. */
      int intListSize =
            parmTF.
structapplication_entity_BOC_Set.vecRecordSet.size();
/* Die umfangreiche Parameterisierung der Eingabe-Regel wird derzeit nicht genutzt;
 * nicht verwendete Parameter werden durch 'null'-Werte ersetzt. */
      parmTF.structJSBS_EntryRules.setEntryRuleValues(
        parmTF.get_txt_Selection().getName(),
        
null, 1, intListSize, null, null, null, null);
/* 
 * Als Service für den Anwender wird, wenn nur ein BO in der Liste enthalten ist,
 * dieses gleich zur Auswahl vorgeschlagen. */
      if (intListSize == 1)
         parmTF.get_txt_Selection().setText(
"1");
/* 
 * Wenn keine oder mehr BO in der Liste enthalten sind dann wird der im Auswahlfeld
 * stehende Wert erneut angezeigt. Damit wird über den DocumentListener eine neue Prüfung
 * ausgelöst ob der Auswahlwert nicht größer ist als die Anzahl der BO in der Liste.
*/
      else
         parmTF.get_txt_Selection().setText(parmTF.get_txt_Selection().getText());

/*
 * Setzen des Focus auf das Feld für die Eingabe des Auswahl-Codes für einen Datensatz.
 * Damit wird dem Benutzer sofort wieder ermöglicht, eine Auswahl einzugeben. */
      parmTF.get_txt_Selection().requestFocusInWindow();
    }
/*
 * Methode die ausgeführt wird wenn eingegebene Daten auf der Datenbank gespeichert
 * werden sollen. */
    private static void store(application_task parmTF) {
/* 
 * Werte aus den GUI-Elementen auf die Variablen des BO übertragen.
 * Dabei die Methode der BOC-Klasse verwenden. */
      parmTF.structapplication_entity_BOC_Processed.getFromGUI(
        parmTF.get_txt_
SampleJTextField(), parmTF.get_txt_SampleJTextArea(),
        parmTF.get_combo_
SampleJComboBox(), parmTF.get_check_SampleJCheckBox(),
        parmTF.get_rbtn_
SampleJRadioButton_1());
/* 
 * Methode des BOC zum Speichern der Daten aufrufen. */
      parmTF.structapplication_entity_BOC_Processed.store();
/* 
 * Prüfen ob die Datenbank-Operation fehlerfrei war; dazu den Status-Code des
 * BOC abfragen. */
      switch(parmTF.structapplication_entity_BOC_Processed.StatusCode) {
      case JSBS_BO.CONST_OK:
/* Datenbank-Operation wie erwartet.
 * Verarbeitetes BO (xxx_Processed) mit neuen Allgemeinen Attributen (Common Attributes) auf das
 * BO, das die Werte, so wie sie auf der Datenbank sind enthält (xxx_Read) kopieren.
 * Damit kann in einem späteren Schritt verglichen werden ob ein Attribut geändert wurde. */
        parmTF.structapplication_entity_BOC_Read.
            copyFrom
application_entity_BO(
                parmTF.
structapplication_entity_BOC_Processed);
/* Methode aufrufen, die die Werte des BO auf die GUI-Elemente überträgt.
 * Das Übertragen wäre zwar bei 'store()' nicht notwendig aber in der aufgerufenen
 * Methode werden auch Eingabefelder gesperrt und die Liste der aufgerufenen Task
 * im CommandCenter aktualisiert. */
        setToGUI(parmTF);
/* Verarbeitung innerhalb dieses 'case' mit 'break' beenden. */
        break;
      case JSBS_BO.CONST_DUPLICATE_KEY:
/* Ein Datensatz mit den Werten, die den Anwender-bekannten Schlüssel bilden, existiert bereits.
 * Fehlerbehandlungs-Methode (in der Basisklasse für das Task-Frame) aufrufen und zusätzlich
 * zur 'Location' (Klassenname, Locationscode "DupKey") auch die Werte für den Anwender-bekannten
 * Schlüssel als Parameter übergeben. */
        parmTF.handleErrorEvent(CONST_ClassName, "DupKey",
          parmTF.
structapplication_entity_BOC_Processed.User_Known_Key_Variable_1,
          parmTF.
structapplication_entity_BOC_Processed.User_Known_Key_Variable_2);
/* Verarbeitung innerhalb dieses 'case' mit 'break' beenden. */
        break;
      case JSBS_BO.CONST_CHANGED_INBETWEEN:
/* Der Datensatz wurde seit dem Lesen von der Datenbank von einem anderen Anwender verändert.
 * Fehlerbehandlungs-Methode (in der Basisklasse für das Task-Frame) aufrufen und zusätzlich
 * zur 'Location' (Klassenname, Locationscode "store_ChangedInbetween") auch den Anwender,
 * der die letzte Änderung vorgenommen hat, als Parameter übergeben. */
        parmTF.handleErrorEvent(CONST_ClassName, "store_ChangedInbetween",
          parmTF.
structapplication_entity_BOC_Processed.ChangedBy);
/* Verarbeitung innerhalb dieses 'case' mit 'break' beenden. */
        break;
      case JSBS_BO.CONST_NOT_FOUND:
/* Der Datensatz wurde seit dem Lesen von der Datenbank von einem anderen Anwender deaktiviert.
 * Fehlerbehandlungs-Methode (in der Basisklasse für das Task-Frame) aufrufen und zusätzlich
 * zur 'Location' (Klassenname, Locationscode "store_NotFound") auch die Werte für
 * den Anwender-bekannten Schlüssel als Parameter übergeben. */
        parmTF.handleErrorEvent(CONST_ClassName, "store_NotFound",
          parmTF.
structapplication_entity_BOC_Processed.User_Known_Key_Variable_1,
          parmTF.
structapplication_entity_BOC_Processed.User_Known_Key_Variable_2);
/* Verarbeitung innerhalb dieses 'case' mit 'break' beenden. */
        break;
      default:
/* Ein anderer Fehler ist beim Speichern der Daten aufgetreten.
 * Fehlerbehandlungs-Methode (in der Basisklasse für das Task-Frame) aufrufen und zusätzlich
 * zur 'Location' (Klassenname, Locationscode "store_DBError") auch den Status-Code und die
 * Fehler-Meldung des BOC als Parameter übergeben. */
        parmTF.handleErrorEvent(CONST_ClassName, "store_DBError",
          Integer.toString(parmTF.
structapplication_entity_BOC_Processed.StatusCode),
          parmTF.
structapplication_entity_BOC_Processed.StatusMsg);
      }
/*
 * Methode zum Anzeigen der Liste mit den aktuell gültigen Daten aufrufen.
 * Aber nur dann aufrufen wenn die Selektionskriterien gleich sind wie die Werte
 * des gerade gespeicherten BO. */
      if ( (parmTF.structapplication_entity_BOC_Processed.Variable_of_Type_String.
                compareTo(parmTF.
str_Selection_VariableName) == 0)
          && (parmTF.
structapplication_entity_BOC_Processed.Variable_of_Elementary_Type ==
                
int_Selection_VariableName)
         )
        redisplayBOList(parmTF);
/*
 * Methode zum Aktivieren / Deaktivieren von Schaltflächen (JButtons) aufrufen. */

      parmTF.
structapplication_task__DocumentListener.setButtonStatus();
/*
 * Setzen des Focus auf das Feld für die Eingabe des Auswahl-Codes für einen Datensatz.
 * Damit wird dem Benutzer sofort wieder ermöglicht, eine Auswahl einzugeben. */

      parmTF.get_txt_Selection().requestFocusInWindow();
/*
 * Festlegen der Schaltfläche (JButton) 'btn_Get' als jene,
 * auf die mit der Enter-Taste ein Mausklick ausgelöst wird. */

      parmTF.setEnterTriggeredButton(parmTF.get_btn_Get());
    }

/*
 * Methode die ausgeführt wird wenn eingegebene Daten, die auf der Datenbank gespeichert
 * sind, verändert und als neuer Datensatz gespeichert werden sollen. */
    private static void copy(application_task parmTF) {
/* 
 * Methode aufrufen in der Felder für die Eingabe gesperrt bzw. geöffnet werden wenn ein neuer Datensatz
 * eingefügt werden soll.
 * Geöffnet werden jene Felder, die Teil der Anwender-bekannten-Identifikation sind.
 * Sonderfall ist das Sperren jener Felder in denen eine Eingabe nicht erlaubt ist wenn
 * das Anwendungsprogramm in der Version 'MobileClient' läuft und die Verbindung zum JAS
 * (Java Application Server) unterbrochen ist. */
      setFieldsForInsert(parmTF);
/* 
 * Eingabefelder für die Werte, die den Anwender-bekannten Schlüssel bilden,
 * für die Eingabe öffnen.
 * Dazu wird die spezielle Methode verwendet mit der auch die ursprüngliche Farbe
 * des Hintergrunds wieder hergestellt wird.*/
      JSBS_GUIServices.processEnableGUIElement(parmTF, parmTF.get_txt_Sample_JTextField());
/* 
 * Anwender darauf aufmerksam machen, dass der Anwender-bekannte Schlüssel
 * nicht gleich bleiben darf.
 * Alle Felder mit Schlüssel-Werten markieren damit diese Aufmerksamkeit erregen. */

      JSBS_GUIServices.reverseColors(parmTF.get_
txt_Sample_JTextField());
/*
 * Setzen des Focus auf das Feld, das am wahrscheinlichsten geändert wird und markieren
 * des enthaltenen Wertes.
 * Damit kann der Wert ohne weitere Massnahme komplett überschrieben werden. */

      parmTF.get_
txt_Sample_JTextField().requestFocusInWindow();
      parmTF.get_
txt_Sample_JTextField().selectAll();
/* 
 * Werte aus den GUI-Elementen auf die Variablen des BO übertragen.
 * Dabei die Methode der BOC-Klasse verwenden. */

      parmTF.
structapplication_entity_BOC_Processed.getFromGUI(
        parmTF.get_txt_
SampleJTextField(), parmTF.get_txt_SampleJTextArea(),
        parmTF.get_combo_
SampleJComboBox(), parmTF.get_check_SampleJCheckBox(),
        parmTF.get_rbtn_
SampleJRadioButton_1());
/* 
 * BO kennzeichnen, dass es sich um ein neu eingegebenes BO handelt.
 * Ein 'neues' BO ist durch die Werte '0' im DataSetId und ObjectID zu erkennen. */

      parmTF.
structapplication_entity_BOC_Processed.DataSetID = 0;
      parmTF.
structapplication_entity_BOC_Processed.ObjectID = 0;
/* 
 * BO auf das BO mit den (von der Datenbank) gelesenen Daten kopieren.
 * Das hat in diesem Schritt des Tutorials noch keine Auswirkungen;
 * später wird aber das Aktivieren und Deaktivieren von Schaltflächen nach einer Datenänderung
 * über den Vergleich der Werte gesteuert. */

      parmTF.
structapplication_entity_BOC_Read.
        copyFrom
application_entity_BO(
          parmTF.
structapplication_entity_BOC_Processed);
/*
 * Methode zum Aktivieren / Deaktivieren von Schaltflächen (JButtons) aufrufen. */

      parmTF.
structapplication_task__DocumentListener.setButtonStatus();
/*
 * Festlegen der Schaltfläche (JButton) [ Speichern ] als jene,
 * auf die mit der Enter-Taste ein Mausklick ausgelöst wird. */

      parmTF.setEnterTriggeredButton(parmTF.get_btn_Store());
    }

/*
 * Methode die jenen Datensatz anzeigt dessen Anwender-bekannter Schlüssel
 * auf den Schlüssel des angezeigten Datensatzes folgt. */
    private static void getNext(application_task parmTF) {
/* 
 * Prüfen ob Daten erfasst aber nicht gespeichert wurden. */

      if (! checkForUnstoredChanges(parmTF)) {
/* Anwender hat entschieden, dass er geänderte aber nicht gespeicherte Daten
 * weiter bearbeiten will. */

        
return;
      }
/* Aufheben des gelesenen Datensatzes weil dieser auch verändert wird wenn
 * kein 'nächster' gefunden wird. */
      parmTF.structapplication_entity_BOC_Processed.
            copyFrom
application_entity_BO(
                parmTF.
structapplication_entity_BOC_Read);
/* 
 * Methode des BOC, das den 'nächsten' Datensatz holt, aufrufen.
 * Dabei wird der 'Startpunkt' aus den angezeigten Daten gewonnen. */
      parmTF.structapplication_entity_BOC_Read.selectNext(
        parmTF.
structapplication_entity_BOC_Read.attribute1
        parmTF.
structapplication_entity_BOC_Read.attribute2);
/* 
 * Prüfen ob die Datenbank-Operation fehlerfrei war; dazu den Status-Code des
 * BOC abfragen. */
      switch(parmTF.structapplication_entity_BOC_Read.StatusCode) {
      
case JSBS_BO.CONST_OK:
/* Datenbank-Operation wie erwartet;
 * Von der Datenbank gelesenes BO (xxx_Read) auf das BO, das die Werte aus den Eingabefeldern
 * (xxx_Processed) enthält, kopieren.
 * Damit kann in einem späteren Schritt verglichen werden ob ein Attribut geändert wurde. */
        parmTF.structapplication_entity_BOC_Processed.
            copyFrom
application_entity_BO(
                parmTF.
structapplication_entity_BOC_Read);
/* Daten anzeigen. */
        setToGUI(parmTF);
/* Verarbeitung innerhalb dieses 'case' mit 'break' beenden. */
        break;
      
case JSBS_BO.CONST_NOT_FOUND:
/* Ein Datensatz mit einem Anwender-bekannten Schlüssel, der nach dem Anwender-bekannten Schlüssel
 * des gerade angezeigten Datensatzes folgt, exisitert nicht. */
        parmTF.handleErrorEvent(CONST_ClassName, "NoNext");
/* 'Aufgehobenen' Datensatzes wieder in die Struktur für den gelesenen Datensatz übertragen
 * damit nicht falsche und verwirrende Meldungen wegen veränderter Daten kommen. */
      parmTF.structapplication_entity_BOC_Read.
            copyFrom
application_entity_BO(
                parmTF.
structapplication_entity_BOC_Processed);
/* Daten anzeigen damit die angezeigten Daten mit jenen im Datensatz übereinstimmen. */
        setToGUI(parmTF);
/* Verarbeitung innerhalb dieses 'case' mit 'break' beenden. */
        break;
      
default:
/* Ein anderer Fehler ist beim Lesen der Daten aufgetreten.
 * Fehlerbehandlungs-Methode (in der Basisklasse für das Task-Frame) aufrufen und zusätzlich
 * zur 'Location' (Klassenname, Locationscode "selectNext_DBError") auch den Status-Code
 * und die Fehler-Meldung des BOC als Parameter übergeben. */
        parmTF.handleErrorEvent(CONST_ClassName, "selectNext_DBError",
          Integer.toString(parmTF.
structapplication_entity_BOC_Read.StatusCode),
          parmTF.
structapplication_entity_BOC_Read.StatusMsg,
          parmTF.
structapplication_entity_BOC_Read.User_Known_Key_Variable_1,
          parmTF.
structapplication_entity_BOC_Read.User_Known_Key_Variable_2);
      }

    }

/*
 * Methode die jenen Datensatz anzeigt dessen Anwender-bekannter Schlüssel
 * vor dem Schlüssel des angezeigten Datensatzes liegt. */
    private static void getPrevious(application_task parmTF) {
/* 
 * Prüfen ob Daten erfasst aber nicht gespeichert wurden. */

      if (! checkForUnstoredChanges(parmTF)) {
/* Anwender hat entschieden, dass er geänderte aber nicht gespeicherte Daten
 * weiter bearbeiten will. */

        
return;
      }
/* Aufheben des gelesenen Datensatzes weil dieser auch verändert wird wenn
 * kein 'nächster' gefunden wird. */
      parmTF.structapplication_entity_BOC_Processed.
            copyFrom
application_entity_BO(
                parmTF.
structapplication_entity_BOC_Read);
/* 
 * Methode des BOC, das den 'vorigen' Datensatz holt, aufrufen.
 * Dabei wird der 'Startpunkt' aus den angezeigten Daten gewonnen. */
      parmTF.structapplication_entity_BOC_Read.selectPrevious(
        parmTF.
structapplication_entity_BOC_Read.attribute1
        parmTF.
structapplication_entity_BOC_Read.attribute2);
/* 
 * Prüfen ob die Datenbank-Operation fehlerfrei war; dazu den Status-Code des
 * BOC abfragen. */
      switch(parmTF.structapplication_entity_BOC_Read.StatusCode) {
      
case JSBS_BO.CONST_OK:
/* Datenbank-Operation wie erwartet;
 * Von der Datenbank gelesenes BO (xxx_Read) auf das BO, das die Werte aus den Eingabefeldern
 * (xxx_Processed) enthält, kopieren.
 * Damit kann in einem späteren Schritt verglichen werden ob ein Attribut geändert wurde. */
        parmTF.structapplication_entity_BOC_Processed.
            copyFrom
application_entity_BO(
                parmTF.
structapplication_entity_BOC_Read);
/* Daten anzeigen. */
        setToGUI(parmTF);
/* Verarbeitung innerhalb dieses 'case' mit 'break' beenden. */
        break;
      
case JSBS_BO.CONST_NOT_FOUND:
/* Ein Datensatz mit einem Anwender-bekannten Schlüssel, der nach dem Anwender-bekannten Schlüssel
 * des gerade angezeigten Datensatzes folgt, exisitert nicht. */
        parmTF.handleErrorEvent(CONST_ClassName, "NoPrevious");
/* 'Aufgehobenen' Datensatzes wieder in die Struktur für den gelesenen Datensatz übertragen
 * damit nicht falsche
und verwirrende Meldungen wegen veränderter Daten kommen. */
      parmTF.structapplication_entity_BOC_Read.
            copyFrom
application_entity_BO(
                parmTF.
structapplication_entity_BOC_Processed);
/* Daten anzeigen damit die angezeigten Daten mit jenen im Datensatz übereinstimmen. */
        setToGUI(parmTF);
/* Verarbeitung innerhalb dieses 'case' mit 'break' beenden. */
        break;
      
default:
/* Ein anderer Fehler ist beim Lesen der Daten aufgetreten.
 * Fehlerbehandlungs-Methode (in der Basisklasse für das Task-Frame) aufrufen und zusätzlich
 * zur 'Location' (Klassenname, Locationscode "selectPrevious_DBError") auch den Status-Code
 * und die Fehler-Meldung des BOC als Parameter übergeben. */
        parmTF.handleErrorEvent(CONST_ClassName, "selectPrevious_DBError",
          Integer.toString(parmTF.
structapplication_entity_BOC_Read.StatusCode),
          parmTF.
structapplication_entity_BOC_Read.StatusMsg,
          parmTF.
structapplication_entity_BOC_Read.User_Known_Key_Variable_1,
          parmTF.
structapplication_entity_BOC_Read.User_Known_Key_Variable_2);
      }

    }

/*
 * Methode zum Lesen eines einzelnen BO von der Datenbank und Anzeigen von dessen Werte.
 * Der Anwender-bekannte-Schlüssel wird in den Parametern übergeben - im Beispiel 2 Attribute.
 * Wenn mit diesem Schlüssel ein Datensatz gefunden wird dann wird von dieser Methode
 * 'true' zurück geliefert; sonst false. */
    protected static boolean getSingleBO(application_task parmTF,
                                   
type_or_class parmAttribute1,
                                   
type_or_class parmAttribute2) {
/* 
 * Aktuell gültiges BO von der Datenbank lesen. */

      parmTF.
structapplication_entity_BOC_Read.selectByUserKnownKey(
        
parmAttribute1,
        
parmAttribute2);
/* 
 * Prüfen ob die Datenbank-Operation fehlerfrei war; dazu den Status-Code des
 * BOC abfragen. */

      
switch(parmTF.structapplication_entity_BOC_Read.StatusCode) {
      
case JSBS_BO.CONST_OK:
/* Datenbank-Operation wie erwartet;
 * Von der Datenbank gelesenes BO (xxx_Read) auf das BO, das die Werte aus den Eingabefeldern
 * (xxx_Processed) enthält, kopieren.
 * Damit kann in einem späteren Schritt verglichen werden ob ein Attribut geändert wurde. */

        parmTF.
structapplication_entity_BOC_Processed.
            copyFrom
application_entity_BO(
                parmTF.
structapplication_entity_BOC_Read);
/* Daten anzeigen. */
        setToGUI(parmTF);

/* An die aufrufende Methode signalisieren dass ein Datensatz gefunden wurde. */
        
return true;
      
case JSBS_BO.CONST_NOT_FOUND:
/* Kein Datensatz mit den in den Parametern übergebenen Werten für den Anwender-bekannten
 * Schlüssel gefunden. Über 'false' an die aufrufende Methode signalisieren. */

        
return false;
      
default:
/* Ein anderer Fehler ist beim Selektieren aufgetreten.
 * Fehlerbehandlungs-Methode (in der Basisklasse für das Task-Frame) aufrufen und zusätzlich
 * zur 'Location' (Klassenname, Locationscode "getSingleBO_DBError") auch den Status-Code und die
 * Fehler-Meldung des BOC als Parameter übergeben. */

        parmTF.handleErrorEvent(
CONST_ClassName, "getSingleBO_DBError",
          Integer.toString(parmTF.
structapplication_entity_BOC_Read.StatusCode),
          parmTF.
structapplication_entity_BOC_Read.StatusMsg);
      }

/* Return-Wert, falls das Programm doch diese Stelle erreicht. */
      
return false;
    }

/*
 * Methode zum Auswählen eines Business-Objects aus der angezeigten Liste,
 * neuerliches Lesen des BO von der Datenbank (falls ein anderer Anwender in der
 * Zwischenzeit eine Veränderung vorgenommen hat) und Anzeigen der Werte im Detail-Bereich
 * (Teil der GUI mit den GUI-Elementen für die Eingabe von Werten) der GUI. */
    protected static void getForUpdate(application_task parmTF) {
/* 
 * Prüfen ob Daten erfasst aber nicht gespeichert wurden. */

      
if (! checkForUnstoredChanges(parmTF)) {
/* Anwender hat entschieden, dass er geänderte aber nicht gespeicherte Daten
 * weiter bearbeiten will. */

        
return;
      }
/* 
 * Nummer aus dem Auswahl-Feld der GUI auslesen.
 * Mit der verwendeten Methode wird die (in der Methode 'redisplayBOList(...)' parameterisierte)
 * Klasse 'JSBS_EntryRules' auf die erlaubten Grenzen für die eingegebene Ziffer geprüft.
 * Bei einem ungültigen Wert wird der Hintergrund rot gefärbt. */
      Integer intSelectedRow =
        JSBS_GUIServices.getInteger(parmTF.get_txt_Selection(), parmTF); 
/* 
 * Bei einer ungültigen Eingabe (auch wenn der Wert außerhalb der erlaubten Grenzen ist)
 * wird von der Methode ein 'null'-Wert zurückgeliefert.
 * In diesem Fall wird die Methode beendet; dem Anwender wird durch den roten Hintergrund
 * die fehlerhafte Eingabe signalisiert. */
      if (intSelectedRow == null) return;
/* 
 * Eingegebene Nummer ist gültig; indiziertes BO in eigenes Objekt übertragen.
 * Durch das eigene Objekt ist der folgende Code leichter lesbar. */
      int intListIndex = intSelectedRow.intValue() - 1;
      application_entity_BO structapplication_entity_BO =
        (
application_entity_BO) 
        parmTF.
structapplication_entity_BOC_Set.vecRecordSet.elementAt(intListIndex);
/* 
 * Methode zum Lesen und Anzeigen eines einzelnen BO aufrufen.
 * Über den Rückgabewert wird signalisiert, ob der Datensatz gefunden wurde. */
      if (getSingleBO(parmTF,
                     struct
application_entity_BO.attribute1,
                     struct
application_entity_BO.attribute2)) {
/* 
 * BO erfolgreich gelesen und angezeigt. */

/*
 * Setzen des Focus auf das Feld für die Eingabe des Auswahl-Codes für einen Datensatz.
 * Damit wird dem Benutzer sofort wieder ermöglicht, eine Auswahl einzugeben. */

        parmTF.get_txt_Selection().requestFocusInWindow();
/*
 * Festlegen der Schaltfläche (JButton) [ Bearbeiten ] als jene,
 * auf die mit der Enter-Taste ein Mausklick ausgelöst wird. */

        parmTF.setEnterTriggeredButton(parmTF.get_btn_Get());

      }
      else {
/* In der Liste angezeigtes BO wurde in der Zwischenzeit gelöscht. */
        parmTF.handleErrorEvent(
CONST_ClassName, "getForUpdate_NotFound");
      }
    }
/*
 * Methode zum 'Deaktivieren' eines Business-Objects aus der angezeigten Liste.
 * 'Deaktivieren' heisst, dass die Gültigkeit des BO beendet wird - der Datensatz
 * aber noch auf der Datenbank-Tabelle bleibt
 * (Teil der GUI mit den GUI-Elementen für die Eingabe von Werten) der GUI. */
    protected static void processDeactivate(application_task parmTF) {
/* 
 * Nummer aus dem Auswahl-Feld der GUI auslesen.
 * Mit der verwendeten Methode wird die (in der Methode 'redisplayBOList(...)' parameterisierte)
 * Klasse 'JSBS_EntryRules' auf die erlaubten Grenzen für die eingegebene Ziffer geprüft.
 * Bei einem ungültigen Wert wird der Hintergrund rot gefärbt. */
      Integer intSelectedRow =
        JSBS_GUIServices.getInteger(parmTF.get_txt_Selection(), parmTF); 
/* 
 * Bei einer ungültigen Eingabe (auch wenn der Wert außerhalb der erlaubten Grenzen ist)
 * wird von der Methode ein 'null'-Wert zurückgeliefert.
 * In diesem Fall wird die Methode beendet; dem Anwender wird durch den roten Hintergrund
 * die fehlerhafte Eingabe signalisiert. */
      if (intSelectedRow == null) return;
/* 
 * Eingegebene Nummer ist gültig; indiziertes BO in eigenes Objekt übertragen.
 * Durch das eigene Objekt ist der folgende Code leichter lesbar. */
      int intListIndex = intSelectedRow.intValue() - 1;
      application_entity_BO structapplication_entity_BO =
        (
application_entity_BO
        parmTF.
structapplication_entity_BOC_Set.vecRecordSet.elementAt(intListIndex);
/* 
 * Aus dem BO ein BOC (Client-Side-Klasse) machen und dieses dann 'deaktivieren'
 * Durch dieses Verfahren wird auch geprüft, ob das BO inzwischen durch einen anderen
 * Anwender verändert wurde. */
      application_entity_BOC structapplication_entity_BOC =
          new application_entity_BOC(parmTF.frmCC, parmTF);
      structapplication_entity_BOC.copyFromapplication_entity_BO(structapplication_entity_BO);
/* 
 * Methode zum Deaktivieren aufrufen. */

      structapplication_entity_BOC.deactivate();
/* 
 * Prüfen ob die Datenbank-Operation fehlerfrei war; dazu den Status-Code des
 * BOC abfragen. */
      switch(structapplication_entity_BOC.StatusCode) {
        case JSBS_BO.CONST_OK:
/* Datenbank-Operation wie erwartet;
 * Liste neu anzeigen. */
          redisplayBOList(parmTF);
/* Algorithmus zum Entfernen der angezeigten Daten wenn das gerade deaktivierte BO
 * im DetailBereich der GUI angezeigt wurde. */

          if (structapplication_entity_BOC.ObjectID ==
              parmTF.structapplication_entity_BOC_Read.ObjectID) {
/* Ein 'leeres' BOC für die anzuzeigenden Daten erstellen. */
            parmTF.structapplication_entity_BOC_Read = new application_entity_BOC(parmTF.frmCC, parmTF);
/* Auf das BOC zum Vergleichen kopieren. */
            parmTF.structapplication_entity_BOC_Processed.
              copyFromapplication_entity_BO(parmTF.structapplication_entity_BOC_Read);
/* 'Leere' Felder anzeigen; dazu die bestehende Methode benutzen. */
            setToGUI(parmTF);
/* 
 * Methode aufrufen in der Felder für die Eingabe gesperrt bzw. geöffnet werden wenn ein neuer Datensatz
 * eingefügt werden soll.
 * Geöffnet werden jene Felder, die Teil der Anwender-bekannten-Identifikation sind.
 * Sonderfall ist das Sperren jener Felder in denen eine Eingabe nicht erlaubt ist wenn
 * das Anwendungsprogramm in der Version 'MobileClient' läuft und die Verbindung zum JAS
 * (Java Application Server) unterbrochen ist. */
            setFieldsForInsert(parmTF);
          }
/* Verarbeitung innerhalb dieses 'case' mit 'break' beenden. */
          break;
/* 
 * ***********
 * Das folgende case-Statement ist für jeden Hinderungsgrund für das Deaktivieren
 * (weil noch mindestens ein Datensatz, der den zu deaktivierenden Datensatz als
 * Fremdschlüssel hat, existiert) zu kopieren und zu adaptieren.*/

        case application_entity_BO.CONST_DEAKTIVATE_INHIBIT_REASON_Reason:
/* Das BO ist Fremdschlüssel eines anderen BO und darf nicht deaktiviert werden.
 * Wenn die Abfrage entsprechend dem Muster implementiert wurde, dann ist der
 * Anwender-bekannte Schlüssel des referenzierenden BO in der Variable 'StatusMsg'. */
          parmTF.handleErrorEvent(CONST_ClassName, "processDeactivate_DependantRecord_XXX",
                                   
structapplication_entity_BOC.StatusMsg);
/* Verarbeitung innerhalb dieses 'case' mit 'break' beenden. */
          break;
/* Ende des zu kopierenden und adaptierenden Codes.
 * ***********
 * */

        case JSBS_BO.CONST_CHANGED_INBETWEEN:
/* In der Liste angezeigtes BO wurde in der Zwischenzeit von einem anderen Anwender
 * verändert und darf nicht gelöscht werden. */
          parmTF.handleErrorEvent(CONST_ClassName, "processDeactivate_ChangedInbetween",
                                   
structapplication_entity_BOC.ChangedBy);
/* Verarbeitung innerhalb dieses 'case' mit 'break' beenden. */
          break;
        case JSBS_BO.CONST_NOT_FOUND:
/* In der Liste angezeigtes BO wurde in der Zwischenzeit von einem anderen Anwender gelöscht. */
          parmTF.handleErrorEvent(CONST_ClassName, "processDeactivate_NotFound",
          
structapplication_entity_BOC.User_Known_Key_Variable_1,
          
structapplication_entity_BOC.User_Known_Key_Variable_2);
/* Verarbeitung innerhalb dieses 'case' mit 'break' beenden. */
          break;
        default:
/* Ein anderer Fehler ist beim Deaktivieren aufgetreten.
 * Fehlerbehandlungs-Methode (in der Basisklasse für das Task-Frame) aufrufen und zusätzlich
 * zur 'Location' (Klassenname, Locationscode "DupKey") auch den Status-Code und die
 * Fehler-Meldung des BOC als Parameter übergeben. */
          parmTF.handleErrorEvent(CONST_ClassName, "processDeactivate_DBError",
          Integer.toString(struct
application_entity_BOC.StatusCode),
          struct
application_entity_BOC.StatusMsg);
      }
/*
 * Setzen des Focus auf das Feld für die Eingabe des Auswahl-Codes für einen Datensatz.
 * Damit wird dem Benutzer sofort wieder ermöglicht, eine Auswahl einzugeben. */

      parmTF.get_txt_Selection().requestFocusInWindow();
/*
 * Festlegen der Schaltfläche (JButton) [ Bearbeiten ] als jene,
 * auf die mit der Enter-Taste ein Mausklick ausgelöst wird. */

      parmTF.setEnterTriggeredButton(parmTF.get_btn_Get());
    }
/*
 * Methode die prüft, ob geänderte Daten nicht gespeichert wurden und
 * wenn notwendig ein Fenster mit der Rückfrage an den Anwender anzeigt. */
    protected static boolean checkForUnstoredChanges(application_task parmTF) {
/* 
 * Als erstes wird geprüft, ob überhaupt geänderte und nicht gespeicherte Daten
 
 * vorhanden sind. */

      
if (parmTF.structapplication_entity_BOC_Processed.isDifferent(
            
parmTF.structapplication_entity_BOC_Read)) {
/* 
 * Variable aus dem DocumentListener ob die Daten komplett und fehlerfrei sind und
 * gespeichert werden können. */

        
boolean bolSaveable = parmTF.structapplication_task__DocumentListener.bolCompleteEntryOK;
/* 
 * Variable für die Rückgabe aus dieser Methode; 'true' signalisiert, dass
im Programm
 * mit der vom Anwender gewünschten Aktion fortgesetzt wird.
 * 'false' signalisiert, dass der Anwender die Daten korrigieren will.
*/
        
boolean bolContinue = false;
/*
 * Variable mit dem Wert der aus dem Dialog mit dem Anwender zurückgegeben wird und
 * signalisiert wie im Programm fortgesetzt wird. */

        String strProcessIndicator = 
"";
/*
 * Aufrufen des Dialog-Fensters für die Rückfrage an den Anwender.
 * Die verwendete Klasse ist unter den JavaScout-Basisklassen implementiert. */

        JSBS_UnstoredChangesDialog dlgJSBS_UnstoredChangesDialog =
            
new JSBS_UnstoredChangesDialog(parmTF, bolSaveable);
/* Durch die Definition als 'Dialog' ist das Task-Frame 'gesperrt' solange das jetzt
 * aufgerufene Fenster nicht geschlossen ist.
 * Der anschließende Code wird erst nach dem Schließen von JSBS_UnstoredChangesDialog
 * ausgeführt. */

/*
 * Übernehmen welche weitere Verarbeitung der Anwender ausgewählt hat. */

        strProcessIndicator = dlgJSBS_UnstoredChangesDialog.
strProcessIndicator;
/*
 * Klasse mit dem Dialog wird ab jetzt nicht mehr gebraucht. */

        dlgJSBS_UnstoredChangesDialog.dispose();
/* 
 * Abfragen wie der Anwender fortsetzen will und die entsprechende Verarbeitung ausführen.
*/
        
if (strProcessIndicator.compareTo(JSBS_UnstoredChangesDialog.CONST_PROCESS_STORE) == 0) {
/* 
 * Daten sollen gespeichert werden und dann soll mit der vom Anwender gewünschten Aktion
 
 * fortgesetzt werden.
*/
        
  store(parmTF);
        
  bolContinue = true;
        }

        
if (strProcessIndicator.compareTo(JSBS_UnstoredChangesDialog.CONST_PROCESS_DISCARD) == 0) {
/* 
 * Daten sollen nicht gespeichert werden; mit der vom Anwender gewünschten Aktion
fortsetzen. */
        
  bolContinue = true;
        }

        
if (strProcessIndicator.compareTo(JSBS_UnstoredChangesDialog.CONST_PROCESS_BACK) == 0) {
/* 
 * Daten sollen nicht gespeichert werden und die vom Anwender gewünschte Aktion soll nicht 

 * ausgeführt werden. Stattdessen will der Anwender die eingegebenen Daten verändern.
*/
        
  bolContinue = false;
        }
/* 
 * An die aufrufende Methode signalisieren wie der Anwender fortsetzen will.
*/
        
return bolContinue;
      }

      
else {
/* 
 * Keine ungespeicherten Daten vorhanden; der aufrufenden Methode signalisieren, dass
 * mit der gewünschten Aktion des Anwenders fortgesetzt werden kann. */

        
return true;
      }
    }
}

zum Inhaltsverzeichnis

Muster-Code für die Klasse für den DocumentListener

Welche Platzhalter durch Bezeichnungen des eigentlichen Projektes zu ersetzen sind finden Sie im Abschnitt
Anleitung zur Adaptierung in allen Klassen und
Anleitung zur Adaptierung in der Klasse für den DocumentListener .

package application_package.client;
/*
 * Package und Klasse für die Behandlung von Status-Änderungen bei
 * GUI-Elementen vom Typ JCheckBox und JRadioButton. */

import java.awt.event.ItemEvent;
/*
 * Package mit den Klassen für die GUI-Elemente. */

import javax.swing.*;
/*
 * Packages mit den Klassen für die Behandlung von Document und -Event. */

import javax.swing.text.*;
import javax.swing.event.*;
/*
 * Package mit der Basisklassen für das TaskFrame. */

import js_base.frame.*;
/*
 * Package mit den Business-Objects. */

import application_package.bo.*;
/**
 *
 * @author name[at]company
 * @date 20xx-xx-xx
 *
 * @description
 *  DocumentListener-Klasse.
 *  Ein Objekt dieser Klasse ist bei allen GUI-Elementen, bei denen Text
 *  eingegeben (z.B. JTextField) oder ausgewählt (z.B. JComboBox) werden kann, 'registirert'.
 *  Wenn eine Text-Eingabe erfolgt wird eine zugehörige Methode, die in der geerbten Basisklasse
 *  definiert ist, aufgerufen.
 *  Jede dieser Methoden ruft die Methode 'anyUpdate(...) auf.
 *  In dieser Methode wird abgefragt, bei welchem GUI-Element der Text geändert wurde und
 *  die entsprechenden Prüfungen ausgeführt.
 *  Detail-Dokumentation finden Sie bei den einzelnen Methoden.
 *
 * @change-log
 * when         who               why
 * --------------------------------------------------------
 *
 */

public class application_task__DocumentListener extends JSBS_TaskFrame__DocumentListener {
/*
 * Referenz auf das zugehörige Task-Frame. */

    
private application_task frmTF;
/*
 * Objekte der Klasse 'Document', die für die Textaufbereitung bei GUI-Elementen zuständig sind.
 * Diese werden aus Performanz-Gründen im 'Constructor' aus den GUI-Elementen herausgelesen und
 * in den folgenden Variablen gehalten. */

    
private Document doc_txt_Sample_JTextField;
    
private Document doc_txt_Sample_JTextArea;
/* 
 * Das Document für eine JComboBox IST NUR NOTWENDIG WENN IN DAS FELD DIREKT TEXT
 
 * EINGEGEBEN WERDEN KANN.
 
 * (Wenn nur auf eine Auswahl reagiert werden soll erfolgt das in der Methode 'itemStateChanged'.)
*/
    private Document doc_combo_Sample_JComboBox;
/*
 * Merker (Flags) ob die Eingaben in den GUI-Elementen korrekt sind. */

    
private boolean bol_txt_Sample_JTextField_OK;
    
private boolean bol_txt_Sample_JTextArea_OK;
    
private boolean bol_combo_Sample_JComboBox_OK;
/*
 * Constructor der Klasse.
 * Code darin wird aufgerufen wenn ein Objekt dieser Klasse erstellt wird.
 * Als Parameter wird das jeweilig TaskFrame übernommen. */

    
public application_task__DocumentListener(application_task parmTF) {
/*
 * Aufruf des Constructors der Basisklasse (JSBS_TaskFrame__DocumentListener).
 * Darin werden die Klasse des aufrufenden TaskFrames und die 'Document's der GUI-Elemente,
 * die in der Basisklasse (JSBS_TaskFrame) definiert sind, in die dort definierten
 * Variablen übertragen. */

        
super(parmTF);
/* 
 * Übernehmen der als Parameter übergebenen Referenz auf das aufrufende Task-Frame
 * in die Variable dieser Klasse. */

        
frmTF = parmTF;
/* 
 * 'Herausholen' des jeweiligen 'Document' aus den GUI-Elementen für die Eingabe von Werten.
 * Das wird aus Performanz-Gründen einmalig im 'Constructor' durchgeführt. */

        
doc_txt_Sample_JTextField = frmTF.get_txt_Sample_JTextField().getDocument();
        
doc_txt_Sample_JTextArea = frmTF.get_txt_Sample_JTextArea().getDocument();
/* 
 * Spezieller Algorithmus für JComboBoxes um das 'Document' zu ermitteln.
 
 * Das Document für eine JComboBox IST NUR NOTWENDIG WENN IN DAS FELD DIREKT TEXT
 
 * EINGEGEBEN WERDEN KANN.
 
 * (Wenn nur auf eine Auswahl reagiert werden soll erfolgt das in der Methode 'itemStateChanged'.)

 *  
 * Zuerst muss die 'JTextComponent' herausgeholt werden. */

        JTextComponent tc_combo_Sample_JComboBox = (JTextComponent)
            frmTF.get_combo_Sample_JComboBox().getEditor().getEditorComponent();
/* Anschliessend wird das 'Document' der 'JTextComponent' ermittelt. */
        doc_combo_Sample_JComboBox = tc_combo_Sample_JComboBox.getDocument();
/* 
 * Erstmaliges 'Setzen' der OK-Flags.
 * Für alle als 'Mandatory' definierten GUI-Elemente wird 'false' gesetzt.
 * Damit wird bewirkt, dass beim erstmaligen Aufrufen des Task-Frames in leere Felder,
 * die als 'Mandatory' definiert sind, Werte eingegeben werden müssen. */

        
bol_txt_Sample_JTextField_OK = !
            
frmTF.structJSBS_EntryRules.checkMandatory(frmTF.get_txt_Sample_JTextField());
        
bol_txt_Sample_JTextArea_OK = !
            
frmTF.structJSBS_EntryRules.checkMandatory(frmTF.get_txt_Sample_JTextArea());
        
bol_combo_Sample_JComboBox_OK = !
            
frmTF.structJSBS_EntryRules.checkMandatory(frmTF.get_combo_Sample_JComboBox());
    }
/*
 * Methode die indirekt aufgerufen wird wenn ein Wert eines GUI-Elements verändert wird.
 * 'Indirekt aufgerufen' bedeutet, dass die mit dem 'DocumentListener' zu implementierenden
 * 'abstrakten Methoden' in der Basisklasse (JSBS_TaskFrame__DocumentListener) 'konkret'
 * implementiert sind und in diesen Methoden diese Methode (anyUpdate) aufgerufen wird.
 * Dieser Code ist also das 'Überschreiben' der Methode der geerbten Klasse. */

    
public void anyUpdate(DocumentEvent e) {
/*
 * Aufruf der Methode in der geerbten Klasse.
 * Damit werden die in den Basisklassen definierten GUI-Elemente verarbeitet. */

        
super.anyUpdate(e);
/* 
 * 'Document' welches den Event ausgelöst hat, aus dem Event ermitteln. */

        Document edoc = e.getDocument();
/* 
 * 'Document' mit allen als Variable definierten (und im Constructor ermittelten)
 * 'Document's der GUI-Elemente vergleichen. */

/* 
 * Standard-Algorithmus; für die Zuweisung des Wertes auf das Attribut des BO (Business Object)
 * wird die Methode 'getFromGUI(...)' der jeweiligen BOC-Klasse aufgerufen. */

        
if (edoc == doc_txt_Sample_JTextField) {
/* 
 * Korrekturmassnahme wenn dieses GUI-Element in der Methode 'copy' des ActionHandlers als Feld
 * mit Schlüsselwert markiert wurde: Wiederherstellen von Standard-Farbe, -Font und -Schriftgrösse.
 * Wenn dieses GUI-Element nicht Teil des Anwender-bekannten Schlüssels ist kann dieser Code
 * weg gelassen werden. */

          JSBS_GUIServices.setDefinedForegroundColor(
frmTF.get_txt_Sample_JTextField(), frmTF);
/* 
 * Eingabe im GUI-Feld auf Gültigkeit prüfen. Dazu wird die Methode zum Auslesen des Wertes
 * verwendet. In der verwendeten Methode wird auch der Hintergrund des GUI-Elements eingefärbt.
 * Unter 'Kommentar' (//) stehen alternative Methoden für die Eingaben von numerischen Werten
 * in einem 'JTextField' und 'JTextArea'. Bitte entfernen Sie die nicht benötigen Zeilen
 * mit den Methoden-Aufrufen. */

          
bol_txt_Sample_JTextField_OK = (
            JSBS_GUIServices.getTextFromJTextField(
frmTF.get_txt_Sample_JTextField(), frmTF)
//            JSBS_GUIServices.getTextFromJTextArea(frmTF.get_txt_Sample_JTextArea())
//            JSBS_GUIServices.getInteger(frmTF.get_txt_Sample_JTextField(), frmTF)
//            JSBS_GUIServices.getShort(frmTF.get_txt_Sample_JTextField(), frmTF)
//            JSBS_GUIServices.getBigDecimal(frmTF.get_txt_Sample_JTextField(), frmTF)
//            JSBS_GUIServices.getSelectedTextFromJComboBox(frmTF.get_combo_Sample_JComboBox(), frmTF)
              !=
null);
/* Wenn der eingegebene Wert die Prüf-Regeln bestanden hat dann wird der Wert auf das
 * zugehörige Attribut des BO übertragen.
 * Dazu wird die Methode 'getFromGUI(...) der jeweiligen BOC-Klasse verwendet. */

          
if (bol_txt_Sample_JTextField_OK)
            
frmTF.structapplication_entity_BOC_Processed.getFromGUI(
                
null, frmTF.get_txt_Sample_JTextField(), null, ...);
        }
/* 
 * ***************************************************
 * Die folgenden Code-Muster werden nur empfohlen, wenn ein spezielles Verfahren notwendig
 * ist um den Wert aus dem Eingabefeld in das Attribut des BO zu übertragen und die Methode
 * 'getFromGUI(...)' nicht ausreicht. */

/* 
 * 'Document' aus einem JTextField vergleichen. */

        
if (edoc == doc_txt_Sample_JTextField) {
/* 
 * Korrekturmassnahme wenn dieses GUI-Element in der Methode 'copy' des ActionHandlers als Feld
 * mit Schlüsselwert markiert wurde: Wiederherstellen von Standard-Farbe, -Font und -Schriftgrösse.
 * Wenn dieses GUI-Element nicht Teil des Anwender-bekannten Schlüssels ist kann dieser Code
 * weg gelassen werden. */

          JSBS_GUIServices.setDefinedForegroundColor(
frmTF.get_txt_Sample_JTextField(), frmTF);
/* Wert des GUI-Elementes in die Hilfs-Variable (definiert in der geerbten Klasse)
 * übertragen. In der verwendeten Methode wird auch die Prüfung auf Gültigkeit
 * des eingegebenen Wertes durchgeführt und der Hintergrund des GUI-Elements eingefärbt. */

          
strAuxString =
            JSBS_GUIServices.getTextFromJTextField(
frmTF.get_txt_Sample_JTextField(), frmTF);
/* Wenn der eingegebene Wert nicht den Prüf-Regeln entspricht dann ist von der Methode
 * zurückgelieferte Wert 'null'. Das wird abgefragt und damit das Flag gesetzt. */

          
bol_txt_Sample_JTextField_OK = (strAuxString != null);
/* Wenn der eingegebene Wert die Prüf-Regeln bestanden hat dann wird der Wert auf das
 * zugehörige Attribut des BO übertragen. */

          
if (bol_txt_Sample_JTextField_OK)
            
frmTF.structapplication_entity_BOC_Processed.Variable_1 =
            
strAuxString;
        }
/* 
 * 'Document ' aus einem JTextField vergleichen; das 'Text'-Feld enthält eine 'Integer'-Zahl. */

        
if (edoc == doc_txt_Sample_JTextField) {
/* 
 * Korrekturmassnahme wenn dieses GUI-Element in der Methode 'copy' des ActionHandlers als Feld
 * mit Schlüsselwert markiert wurde: Wiederherstellen von Standard-Farbe, -Font und -Schriftgrösse.
 * Wenn dieses GUI-Element nicht Teil des Anwender-bekannten Schlüssels ist kann dieser Code
 * weg gelassen werden. */

          JSBS_GUIServices.setDefinedForegroundColor(
frmTF.get_txt_Sample_JTextField(), frmTF);
/* Wert des GUI-Elementes in die Hilfs-Variable (definiert in der geerbten Klasse)
 * übertragen. In der verwendeten Methode wird auch die Prüfung auf Gültigkeit
 * des eingegebenen Wertes durchgeführt und der Hintergrund des GUI-Elements eingefärbt. */

          
intAuxInteger =
            JSBS_GUIServices.getInteger(
frmTF.get_txt_Sample_JTextField(), frmTF);
/* Wenn der eingegebene Wert nicht den Prüf-Regeln entspricht dann ist von der Methode
 * zurückgelieferte Wert 'null'. Das wird abgefragt und damit das Flag gesetzt. */

          
bol_txt_Sample_JTextField_OK = (intAuxInteger != null);
/* Wenn der eingegebene Wert die Prüf-Regeln bestanden hat dann wird der Wert auf das
 * zugehörige Attribut des BO übertragen. */

          
if (bol_txt_Sample_JTextField_OK)
            
frmTF.structapplication_entity_BOC_Processed.Variable_1 =
            
intAuxInteger;
        }
/* 
 * 'Document ' aus einem JTextField vergleichen; das 'Text'-Feld enthält eine 'Short'-Zahl. */

        
if (edoc == doc_txt_Sample_JTextField) {
/* 
 * Korrekturmassnahme wenn dieses GUI-Element in der Methode 'copy' des ActionHandlers als Feld
 * mit Schlüsselwert markiert wurde: Wiederherstellen von Standard-Farbe, -Font und -Schriftgrösse.
 * Wenn dieses GUI-Element nicht Teil des Anwender-bekannten Schlüssels ist kann dieser Code
 * weg gelassen werden. */

          JSBS_GUIServices.setDefinedForegroundColor(
frmTF.get_txt_Sample_JTextField(), frmTF);
/* Wert des GUI-Elementes in die Hilfs-Variable (definiert in der geerbten Klasse)
 * übertragen. In der verwendeten Methode wird auch die Prüfung auf Gültigkeit
 * des eingegebenen Wertes durchgeführt und der Hintergrund des GUI-Elements eingefärbt. */

          
intAuxShort =
            JSBS_GUIServices.getShort(
frmTF.get_txt_Sample_JTextField(), frmTF);
/* Wenn der eingegebene Wert nicht den Prüf-Regeln entspricht dann ist von der Methode
 * zurückgelieferte Wert 'null'. Das wird abgefragt und damit das Flag gesetzt. */

          
bol_txt_Sample_JTextField_OK = (intAuxShort != null);
/* Wenn der eingegebene Wert die Prüf-Regeln bestanden hat dann wird der Wert auf das
 * zugehörige Attribut des BO übertragen. */

          
if (bol_txt_Sample_JTextField_OK)
            
frmTF.structapplication_entity_BOC_Processed.Variable_1 =
            
intAuxShort;
        }
/* 
 * 'Document ' aus einem JTextField vergleichen; das 'Text'-Feld enthält eine 'BigDecimal'-Zahl. */

        
if (edoc == doc_txt_Sample_JTextField) {
/* 
 * Korrekturmassnahme wenn dieses GUI-Element in der Methode 'copy' des ActionHandlers als Feld
 * mit Schlüsselwert markiert wurde: Wiederherstellen von Standard-Farbe, -Font und -Schriftgrösse.
 * Wenn dieses GUI-Element nicht Teil des Anwender-bekannten Schlüssels ist kann dieser Code
 * weg gelassen werden. */

          JSBS_GUIServices.setDefinedForegroundColor(
frmTF.get_txt_Sample_JTextField(), frmTF);
/* Wert des GUI-Elementes in die Hilfs-Variable (definiert in der geerbten Klasse)
 * übertragen. In der verwendeten Methode wird auch die Prüfung auf Gültigkeit
 * des eingegebenen Wertes durchgeführt und der Hintergrund des GUI-Elements eingefärbt. */

          
bdAuxBigDecimal =
            JSBS_GUIServices.getBigDecimal(
frmTF.get_txt_Sample_JTextField(), frmTF);
/* Wenn der eingegebene Wert nicht den Prüf-Regeln entspricht dann ist von der Methode
 * zurückgelieferte Wert 'null'. Das wird abgefragt und damit das Flag gesetzt. */

          
bol_txt_Sample_JTextField_OK = (bdAuxBigDecimal != null);
/* Wenn der eingegebene Wert die Prüf-Regeln bestanden hat dann wird der Wert auf das
 * zugehörige Attribut des BO übertragen. */

          
if (bol_txt_Sample_JTextField_OK)
            
frmTF.structapplication_entity_BOC_Processed.Variable_1 =
            
bdAuxBigDecimal;
        }

/* 
 * 'Document ' aus einer JTextArea vergleichen. */

        
if (edoc == doc_txt_Sample_JTextArea) {
/* 
 * Korrekturmassnahme wenn dieses GUI-Element in der Methode 'copy' des ActionHandlers als Feld
 * mit Schlüsselwert markiert wurde: Wiederherstellen von Standard-Farbe, -Font und -Schriftgrösse.
 * Wenn dieses GUI-Element nicht Teil des Anwender-bekannten Schlüssels ist kann dieser Code
 * weg gelassen werden. */

          JSBS_GUIServices.setDefinedForegroundColor(
frmTF.get_txt_Sample_JTextArea(), frmTF);
/* Wert des GUI-Elementes in die Hilfs-Variable (definiert in der geerbten Klasse)
 * übertragen. In der verwendeten Methode wird auch die Prüfung auf Gültigkeit
 * des eingegebenen Wertes durchgeführt und der Hintergrund des GUI-Elements eingefärbt. */
          
strAuxString =
            JSBS_GUIServices.getTextFromJTextArea(
frmTF.get_txt_Sample_JTextArea());
/* Wenn der eingegebene Wert nicht den Prüf-Regeln entspricht dann ist von der Methode
 * zurückgelieferte Wert 'null'. Das wird abgefragt und damit das Flag gesetzt. */

          
bol_txt_Sample_JTextArea_OK = (strAuxString != null);
/* Wenn der eingegebene Wert die Prüf-Regeln bestanden hat dann wird der Wert auf das
 * zugehörige Attribut des BO übertragen. */

          
if (bol_txt_Sample_JTextArea_OK)
            
frmTF.structapplication_entity_BOC_Processed. Variable_2 =
            
strAuxString;
        }
/* 
 * 'Document' aus einer JComboBox vergleichen.
 
 * ==>> Dieser Algorithmus ist nur notwendig wenn eine Text direkt in die Combo-Box
 
 * ==>> eingegeben werden darf.
 
 * ==>> Wenn nur die Auswahl geändert werden darf dann ist der Algorithmus innerhalb
 
 * ==>> der Methode itemStateChanged(...) einfacher !
*/
        
if (edoc == doc_combo_Sample_JComboBox) {
/* 
 * Korrekturmassnahme wenn dieses GUI-Element in der Methode 'copy' des ActionHandlers als Feld
 * mit Schlüsselwert markiert wurde: Wiederherstellen von Standard-Farbe, -Font und -Schriftgrösse.
 * Wenn dieses GUI-Element nicht Teil des Anwender-bekannten Schlüssels ist kann dieser Code
 * weg gelassen werden. */

          JSBS_GUIServices.setDefinedForegroundColor(
frmTF.get_combo_Sample_JComboBox(), frmTF);
/* Wert des GUI-Elementes in die Hilfs-Variable (definiert in der geerbten Klasse)
 * übertragen. In der verwendeten Methode wird auch die Prüfung auf Gültigkeit
 * des eingegebenen Wertes durchgeführt und der Hintergrund des GUI-Elements eingefärbt. */
          
strAuxString =
            JSBS_GUIServices.getSelectedTextFromJComboBox(
frmTF.get_combo_Sample_JComboBox());
/*
 
* Alternative zum Auslesen eines Codes.
 
* Die Zeichenkette für das Trennzeichen muss gleich jener sein, die beim Füllen der Combobox verwendet wurde. */
//
         strAuxString =
//
           JSBS_GUIServices.getSelectedCodeFromJComboBox(frmTF.get_combo_Sample_JComboBox(), " - ");
/* Wenn der eingegebene Wert nicht den Prüf-Regeln entspricht dann ist von der Methode
 * zurückgelieferte Wert 'null'. Das wird abgefragt und damit das Flag gesetzt. */

          
bol_combo_Sample_JComboBox_OK = (strAuxString != null);
/* Wenn der eingegebene Wert die Prüf-Regeln bestanden hat dann wird der Wert auf das
 * zugehörige Attribut des BO übertragen. */

          
if (bol_combo_Sample_JComboBox_OK)
            
frmTF.structapplication_entity_BOC_Processed.Variable_3 =
            
strAuxString;
        }


/* 
 * Ende der Code-Muster für das explizite Auslesen von Werten aus Eingabefeldern
 * und übertragen des Wertes auf das Attribut des BO.
 * *************************************************** */
/* 
 * Prüfen und Aktivieren / Deaktivieren von Schaltflächen (JButtons). */

        setButtonStatus();
    }
/*
 * METHODE, die aus der Methode mit gleichem Namen in der Klasse für den Aufbau der GUI
 * aufgerufen wird wenn sich der Status eines GUI-Elementes, das einen 'ItemListener'
 * zugeordnet hat, ändert.
 * Diese GUI-Elemente mit einer Superklasse vom Typ 'JToggleButton'; in der Praxis sind das 
 * 'JCheckBox' und 'JRadioButton'.
 * Wenn keine
GUI-Elemente dieses Typs existieren wird empfohlen, diese Methode 'leer' zu lassen.
 * Wenn diese Methode entfernt wird, muss auch die Methode mit gleichem Namen in der Klasse 
 * für den Aufbau der GUI entfernt werden. 
*/
    
public void itemStateChanged(ItemEvent e) {
/*
 * Aufrufen der gleichnamigen Methode in der geerbten Klasse.
 * Darin wird behandelt, wenn die gewählte Währung (in der Combobox 'combo_CurrencySelection')
 * geändert wird. */

        
super.itemStateChanged(e);
/*
 * Namen des GUI-Elements das den ItemEvent ausgelöst hat; wird vorerst leer gelassen weil
 * der Name abhängig vom Typ aus verschiedenen Klassen ermittelt wird. */

        String strEventSourceName = 
"";
/*
 * Prüfen ob das GUI-Element vom Superklassen-Typ 'JComponent' ist.
 * Bei diesem Typ wird der Name des auslösenden GUI-Elements aus der Unterkomponente
 * 'Item' ermittelt.
*/
        
if (e.getItem() instanceof JComponent) {
/* Zuerst auf den Typ JComponent umwandeln und dann den Namen des GUI-Elementes ermitteln. */
          JComponent locJComponent =
(JComponent) e.getItem();
          strEventSourceName =
locJComponent.getName();
        }
/*
 * Prüfen ob das GUI-Element vom Superklassen-Typ 'JComboBox' ist.
 * Bei diesem Typ wird der Name des auslösenden GUI-Elements aus der Unterkomponente
 * 'Source' ermittelt.
*/
        
if (e.getSource() instanceof JComboBox) {
/* Zuerst auf den Typ JComboBox umwandeln und dann den Namen des GUI-Elementes ermitteln. */
          JComboBox locJComboBox =
(JComboBox) e.getSource();
          strEventSourceName =
 locJComboBox.getName();
        }
/*
 * Muster-Code für das Auslesen des Wertes aus einer JComboBox.
 * In dieser Combobox darf eine Eingabe eines Wertes nicht möglich sein -
 * nur die Auswahl aus der angezeigten Liste.
 * Die Bearbeitung eines eingegebenen Wertes wird in der Methode 'anyUpdate(...)' ausgeführt. */

        
if (strEventSourceName.compareTo(frmTF.get_combo_Sample_JComboBox().getName()) == 0) {
/*
 * Prüfen ob dieses GUI-Element ausgewählt ('selektiert') wurde.
 * Bei einer Änderung eines Status wird diese Methode auch dann aufgerufen, wenn die
 * Auswahlmöglichkeit eines GUI-Elements 'verlassen' (de-selected) wird - in diesem Fall
 * soll der Code nicht ausgeführt werden. */

          
if (e.getStateChange() == ItemEvent.SELECTED) {
/* 
 * Korrekturmassnahme wenn dieses GUI-Element in der Methode 'copy' des ActionHandlers als Feld
 * mit Schlüsselwert markiert wurde: Wiederherstellen von Standard-Farbe, -Font und -Schriftgrösse.
 * Wenn dieses GUI-Element nicht Teil des Anwender-bekannten Schlüssels ist kann dieser Code
 * weg gelassen werden. */

          JSBS_GUIServices.setDefinedForegroundColor(
frmTF.get_combo_Sample_JComboBox(), frmTF);
/* 
 * Eingabe im GUI-Feld auf Gültigkeit prüfen. Dazu wird die Methode zum Auslesen des Wertes
 * verwendet. In der verwendeten Methode wird auch der Hintergrund des GUI-Elements eingefärbt. */

          
bol_combo_Sample_JComboBox_OK = (
            JSBS_GUIServices.getSelectedTextFromJComboBox(
frmTF.get_combo_Sample_JComboBox(), frmTF)
              !=
null);
/* Wenn der eingegebene Wert die Prüf-Regeln bestanden hat dann wird der Wert auf das
 * zugehörige Attribut des BO übertragen.
 * Dazu wird die Methode 'getFromGUI(...) der jeweiligen BOC-Klasse verwendet. */

          
if (bol_combo_Sample_JComboBox_OK)
            
frmTF.structapplication_entity_BOC_Processed.getFromGUI(
                
null, frmTF.get_combo_Sample_JComboBox(), null, ...);
/* ---------------------------------------------------------------------------------- */
/*
 * ALTERNATIV oder zusätzlich zum Übertragen eines Wertes auf das BO kann es auch erforderlich
 * sein, eine Methode auszuführen.
 * Hier ein Beispiel zum Aufruf einer Methode im Action-Handler. */

            
application_task__ActionHandler.method(frmTF, further_parameters);
/* ---------------------------------------------------------------------------------- */
          }
/*
 * Anmerkung: Bei einer Combobox ist eine Verarbeitung beim Trigger DESELECTED nicht notwendig
 * weil mit dem deselektieren eines Eintrages in der Combobox-Liste auch ein Trigger SELECTED
 * (eines anderen Eintrags aus der Liste)erfolgt.
*/
        }
/*
 * Muster-Code für das Auslesen des Wertes aus einer Checkbox oder eines Radiobuttons. */

        
if (strEventSourceName.compareTo(frmTF.get_GUI_Element().getName()) == 0) {
/*
 * Prüfen ob dieses GUI-Element ausgewählt ('selektiert') wurde.
 * Bei einer Änderung eines Status wird diese Methode auch dann aufgerufen, wenn die
 * Auswahlmöglichkeit eines GUI-Elements 'verlassen' (de-selected) wird - in diesem Fall
 * soll der Code nicht ausgeführt werden. */

          
if (e.getStateChange() == ItemEvent.SELECTED) {
/* ---------------------------------------------------------------------------------- */
/* Zugehörige Variable des BO ändern. Dazu wird die Methode 'getFromGUI(...)' des BO aufgerufen. */

          
frmTF.structapplication_entity_BOC_Processed.getFromGUI(
                
null, frmTF.get_GUI_Element(), null, ...);
/* ---------------------------------------------------------------------------------- */
/*
 * ALTERNATIV oder zusätzlich zum Übertragen eines Wertes auf das BO kann es auch erforderlich
 * sein, eine Methode auszuführen.
 * Hier ein Beispiel zum Aufruf einer Methode im Action-Handler. */

            
application_task__ActionHandler.method(frmTF, further_parameters);
/* ---------------------------------------------------------------------------------- */
          }
/*
 * Prüfen ob dieses GUI-Element (eine CheckBox) nicht gewählt ('deselektiert') wurde.
 * Das Prüfen auf DESELECTED ist nur bei einer Checkbox notwendig; bei einem Radiobutton
 * wird mit dem deselektieren eines Buttons gleichzeitig an anderer Button selektiert
 * und damit die Verarbeitung beim Trigger SELECTED ausgeführt.
*/
          
if (e.getStateChange() == ItemEvent.DESELECTED) {
/* ---------------------------------------------------------------------------------- */
/*
 * Zugehörige Variable des BO ändern. Dazu wird die Methode 'getFromGUI(...)' des BO aufgerufen. */

          
frmTF.structapplication_entity_BOC_Processed.getFromGUI(
                
null, frmTF.get_GUI_Element(), null, ...);
/* ---------------------------------------------------------------------------------- */
/*
 * ALTERNATIV oder zusätzlich zum Übertragen eines Wertes auf das BO kann es auch erforderlich
 * sein, eine Methode auszuführen.
 * Hier ein Beispiel zum Aufruf einer Methode im Action-Handler. */

            
application_task__ActionHandler.method(frmTF, further_parameters);
/* ---------------------------------------------------------------------------------- */
          }
        }

/* 
 * Prüfen und Aktivieren / Deaktivieren von Schaltflächen (JButtons). */

        setButtonStatus();

    }
/*
 * METHODE, die alle Flags (boolsche Variablen die signalisieren, ob die Eingabe im zugehörigen
 * GUI-Element die Eingabe-Regel erfüllt) zu einer boolschen Variable zusammenfaßt.
 * Die dafür verwendete Variable ist in der geerbten Klasse definiert. */

    
private void checkEntriesOK() {
/* Boolsche Operation die prüft, ob alle Eingaben den Eingabe-Regeln entsprechen. */
        
bolCompleteEntryOK =
              
bol_txt_Sample_JTextField_OK
           && 
bol_txt_Sample_JTextArea_OK
           && 
bol_combo_Sample_JComboBox_OK;
    }
/*
 * Methode, die prüft ob die Schaltfläche 'btn_Store' (Speichern) zu aktivieren oder zu
 * deaktivieren ist. */

    
private void setButtonStatus_Store() {
/* Zuerst die Methode aufrufen, die alle OK-Flags in eine Variable zusammenfaßt. */
        checkEntriesOK();

/* 
 * Bei der Version 'MobileClient' ist keine spezielle Prüfung notwendig.
 * Grund dafür ist, dass bereits in der Methode 'setFieldsForUpdate(...)' die Felder für
 * die Eingabe gesperrt werden können.
 * Wenn alle Felder gesperrt sind ist auch keine Veränderung des Datensatzes möglich und
 * damit wird auch die Schaltfläche 'store' nicht aktiv. */

/*
 * Boolsche Operation innerhalb der 'setEnabled'-Methode des JButton:
 * Es müssen alle Eingaben (in den GUI-Elementen) der jeweiligen Eingabe-Regel entsprechen
 * (geprüft über 'bolCompleteEntryOK')
 *  und
 * mindestens eine Variable des BO muß verändert worden sein
 * (geprüft durch den Vergleich des BO nach dem Lesen von / Speichern auf der Datenbank oder
 * nach dem 'Kopieren' mit dem BO, dass die aktuellen Eingaben in den GUI-Elementen enthält). */

        
frmTF.get_btn_Store().setEnabled(bolCompleteEntryOK &&
              (
frmTF.structapplication_entity_BOC_Read.isDifferent(
                  
frmTF.structapplication_entity_BOC_Processed)));
    }
/*
 * Methode, die prüft ob die Schaltfläche 'btn_Copy' (Kopieren) zu aktivieren oder zu
 * deaktivieren ist. */

    
private void setButtonStatus_Copy() {
/* Zuerst die Methode aufrufen, die alle OK-Flags in eine Variable zusammenfaßt. */
        checkEntriesOK();

/* 
 * Bei der Version 'MobileClient' muss abgefragt werden, ob ein 'Copy' und damit ein 'Insert'
 * eines neuen Datensatzes ausgeführt werden darf wenn die Verbindung zum JAS (Java Application Server)
 * unterbrochen ist.
 * Die Variable 'bolAllowInsertWithMobileClientOffline' ist in der Basisklasse 'JSBS_TaskFrame'
 * definiert und der Wert wird in der Klasse für die GUI (Task-Frame) für dieses Teilprogramm festgelegt.
 * Mit dem folgenden Code wird gesteuert, ob die Schaltfläche bei einer Unterbrechung der Verbindung
 * zum JAS aktiviert bleibt oder deaktiviert ist. */

      boolean bolAllowCopy = true;
      if (   (frmTF.frmCC.RunVersion == JSBS_StartFrame.CONST_MobileClient)
      
    && (! frmTF.frmCC.bolJASConnectionEstablished)) {
      
      bolAllowCopy = frmTF.bolAllowInsertWithMobileClientOffline;
     
}
/*
 * Boolsche Operation innerhalb der 'setEnabled'-Methode des JButton:
 * Es müssen alle Eingaben (in den GUI-Elementen) der jeweiligen Eingabe-Regel entsprechen
 * (geprüft über 'bolCompleteEntryOK')
 *  und
 * es darf keine Variable des BO seit dem letzen Lesen von / schreiben auf die Datenbank
 * verändert worden sein
 * (geprüft durch den Vergleich des BO nach dem Lesen von / Speichern auf der Datenbank oder
 * nach dem 'Kopieren' mit dem BO, dass die aktuellen Eingaben in den GUI-Elementen enthält). */

        
frmTF.get_btn_Copy().setEnabled(bolCompleteEntryOK && bolAllowCopy &&
              ! (
frmTF.structapplication_entity_BOC_Read.isDifferent(
                    
frmTF.structapplication_entity_BOC_Processed)));
    }
/*
 * Methode, die alle Methoden aufruft, in denen einzelne Schaltflächen (JButtons) aktiviert bzw.
 * deaktiviert werden. */

    
public void setButtonStatus() {
/* Button-Status für die Schaltflächen zur Auswahl oder zum Löschen eines BO (Datensatzes)
 * setzen. Diese Methode ist in der geerbten Basis-Klasse implementiert. */

        
super.setButtonStatus_Selection();
/* Methoden dieser Klasse aufrufen. */
        setButtonStatus_Store();
        setButtonStatus_Copy();
    }

}

zum Inhaltsverzeichnis

Anleitung zur Adaptierung in allen Klassen

Am leichtesten funktioniert die Anpassung des Muster-Codes an die eigenen Erfordernisse durch Kopieren des Muster-Codes und Verwendung von Edit > Find/Replace... .

Wenn vorher der zu ersetzende Text markiert wurde, wird er zu findende Text von der Suchfunktion übernommen.

zum Inhaltsverzeichnis

Änderung des Namens des Java-Packages

package application_package.client;
/*

Dieser Name kommt mehrmals in allen drei Klassen vor.

zum Inhaltsverzeichnis

Änderung des Namens der Klassen

In der Klasse für das Frame:
*/
public class application_task extends JSBS_TaskFrame {
/*
In der Klasse für den 'ActionHandler':
*/
public class application_task__ActionHandler {
/*
In der Klasse für den 'DocumentListener':
*/
public class application_task__DocumentListener extends JSBS_TaskFrame__DocumentListener {
/*
Dieser Name muß mit dem Namen der Klasse übereinstimmen, der beim Eröffnen der Klasse gewählt wurde.
Durch das Ersetzen des Platzhalters
application_task durch den Namen der Klasse für das Frame (z.B. JSProjAssist_Project) kann in allen 3 Klassen der jeweils richtige Namen eingesetzt werden.
Durch die gewählte Namens-Konvention in den Muster-Codes werden dadurch auch die Referenzen auf verbundene Klassen richtig gestellt.

zum Inhaltsverzeichnis

Adaptieren der Kommentare

'Kein Kommentar ist besser als ein falscher'.

Aus diesem Grund ist in den Klassen für den 'ActionHandler' und den 'DocumentListener' auch nur ein Kommentar enthalten, der die Aufgabe der Klasse allgemein beschreibt und für die geschäfts-spezifischen Aufgaben auf die Klasse für das Frame verweist.

Meiner Erfahrung nach ist eine kurze Beschreibung der geschäfts-spezifischen Aufgaben in der Klasse für das Frame ausreichend..

zum Inhaltsverzeichnis

Änderung der Variablen-Namen für die BO-Klassen (BO und BOC)

*/
protected application_entity_BOC .....
/*
Im Muster-Code wird nur eine BO-Klasse (mit Instanziierung mehrerer Objekte) verwendet.
Für komplexere Anforderungen mit verschiedenen BO-Klassen wird folgendes Vorgehen empfohlen:
 * Suchen nach
application_entity_BO in den 3 Klassen für den Task.
 * Kopieren des jeweiligen Codes unter anderem Namen (z.B.
application_entity1_BO)
 * Ersetzen von
application_entity_BO (und nur dieses Platzhalters !) in allen 3 Klassen.
 * Ersetzen von
application_entity1_BO in der Klasse für das Task-Frame.

 * In den Klassen für den 'ActionHandler' und 'DocumentListener' muß der Code entsprechend den Geschäfts-Anforderungen angepaßt werden – eine generelle Anleitung ist nicht möglich.

zum Inhaltsverzeichnis

Anleitung zur Adaptierung in der Klasse für das Frame (GUI) 

In den folgenden Abschnitten sind jene Adaptierungen beschrieben, die nur in der Klasse für das Frame zur Anzeige der GUI-Elemente vorgenommen werden müssen.

zum Inhaltsverzeichnis

Änderung des Namens der Klasse des CommandCenters

public class application_task extends JSBS_TaskFrame {
/*
 * Variable für die Referenz auf die Klasse des Start-Frame (CommandCenter). */

    
protected application_CommandCenter frmCC;
/*
 * Zugehöriges DocumentListener Objekt definieren. */

Der Name dieser Klasse kommt zwei mal im Muster-Code vor.
Wenn Sie 'Find/Replace' zum Ersetzen verwenden, geben Sie bitte den Text
application_CommandCenter als Suchbegriff ein; damit wird nur der Name dieser Klasse ersetzt und nicht auch Teile anderer 'Platzhalter' die application enthalten.

zum Inhaltsverzeichnis

Definieren der Variablen für die 'aufzuhebenden' Selektionskriterien für die Anzeige der Liste

Damit nach einem Einfügen, Ändern oder Löschen (Deaktivieren) eines Business Object die Auswahlliste neu angezeigt werden kann, werden die – vom Anwender zum Zeitpunkt der Abfrage in den Eingabefeldern erfassten Auswahlkriterien - in eigenen Variablen aufgehoben.
Damit wird erreicht, dass bei einer neuerlichen Anzeige der Auswahlliste wieder die ursprünglich verwendeten Selektionskriterien angewendet werden und nicht inzwischen – vielleicht unabsichtlich – erfasste Werte.

Die Methode zum Versorgen der Variablen mit den Werten ist im Abschnitt Anleitung zur Adaptierung in der Klasse für den ActionHandler > 'Aufheben' der Werte für die Auswahlkriterien – Methode getSelectionCriteria(...) beschrieben.

/*
 * Werte der Selektion für die Anzeige der Auswahl-Liste.
 * Diese werden gesetzt wenn die Liste neu angezeigt wird und werden gebraucht,
 * wenn die Liste neu angezeigt werden soll aber die GUI-Elemente für die Auswahl
 * schon geändert sein können.
 * Das ist der Fall, wenn ein BO gelöscht wurde. */

    
protected int int_Selection_VariableName_1 = 0;
    
protected String str_Selection_VariableName_2 = "";

Im Muster-Code sind für zwei gebräuchliche Java-Typen Definitionen enthalten; es kann selbstverständlich jeder andere Java-Typ verwendet werden.

zum Inhaltsverzeichnis

Definieren der Variablen für die GUI-Elemente

/*
 * Muster-GUI-Elemente;
 * Diese sind durch jene GUI-Elemente, die für diesen Task-Frame spezifisch sind,
 * zu ersetzen. */

    
private JSBS_Dividerline dl_Sample_Areas_To_Be_Separated;
    
protected JLabel lbl_Sample_JLabel_Right;
    
protected JLabel lbl_Sample_JLabel_Left;
    
protected JTextField txt_Sample_JTextField;
    
protected JTextArea txt_Sample_JTextArea;
    
protected JList lst_Sample_JList;
    
protected JComboBox combo_Sample_JComboBox;
    
protected JCheckBox chk_Sample_JCheckBox;
    
protected JRadioButton rbtn_Sample_JRadioButton_1;
    
protected JRadioButton rbtn_Sample_JRadioButton_2;
    
protected ButtonGroup btngrp_Sample_ButtonGroup = new ButtonGroup();
    
protected JButton btn_Sample_JButton;
    
protected JSBS_ImagePane img_Sample_ImagePane;

Im Muster-Code ist für jeden gebräuchlichen (Java-)Typ eines GUI-Elements eine Definition enthalten.
Falls Sie bis jetzt noch kein Layout für die Anordnung der GUI-Elemente entworfen haben:
Es ist hilfreich dies zu tun bevor der Muster-Code adaptiert wird -
Ein Formblatt dafür finden Sie unter Poster für das GUI-Layout der Basisklasse JSBS_TaskFrame.

zum Inhaltsverzeichnis

Einsetzen des internen Codes für den Aufruf des Task-Frames

Über den internen Aufruf-Code wird innerhalb der CommandCenter-Klasse (Start-Frame) das entsprechende Task-Frame aufgerufen.
Das Definieren in der Datei 'Tasks.xml' und die Abfrage innerhalb der CommandCenter-Klasse sind unter
Leitfaden für die Entwicklung von Heavyweight-Clients mit dem JS-FCF – Alle Schritte zur Entwicklung des Task-Frames > Task-Frame im 'CommandCenter' aufrufen beschrieben.

Das Einsetzen des internen Aufruf-Codes im folgenden Teil des Muster-Codes ist notwendig um in der Liste des CommandCenter-Fensters den angezeigten Aufruf-Code anzeigen zu können.
Wenn Sie jetzt noch keinen internen Aufruf-Code für das Task-Frame festgelegt haben, dann vergessen Sie bitte nicht, die folgende Adaptierung später auszuführen.

/* 
 * Methode mit den Initialisierungen die notwendig sind nachdem das Frame (Window)
 * angezeigt wird. */

    
private void initialize_after_frame() {
/* Methode zum Zuordnen des sprachabhängigen Textes zu den GUI-Elementen aufrufen. */
. . . . .
. . . . .
/*
 * Eintragen dieses Tasks in die Tabelle beim CommandCenter.
 * Der von der aufgerufenen Methode zurückgelieferte ID wird verwendet
 * wenn die angezeigten Daten verändert werden sollen.
 * Das Verändern der angezeigten Daten ist sinnvoll, wenn der Anwender einen
 * Datensatz aus der Liste auswählt (Methode 'getForUpdate(..)' in der Klasse
 * xxx__ActionHandler.
 * Der 2. Parameter beim Aufruf der Methode ist der interne Code dieser Klasse
 * in der Datei 'Tasks.xml'.
 * Der 3. Parameter ist eine Kurzfassung der angezeigten Daten;
 * diese Daten sind jetzt noch nicht vorhanden. */

      
dblCC_TaskID = frmCC.addOpenTaskFrame(this, "internal_Selection_Code", "");
/* 
 * Methode, die nach der 'Construction' der Klasse ausgeführt werden soll, aufrufen.

. . . . .
. . . . .

zum Inhaltsverzeichnis

Adaptieren der 'Constructor'-Methoden für jedes GUI-Element

/* 
 * ******************************
 * Methoden zum 'Construct' (Initialisierung) der einzelnen GUI-Elemente.
 * Die Muster-GUI-Elemente sind durch jene für die Geschäftsanwendung zu ersetzen.
 * */

. . . . .
. . . . .
    
protected JLabel get_lbl_SampleJLabel_Right() {
/* Zuerst Prüfen, ob die Variable bereits 'constructed' (initialisiert) ist. */
      
if (lbl_SampleJLabel_Right == null) {
/* Variable noch nicht 'constructed'; Code für die Initialisierung folgt. */
        
try {
          lbl_Sample_JLabel_Right = new JLabel();
          lbl_Sample_JLabel_Right.setName("lbl_Sample_JLabel_Right");
          lbl_Sample_JLabel_Right.setHorizontalAlignment(SwingConstants.TRAILING);
/* Mit folgender Code-Zeile wird das GUI-Element mit einem Text versehen.
 * Damit ist auf der GUI der Name des GUI-Elementes zu sehen solange noch kein
 * sprach-spezifischer Text definiert ist. */

          
lbl_Sample_JLabel_Right.setText("lbl_Sample_JLabel_Right");
        }
        
catch (Throwable Exc) {
/* Fehler beim 'construct' ist sehr unwahrscheinlich und kann nur beim 'Starten'
 * des Tasks auftreten.
 * Deswegen werden Fehlermeldungen nur auf der Konsole ausgegeben. */

          
System.out.println("Error while building lbl_Sample_JLabel_Right in class application_task.");
          Exc.printStackTrace();
        }
      }
      
return lbl_Sample_JLabel_Right;
    }
/* */
    
protected JLabel get_lbl_Sample_JLabel_Left() {
/* Zuerst Prüfen, ob die Variable bereits 'constructed' (initialisiert) ist. */
      
if (lbl_Sample_JLabel_Left == null) {
/* Variable noch nicht 'constructed'; Code für die Initialisierung folgt. */

Diese Methoden 'konstruieren' die einzelnen GUI-Elemente wenn sie zum ersten Mal 'verwendet' werden.
Dieser Algorithmus stellt sicher dass die GUI-Elemente keine nicht 
null sind und reduziert damit die Möglichkeit von Fehlern die erst bei der Ausführung des Anwendungs-Programms auftreten.

Im Muster-Code ist für jeden gebräuchlichen (Java-)Typ eines GUI-Elements ein Algoritmus enthalten.
Der Muster-Code wird in diesem Abschnitt nicht komplett wiederholt - die Adaptierungen sind aber für jeden (Java-)Typ ähnlich.

zum Inhaltsverzeichnis

Aufnehmen der GUI-Elemente in das pnl_DetailFields

In der Basisklasse JSBS_TaskFrame ist ein GUI-Element mit dem Namen pnl_DetailFields vom Java-Typ 'JPanel' definiert.
Dieses JPanel nimmt alle GUI-Elemente für die Detail-Information des Teil-Programms auf.

Im Muster-Code sind bereits 'Platzhalter' für eine große Anzahl von GUI-Elementen verschiedener Java-Typen enthalten; diese Muster müssen entsprechend der individuellen Aufgabe des GUI-Elements adaptiert werden.

/* */
/* 
 * ******************************
 * Methode zum 'Construct' (Initialisierung) des Panels mit den GUI-Elementen für
 * die Abwicklung des Geschäftsfalles.
 * Diese Methode überschreibt das 'Construct' des JPanel (mit gleichem Namen) in der
 * geerbten Methode aus der Klasse JSBS_TaskFrame.
 * */

    
protected JPanel get_pnl_DetailFields() {
/* Zuerst Prüfen, ob die Variable bereits 'constructed' (initialisiert) ist. */
      
if (pnl_DetailFields == null) {
/* Variable noch nicht 'constructed'; Code für die Initialisierung folgt. */
        
try {
          
pnl_DetailFields = new JPanel();
          
pnl_DetailFields.setName("pnl_DetailFields");
/* 
 * Mit der folgenden Anweisung wird die Eigenschaft 'GridBagLayout festgelegt
 * 'GridBagLayout' unterteilt das JPanel in 'dehnbare' Felder; damit 'wachsen' oder
 * 'schrumpfen' darin platzierte GUI-Elemente abhängig von der Größe des JPanel. */

          
pnl_DetailFields.setLayout(new GridBagLayout());
/* 
 * Die folgenden Anweisungen platzieren GUI-Elemente in den 'Feldern' des JPanel. */
/* Zuerst wird eine Variable für die Platzierungs-Eigenschaften erstellt. */

          GridBagConstraints gbc_
lbl_Sample_JLabel_Right = new GridBagConstraints();
/* Definition der Platzierungs-Eigenschaften. */
          gbc_
lbl_Sample_JLabel_Right.gridx = 0;
          gbc_
lbl_Sample_JLabel_Right.gridy = 0;
          gbc_
lbl_Sample_JLabel_Right.weightx = 1;
          gbc_
lbl_Sample_JLabel_Right.fill = GridBagConstraints.HORIZONTAL;
          gbc_
lbl_Sample_JLabel_Right.anchor = GridBagConstraints.LINE_END;
          gbc_
lbl_Sample_JLabel_Right.insets = new Insets(3, 3, 3, 3);
/* Platzieren des GUI-Elements auf dem JPanel. */
          get_pnl_DetailFields().add(get_
lbl_Sample_JLabel_Right(), gbc_lbl_Sample_JLabel_Right);
/* 
 * Platzieren des nächsten GUI-Elements. */

          
GridBagConstraints gbc_txt_Sample_JTextField = new GridBagConstraints();

Der Muster-Code wird in diesem Abschnitt nicht komplett wiederholt - die Adaptierungen sind aber für jeden (Java-)Typ ähnlich.

zum Inhaltsverzeichnis

Aufnehmen der GUI-Elemente in das pnl_ListFields (nach Bedarf)

In der Basisklasse JSBS_TaskFrame ist ein GUI-Element mit dem Namen pnl_ListFields vom Java-Typ 'JPanel' definiert.
Dieses JPanel nimmt alle GUI-Elemente, die Filter für die Anzeige der Datensätze (BO) in der Auswahl-Liste enthalten, auf.

Wenn das Teilprogramm (Task) keine Filterkriterien vorsieht kann die komplette Methode gelöscht werden.

Im Muster-Code sind bereits 'Platzhalter' für eine große Anzahl von GUI-Elementen verschiedener Java-Typen enthalten; diese Muster müssen entsprechend der individuellen Aufgabe des GUI-Elements adaptiert werden.
Die Adaption erfolgt analog der Beschreibung im Abschnitt
Aufnehmen der GUI-Elemente in das pnl_DetailFields.

zum Inhaltsverzeichnis

Festlegen von Feldern mit verpflichtender Eingabe

Wenn durch die Geschäftsregeln festgelegt ist, dass in Eingabefeldern eine Eingabe unbedingt notwendig ist, dann wird das in den folgenden Anweisungen codiert.
Mit diesen Anweisungen ist es nicht mehr möglich, über die Konfigurationsdatei 'DisplayStrings.xml' zu steuern ob eine Eingabe in einem Feld verpflichtend ist oder nicht.
Eine detaillierte Beschreibung über die Möglichkeiten finden Sie im Dokument
Datei 'DisplayStrings.xml' mit sprachabhängigen Texten für die Anzeige auf der GUI.

/* 
 * Methode mit den Initialisierungen die notwendig sind nachdem das Frame (Window)
 * angezeigt wird. */

    
private void initialize_after_frame() {
/* Methode zum Zuordnen des sprachabhängigen Textes zu den GUI-Elementen aufrufen. */
      JSBS_GUIServices.processLanguageDependantElements(
this);
/* GUI-Elemente, bei denen eine Eingabe zwingend erforderlich ist ('Mandatory'),
 * festlegen. Die Festlegung hier ist 'stärker' als eine eventuelle Prüf-Regel
 * in der Datei 'DisplayStrings.xml'. */

      
structJSBS_EntryRules.addApplicationMandatoryGUIElement(get_txt_SampleJTextField());
/* DocumentListener konstruieren und anschließend die Methode der geerbten Klasse
 * aufrufen mit der die notwendigen Listener zu den GUI-Elementen hinzugefügt werden. */

zum Inhaltsverzeichnis

Reagieren auf Änderungen der Spaltenbreiten in JTables - Methode columnMarginChanged(...)

    public void columnMarginChanged(ChangeEvent e) {
. . . . . .
. . . . . .

/*
 * Gleichnamige Methode der geerbten Klasse aufrufen.
 * Darin werden die Spaltenbreiten der JTable 'pnl_SelectionListTable' (in der geerbten
 * Methode definiert) auf das BO und die Variable
 * 'structJSBS_FramePosition_BOC.ColumnWidthArray01' (ebenfalls in der geerbten Klasse
 * definiert) übertragen. */

      
super.columnMarginChanged(e);
/*
 * Wenn weitere JTables verwendet werden, dann kann hier der Code für das Übernehmen
 * der Spaltenbreite auf die Datenstruktur adaptiert werden.

      
structJSBS_FramePosition_BOC.ColumnWidthArray0x =
     
        JSBS_GUIServices.getTableColumnWidth(get_pnl_additional_JTable());
    }

Wenn in der Klasse für das Frame eine eigene JTable definiert ist, dann wird in dieser Methode nach einer Änderung der Spaltenbreite die neue Breite der Spalten auf die dafür vorgesehene Datenstruktur  übernommen.
Diese Datenstrukur wird in der Methode
windowClosing(...) auf der zugehörigen Datenbank-Tabelle ('Parameter') abgespeichert.

zum Inhaltsverzeichnis

Anleitung zur Adaptierung bei Verwendung von Währungen in der Klasse für die GUI 

Adaptieren in der Methode initialize_frame

In dieser Methode wird für das 'ContentPane' das bereits in der geerbten Basisklasse enthaltene pnl_Main_With_Currency_Selection verwendet.

Dazu wird im Muster-Code die entsprechende Zeile auskommentiert – und die davor stehende Zeile gelöscht oder unter 'Kommentar' gesetzt:


/* 
 * METHODE mit der das Frame (Window) angezeigt wird. */

. . . . .

 * (JSBS_StartFrame) festgelegt. */

//      setContentPane(get_pnl_Main());
/* 
 * Wenn in Ihrer Anwendung die Auswahl von Währungen möglich sein soll,
 * dann kommentieren Sie bitte die folgende Zeile aus und setzen die
 * Zeile oberhalb unter Kommentar. */

//      setContentPane(get_pnl_Main_With_Currency_Selection());
. . . . .

zum Inhaltsverzeichnis

Adaptieren in der Methode initialize_after_frame

In dieser Methode sind zwei Änderungen notwendig:

zum Inhaltsverzeichnis

Anleitung zur Adaptierung in der Klasse für den ActionHandler 

In den folgenden Abschnitten sind jene Adaptierungen beschrieben, die nur in der Klasse für den ActionHandler durchzuführen sind.

zum Inhaltsverzeichnis

Festlegen des 'ActionCommand' für eine Schaltfläche zur Anzeige der Liste – Methode handleEvent(...)

Für das Anzeigen der Übersichtsliste ist in der Basisklasse eine Schaltfläche vorgesehen.
Dieser Schaltfläche wurde bereits in der Basisklasse der 'ActionCommand'
"btn_ListBO" zugewiesen.
Wenn Sie das erneute Anzeigen der Übersichtsliste von einem anderen Auslöser (z.B. der Auswahl aus einer Combobox oder das Anklicken einer anderen Schaltfläche) abhängig machen wollen, können Sie den in der Methode
handleEvent(...) vorgesehenen Code (markiert) durch eigene Anweisungen ersetzen.

/*
 * Methode die ermittelt, bei welchem GUI-Element ein 'ActionEvent' ausgelöst wurde
 * und die entsprechende Methode aufruft. */
    protected static void handleEvent(application_task parmTF,
                                   ActionEvent parmActionEvent) {
/* Zuerst wird die 'Identifikation' des GUI-Element aus dem ActionEvent extrahiert. */
      String cmd = parmActionEvent.getActionCommand().trim();
/* Abfragen von welchem GUI-Element der Event ausgelöst wurde und
 * Aufrufen der entsprechenden Methode. */
      if(cmd.equals("btn_Store")) store(parmTF);
      if(cmd.equals("btn_Copy")) copy(parmTF);
      if(cmd.equals("btn_Next")) getNext(parmTF);
      if(cmd.equals("btn_Previous")) getPrevious(parmTF);
      if(cmd.equals("btn_Get")) getForUpdate(parmTF);
      if(cmd.equals("btn_Delete")) processDeactivate(parmTF);
/* Die folgende Abfrage ist notwendig, wenn für die Anzeige der Liste mit den BO
 * Auswahlkriterien festgelegt werden können.
 * Bei der Selektion über die Auswahl aus Combo-Boxes kann auch eine Combo-Box
 * mit einem Action-Handler versehen werden und dessen Auslösung abgefragt werden. */
      if(cmd.equals("btn_ListBO")) {
        getSelectionCriteria(parmTF);
        redisplayBOList(parmTF);
      }
    }

zum Inhaltsverzeichnis

'Aufheben' der Werte für die Auswahlkriterien – Methode getSelectionCriteria(...)

Damit nach einem Einfügen, Ändern oder Löschen (Deaktivieren) eines Business Object die Auswahlliste neu angezeigt werden kann, werden in dieser Methode die Auswahlkriterien – die der Anwender zum Zeitpunkt des Auslösen der Schaltfläche in den Eingabefeldern erfasst hatte - in eigenen Variablen (definiert im Abschnitt Anleitung zur Adaptierung in der Klasse für das Frame (GUI) > Definieren der Variablen für die 'aufzuhebenden' Selektionskriterien für die Anzeige der Liste) aufgehoben.
Damit wird erreicht, dass bei einer neuerlichen Anzeige der Auswahlliste wieder die ursprünglich verwendeten Selektionskriterien angewendet werden und nicht inzwischen – vielleicht unabsichtlich – erfasste Werte.

/*
 * METHODE, die Filter-Kriterien für das Anzeigen der Liste mit BOs aus deren Eingabe-Feldern
 * in die Variablen der 'GUI-Klasse' überträgt.
 * Das 'Auslesen' und 'Aufheben' wird gemacht, damit bei einer neuerlichen Anzeige der Liste
 * (z.B. nach dem Speichern eines neuen BO oder dem Löschen/deaktivate) die Liste mit 
 * enstsprechend den ursprünglich eingegebenen Filterkriterien wieder angezeigt werden kann
 * auch wenn der Benutzer inzwischen den Inhalt der Eingabefelder verändert hat. */
    protected static void getSelectionCriteria(application_task parmTF) {
/* 
 * Muster der Übernahme der Werte aus den Eingabefeldern in die Variablen für die Auswahl-Werte. */
      parmTF.int_Selection_VariableName_1 = JSBS_GUIServices.getInteger(parmTF.get_txt_Sample_JTextField);
/* Prüfen ob gültige Werte eingegeben wurden; wenn notwendig ersetzen um späteren Dump zu vermeiden. */
      if (parmTF.int_Selection_VariableName_1 == null) parmTF.int_Selection_VariableName_1 = 0;
/* 
 * Muster der Übernahme des Wertes einer Combo-Box. */
      parmTF.str_Selection_VariableName_2 =
          JSBS_GUIServices.getSelectedTextFromJComboBox(parmTF.get_combo_Sample_JComboBox); 
/* Prüfen ob überhaupt ein Wert ausgewählt werden konnte; wenn notwendig ersetzen um späteren Dump zu vermeiden. */
      if (parmTF.str_Selection_VariableName_2 == null) parmTF.str_Selection_VariableName_2 = "";
    }

Der markierte Muster-Code muss entsprechend adaptiert werden.
Selbstverständlich können die Werte aus mehr als einem Eingabefeld und für verschiedenen Eingabeformate 'aufgehoben' werden; dazu sind nur weitere (und adaptierte) Codezeilen erforderlich.

zum Inhaltsverzeichnis

Eventuelle Adaptierungen in der Methode processAfterConstruction(...)

Nach der 'Construction' der GUI werden einige Verarbeitungen durchgeführt damit die Darstellung für die ersten Eingaben vorbereitet ist.
Spezifische Verarbeitungen für das Teilprogramm werden am Beginn der Methode eingefügt.
Im folgenden Beispiel wird das Anzeigen der Auswahlliste aufgerufen – das ist dann sinnvoll wenn keine Selektionskriterien eingegeben werden müssen sondern immer die gesamte Auswahlliste angezeigt wird.

/*
 * Methode die am Ende der 'Construction' der Klasse für die GUI ausgeführt wird.
 * In dieser Methode ist individuell zu codieren, wenn spezielle Verarbeitungen
 * erforderlich sind bevor dem Anwender eine Eingabe auf der GUI erlaubt ist. */
    protected static void processAfterConstruction(application_task parmTF) {
/* Anschließend ist der Anwendungs-spezifische Code zu implementieren.
 * Hier können die Methoden zum Füllen von Comboboxen mit den Auswahlwerten
 * aufgerufen werden. */


/*
 * Mit dem folgenden Kopieren wird das 'gelesene' (read) BO mit den gleichen Daten gefüllt
 * wie das 'bearbeitete' (processed).
 * Damit wird verhindert, dass eine Rückfrage, 'ob die geänderten Daten gespeichert werden sollen',
 * erscheint wenn das Fenster sofort nach dem Öffnen wieder geschlossen wird.
 * Die 'unterschiedlichen' Werte entstehen, wenn z.B. Combo-Boxes mit vorgegebene Werten
 * gefüllt worden sind. */

    parmTF.
structapplication_entity_BOC_Read.
            copyFrom
application_entity_BO(
                parmTF.
structapplication_entity_BOC_Processed);   

In diesem Teil ist auch jener Code, der für das Füllen von Comboboxen zuständig ist, einzufügen.

Wenn die Datensätze in der Auswahlliste nicht durch Filterkriterien eingeschränkt sind sondern immer alle aktuell gültigen Datensätze angezeigt werden, dann ist der 'Kommentar' vor der folgenden Zeile zu entfernen.

/*
 * Wenn die Geschäftsanwendung keine Möglichkeit zum Drucken vorsieht
 * dann wird die entsprechende Schaltfläche deaktiviert. */

      parmTF.get_btn_Print().setEnabled(
false);
/*
 * Wenn in der Auswahlliste alle Datensätze angezeigt werden (d.h. es sind
 * keine Selektionskriterien vorgesehen) dann ist der 'Kommentar' vor der
 * folgenden Zeile zu entfernen. */

//      redisplayBOList(parmTF);
/*
 * Ausführen der Methode, die prüft ob im CommandCenter Parameter für diesen
 * Task eingegeben wurden und die entsprechende Verarbeitung ausführt. */

      processCCParameter(parmTF);

zum Inhaltsverzeichnis

Verarbeiten eventuell im CommandCenter eingegebener Parameter - Methode processCCParameters(...)

In dieser Methode werden Verarbeitungen codiert die durch bereits im CommandCenter (Start-Frame) eingegebene Werte gesteuert werden.
Der Algorithmus ist individuell abhängig vom geforderten Zweck.

Eine Sammlung von Beispielen für die verschiedensten Anwendungsfälle finden Sie im Abschnitt Spezieller Muster-Code > Übernehmen von Werten aus den Parameter-Feldern des CommandCenter in diesem Dokument.

Als Beispiel hier wird gezeigt, wie ein Wert aus einem Eingabefeld des CommandCenter ausgelesen wird und dieser Wert verwendet wird, um die gesamten Daten dieses Business Objects anzuzeigen.

/*
 * Auslesen des Schlüsselwertes aus dem Eingabefeld 'Parameter 1' des CommandCenters.
 * Wenn in diesem Feld ein Wert ist, wird angenommen, dass dieser Wert ein Anwender-bekannter
 * Schlüssel ist und damit die Anzeige der Detailwerte aufgerufen.
 * Die 'Fehlerbehandlung' falls der Wert ungültig ist muss in der aufgerufenen Methode erfolgen. */
    if (parmTF.frmCC.get_txt_Parameter1().getText().trim().length() > 0){
        getSingleBO(parmTF, parmTF.
frmCC.get_txt_Parameter1().getText().trim())
    }

zum Inhaltsverzeichnis

Adaptieren der Methode setToGUI(...)

In dieser Methode werden die - in dem von der Datenbank gelesenen BO enthaltenen – Werte auf die Felder des Task-Frame übertragen.

/*
 * METHODE, die die von der Datenbank gelesenen Werte in die GUI-Elemente überträgt.
 * Weiters wird eine Methode aufgerufen, die Eingabefelder bei der Version 'MobileClient'
 * für die Eingabe sperrt oder öffnet – je nachdem ob die Verbindung zum JAS aufrecht
 * oder unterbrochen ist.
 * Zuletzt wird die Liste im CommandCenter aktualisiert. */

    private static void setToGUI(application_task parmTF) {
/* Werte auf die GUI-Elemente übertragen. */
      parmTF.structapplication_entity_BOC_Read.setToGUI(
        parmTF.get_txt_Sample_JTextField());
/* Spezielle Bearbeitung für Combo-Boxen die Teil des Anwender-bekannten Schlüssels sind.
 * Wenn diese in der Methode 'copy' farblich markiert wurden dann bleibt diese Markierung
 * erhalten.

Bei Combo-Boxen (die Teil des Anwender-bekannten Schlüssels sind) ist die Wiederherstellung der 'normalen' Farbe erforderlich.

      parmTF.structapplication_entity_BOC_Read.setToGUI(
        parmTF.get_
txt_Sample_JTextField());
/* Spezielle Bearbeitung für Combo-Boxen die Teil der Anwender-bekannten Identifikation sind.
 * Wenn diese in der Methode 'copy' farblich markiert wurden dann bleibt diese Markierung
 * erhalten.
 * (Java-)systembedingt wird bei einer JCombobox die neuerliche Auswahl des bereits
 * angezeigten Wertes nicht als 'itemStateChanged' gewertet und die Verarbeitung in der
 * zugehörigen 'DocumentListener'-Klasse nicht ausgeführt.
 * Deswegen wird anschliessend die 'normale' Farbe wieder gesetzt.*/

      JSBS_GUIServices.setDefinedForegroundColor(parmTF.get_combo_Sample_JComboBox(), parmTF);
/*
 * Bilden einer Kurzform der angezeigten Daten und aufrufen der Methode, die den Eintrag

Weiters wird die Methode aufgerufen, die im CommandCenter eine Kurz-Übersicht anzeigt.

/*
 * Bilden einer Kurzform der angezeigten Daten und aufrufen der Methode, die den Eintrag
 * in der angezeigten Liste 'Aufgerufene Geschäftsanwendungen' ändert. */

      parmTF.frmCC.updateOpenTaskFrame(parmTF.dblCC_TaskID,
        parmTF.structapplication_entity_BOC_Read.attribute1 + " / " +
        parmTF.structapplication_entity_BOC_Read.attribute2);
    }

zum Inhaltsverzeichnis

Adaptieren der Methoden setFieldsForInsert(...) und setFieldsForUpdate(...)

In den beiden Methoden wird entschieden, in welchen GUI-Feldern die Eingabe erlaubt oder gesperrt wird.
Dabei sind die Regeln für zwei Themenbereiche zu implementieren.

zum Inhaltsverzeichnis

Adaptieren der Methode redisplayBOList(...)

In dieser Methode wird die Auswahlliste neu angezeigt.
Dabei ist zu beachten, dass die Filterkriterien für die angezeigten BO (Business Objects / Datensätze) in einer weiteren Methode (siehe Abschnitt
'Aufheben' der Werte für die Auswahlkriterien – Methode getSelectionCriteria(...)) aus den Eingabefeldern ausgelesen wurden und in eigenen Variablen gespeichert sind.
Diese speziellen Variablen werden als Parameter für den Datenbankzugriff verwendet.

/*
 * METHODE zum Anzeigen der Liste entsprechend der gewählten Filter-Kriterien. */
    protected static void redisplayBOList(application_task parmTF) {
/* 
 * Methode des BOC-Set zum Selektieren der Daten aufrufen.
 * Die Auswahl-Parameter stammen aus den entsprechenden Eingabe-Feldern und wurden in der
 * Methode 'getSelectionCriteria(...)' in den entsprechenden Variablen der GUI-Klasse
 * gespeichert. */
      parmTF.structapplication_entity_BOC_Set.selectxxx(
                                        parmTF.int_Selection_VariableName_1,
                                        parmTF.str_Selection_VariableName_2);
/* 
 * Prüfen ob die Datenbank-Operation fehlerfrei war; dazu den Status-Code des
 * BOC-Set abfragen. */
      switch(parmTF.structapplication_entity_BOC_Set.StatusCode) {
      case JSBS_BO.CONST_OK:
/* Datenbank-Operation wie erwartet.
 
* Verarbeitung innerhalb dieses 'case' mit 'break' beenden. */
        break;
      case JSBS_BO.CONST_NOT_FOUND:
/* Noch keine Daten erfaßt; kein Fehler.
 
* Verarbeitung innerhalb dieses 'case' mit 'break' beenden. */
        break;
      default:
/* Ein anderer Fehler ist beim Selektieren aufgetreten.
 * Fehlerbehandlungs-Methode (in der Basisklasse für das Task-Frame) aufrufen und zusätzlich
 * zur 'Location' (Klassenname, Locationscode "DupKey") auch den Status-Code und die
 * Fehler-Meldung des BOC als Parameter übergeben. */
        parmTF.handleErrorEvent(CONST_ClassName, "redisplay_DBError",
          Integer.toString(parmTF.
structapplication_entity_BOC_Set.StatusCode),
          parmTF.
structapplication_entity_BOC_Set.StatusMsg);
      }

zum Inhaltsverzeichnis

Adaptieren der Methode store(...)

In dieser Methode sind zwei Arten von Adaptierungen notwendig.

Zuerst werden noch einmal die eingegebenen Werte aus der GUI ausgelesen und auf die Variablen des BO übertragen.
Das in dieser Methode zu tun ist ein Sicherheitsnetz; weil entsprechend dem Vorgehensmodell von
JS-FCF (JavaScout Fat-Client-Framework) sollten alle Änderungen in Eingabefeldern sofort – durch Listener in der Klasse xxx_DocumentListener – auf die Werte des BO übertragen werden.
Falls das durch Fehler nicht passiert wird in dieser Methode noch einmal das Übertragen der Werte ausgeführt.

Weiters werden für den Fehlerfall, dass bereits ein BO mit dem gleichen Anwender-bekannten Schlüssel existiert oder der zu ändernde Datensatz in der Zwischenzeit deaktiviert wurde, die Werte des Schlüssels für die Fehlermeldung aufbereitet.

/*
 * Methode die ausgeführt wird wenn eingegebene Daten auf der Datenbank gespeichert
 * werden sollen. */
    private static void store(application_task parmTF) {
/* 
 * Werte aus den GUI-Elementen auf die Variablen des BO übertragen.
 * Dabei die Methode der BOC-Klasse verwenden. */
      parmTF.structapplication_entity_BOC_Processed.getFromGUI(
        parmTF.get_txt_
SampleJTextField(), parmTF.get_txt_SampleJTextArea(),
        parmTF.get_combo_
SampleJComboBox(), parmTF.get_check_SampleJCheckBox(),
        parmTF.get_rbtn_
SampleJRadioButton_1());
/* 
 * Methode des BOC zum Speichern der Daten aufrufen. */
      parmTF.structapplication_entity_BOC_Processed.store();
/* 
 * Prüfen ob die Datenbank-Operation fehlerfrei war; dazu den Status-Code des

. . . . . . . . . . .
. . . . . . . . . . .
        setToGUI(parmTF);
/* Verarbeitung innerhalb dieses 'case' mit 'break' beenden. */
        break;
      case JSBS_BO.CONST_DUPLICATE_KEY:
/* Ein Datensatz mit den Werten, die den Anwender-bekannten Schlüssel bilden, existiert bereits.
 * Fehlerbehandlungs-Methode (in der Basisklasse für das Task-Frame) aufrufen und zusätzlich
 * zur 'Location' (Klassenname, Locationscode "DupKey") auch die Werte für den Anwender-bekannten
 * Schlüssel als Parameter übergeben. */
        parmTF.handleErrorEvent(CONST_ClassName, "DupKey",
          parmTF.
structapplication_entity_BOC_Processed.User_Known_Key_Variable_1,
          parmTF.
structapplication_entity_BOC_Processed.User_Known_Key_Variable_2);
/* Verarbeitung innerhalb dieses 'case' mit 'break' beenden. */
        break;
      default:
/* Ein anderer Fehler ist beim Speichern der Daten aufgetreten.
. . . . . . . . . . .

. . . . . . . . . . .
      case JSBS_BO.CONST_NOT_FOUND:
/* Der Datensatz wurde seit dem Lesen von der Datenbank von einem anderen Anwender deaktiviert.
 * Fehlerbehandlungs-Methode (in der Basisklasse für das Task-Frame) aufrufen und zusätzlich
 * zur 'Location' (Klassenname, Locationscode "store_NotFound") auch die Werte für
 * den Anwender-bekannten Schlüssel als Parameter übergeben. */
        parmTF.handleErrorEvent(CONST_ClassName, "store_NotFound",
          parmTF.
structapplication_entity_BOC_Processed.User_Known_Key_Variable_1,
          parmTF.
structapplication_entity_BOC_Processed.User_Known_Key_Variable_2);
/* Verarbeitung innerhalb dieses 'case' mit 'break' beenden. */
        break;
      default:
/* Ein anderer Fehler ist beim Speichern der Daten aufgetreten.
. . . . . . . . . . .

. . . . . . . . . . .
/*
 * Methode zum Anzeigen der Liste mit den aktuell gültigen Daten aufrufen.
 * Aber nur dann aufrufen wenn die Selektionskriterien gleich sind wie die Werte
 * des gerade gespeicherten BO. */
      
if ( (parmTF.structapplication_entity_BOC_Processed.Variable_of_Type_String.
                compareTo(parmTF.
str_Selection_VariableName) == 0)
          && (parmTF.
structapplication_entity_BOC_Processed.Variable_of_Elementary_Type ==
                int_Selection_
VariableName)
         )
        redisplayBOList(parmTF);

/*
 * Methode zum Aktivieren / Deaktivieren von Schaltflächen (JButtons) aufrufen. */

. . . . . . . . . . .
. . . . . . . . . . .

zum Inhaltsverzeichnis

Adaptieren der Methode copy(...)

In dieser Methode sind Adaptierungen in zwei Bereichen notwendig.

Im ersten Bereich wird die GUI so aufbereitet, dass der Anwender die Werte für einen neuen Anwender-bekannten Schlüssel erfassen kann.

Im zweiten Bereich werden die Werte aus der GUI in die zugehörigen BOs übertragen.
Dadurch kann die Standard-Prüfung auf Veränderung verwendet werden mit der das Aktivieren/Deaktivieren der Schaltflächen gesteuert wird.

Eine genauere Beschreibung der einzelnen Kommandos entnehmen Sie bitte dem Kommentar innerhalb des Codes.

/*
 * Methode die ausgeführt wird wenn eingegebene Daten, die auf der Datenbank gespeichert
 * sind, verändert und als neuer Datensatz gespeichert werden sollen. */

    private static void copy(application_task parmTF) {
/* 
 * Eingabefelder für die Werte, die den Anwender-bekannten Schlüssel bilden,
 * für die Eingabe öffnen.
 * Dazu wird die spezielle Methode verwendet mit der auch die ursprüngliche Farbe
 * des Hintergrunds wieder hergestellt wird.*/
      JSBS_GUIServices.processEnableGUIElement(parmTF, parmTF.get_txt_Sample_JTextField());
/* 
 * Anwender darauf aufmerksam machen, dass der Anwender-bekannte Schlüssel
 * nicht gleich bleiben darf.
 * Alle Felder mit Schlüssel-Werten markieren damit diese Aufmerksamkeit erregen. */

      JSBS_GUIServices.reverseColors(parmTF.get_
txt_Sample_JTextField());
/*
 * Setzen des Focus auf das Feld, das am wahrscheinlichsten geändert wird und markieren
 * des enthaltenen Wertes.
 * Damit kann der Wert ohne weitere Massnahme komplett überschrieben werden. */

      parmTF.get_
txt_Sample_JTextField().requestFocusInWindow();
      parmTF.get_
txt_Sample_JTextField().selectAll();
/* 
 * Werte aus den GUI-Elementen auf die Variablen des BO übertragen.
 * Dabei die Methode der BOC-Klasse verwenden. */

      parmTF.
structapplication_entity_BOC_Processed.getFromGUI(
        parmTF.get_txt_SampleJTextField(), parmTF.get_txt_SampleJTextArea(),
        parmTF.get_combo_SampleJComboBox(), parmTF.get_check_SampleJCheckBox(),
        parmTF.get_rbtn_SampleJRadioButton_1())
;
/* 
 * BO kennzeichnen, dass es sich um ein neu eingegebenes BO handelt.
 * Ein 'neues' BO ist durch die Werte '0' im DataSetId und ObjectID zu erkennen. */

      parmTF.structapplication_entity_BOC_Processed.DataSetID = 0;
      parmTF
.structapplication_entity_BOC_Processed.ObjectID = 0;
/* 
 * BO auf das BO mit den (von der Datenbank) gelesenen Daten kopieren.

. . . . . . . . . . .
. . . . . . . . . . .

zum Inhaltsverzeichnis

Adaptieren der Methoden getNext(...) und getPrevious(...)

In dieser Methode sind die Parameter der Methoden getNext(...) bzw. getPrevious(...) des BOC anzupassen.

/*
 * Methode die jenen Datensatz anzeigt dessen Anwender-bekannter Schlüssel
 * auf den Schlüssel des angezeigten Datensatzes folgt. */
    
private static void getNext(application_task parmTF) {
/* 
 * Prüfen ob Daten erfasst aber nicht gespeichert wurden. */

      
if (! checkForUnstoredChanges(parmTF)) {
/* Anwender hat entschieden, dass er geänderte aber nicht gespeicherte Daten
 * weiter bearbeiten will. */

        
return;
      }
. . . . . . . . . . .
. . . . . . . . . . .
/* 
 * Methode des BOC, das den 'nächsten' Datensatz holt, aufrufen.
 * Dabei wird der 'Startpunkt' aus den angezeigten Daten gewonnen. */
      parmTF.structapplication_entity_BOC_Read.selectNext(
        parmTF.
structapplication_entity_BOC_Read.attribute1
        parmTF.
structapplication_entity_BOC_Read.attribute2);
/* 
 * Prüfen ob die Datenbank-Operation fehlerfrei war; dazu den Status-Code des

. . . . . . . . . . .
. . . . . . . . . . .

Weiters wird beim Auftreten eines Datenbank-Fehlers der Anwender-Bekannte Schlüssel an die Methode für die Anzeige von Warnungen und Fehlermeldungen übergeben..

. . . . . . . . . . .
. . . . . . . . . . .
        break;
      
default:
/* Ein anderer Fehler ist beim Lesen der Daten aufgetreten.
 * Fehlerbehandlungs-Methode (in der Basisklasse für das Task-Frame) aufrufen und zusätzlich
 * zur 'Location' (Klassenname, Locationscode "selectNext_DBError") auch den Status-Code
 * und die Fehler-Meldung des BOC als Parameter übergeben. */
        parmTF.handleErrorEvent(CONST_ClassName, "selectNext_DBError",
          Integer.toString(parmTF.
structapplication_entity_BOC_Read.StatusCode),
          parmTF.
structapplication_entity_BOC_Read.StatusMsg,
          parmTF.
structapplication_entity_BOC_Read.User_Known_Key_Variable_1,
          parmTF.
structapplication_entity_BOC_Read.User_Known_Key_Variable_2);
      }

    }



zum Inhaltsverzeichnis

Adaptieren der Methode getSingleBO(...)

In dieser Methode sind die Parameter in der Methodendeklaration und beim Aufruf der Methode selectByUserKnownKey(...) des BOC anzupassen.

/*
 * Methode zum Lesen eines einzelnen BO von der Datenbank und Anzeigen von dessen Werte.
 * Der Anwender-bekannte-Schlüssel wird in den Parametern übergeben - im Beispiel 2 Attribute.
 * Wenn mit diesem Schlüssel ein Datensatz gefunden wird dann wird von dieser Methode
 * 'true' zurück geliefert; sonst false. */
    protected static boolean getSingleBO(application_task parmTF,
                                    
type_or_class parmAttribute1,
                                    
type_or_class parmAttribute2) {
/* 
 * Aktuell gültiges BO von der Datenbank lesen. */

      parmTF.
structapplication_entity_BOC_Read.selectByUserKnownKey(
        
parmAttribute1,
        
parmAttribute2);
/* 
 * Prüfen ob die Datenbank-Operation fehlerfrei war; dazu den Status-Code des

. . . . . . . . . . .
. . . . . . . . . . .

zum Inhaltsverzeichnis

Adaptieren der Methode getForUpdate(...)

In dieser Methode sind die Parameter des Aufrufs der Methode getSingleBO anzupassen.

/*
 * Methode zum Auswählen eines Business-Objects aus der angezeigten Liste,
 * neuerliches Lesen des BO von der Datenbank (falls ein anderer Anwender in der
 * Zwischenzeit eine Veränderung vorgenommen hat) und Anzeigen der Werte im Detail-Bereich
 * (Teil der GUI mit den GUI-Elementen für die Eingabe von Werten) der GUI. */

    
protected static void getForUpdate(application_task parmTF) {
/* 
 * Prüfen ob Daten erfasst aber nicht gespeichert wurden. */

      if (! checkForUnstoredChanges(parmTF)) {
. . . . . . . . . . .
. . . . . . . . . . .
/* 
 * Methode zum Lesen und Anzeigen eines einzelnen BO aufrufen.
 * Über den Rückgabewert wird signalisiert, ob der Datensatz gefunden wurde. */
      if (getSingleBO(parmTF,
    
                 structapplication_entity_BO.attribute1,
    
                 structapplication_entity_BO.attribute2)) {
/* 
 * BO erfolgreich gelesen und angezeigt. */

/*
 * Setzen des Focus auf das Feld für die Eingabe des Auswahl-Codes für einen Datensatz.

. . . . . . . . . . .
. . . . . . . . . . .

zum Inhaltsverzeichnis

Adaptieren der Methode processDeactivate(...)

Abhängig von der Anzahl der Verwendung als Fremdschlüssel in anderen BO ist der Muster-Code für den Aufruf der Warnungs-Meldung zu kopieren und im case-Statement der Grund für das verhinderte Deaktivieren (CONST_DEAKTIVATE_INHIBIT_REASON_Reason) zu adaptieren.
Als Vorbereitung für die Anzeige der passenden Warnungs-Meldung ist beim Aufruf der Methode
handleErrorEvent ein eindeutiger Grund (Platzhalter: "processDeactivate_DependantRecord_XXX") zu übergeben.
Das Definieren des Textes für die Warnungs-Meldung ist im weiteren Ablauf der Programm-Entwicklung unter
Leitfaden für die Entwicklung von Heavyweight-Clients mit dem JS-FCF – Alle Schritte zur Entwicklung des Task-Frames > Warnungs- und Fehlermeldungen erfassen beschrieben.

. . . . . . . . . . .
. . . . . . . . . . .
/* 
 * ***********
 * Das folgende case-Statement ist für jeden Hinderungsgrund für das Deaktivieren
 * (weil noch mindestens ein Datensatz, der den zu deaktivierenden Datensatz als
 * Fremdschlüssel hat, existiert) zu kopieren und zu adaptieren.*/

        
case application_entity_BO.CONST_DEAKTIVATE_INHIBIT_REASON_Reason:
/* Das BO ist Fremdschlüssel eines anderen BO und darf nicht deaktiviert werden.
 * Wenn die Abfrage entsprechend dem Muster implementiert wurde, dann ist der
 * Anwender-bekannte Schlüssel des referenzierenden BO in der Variable 'StatusMsg'. */
          parmTF.handleErrorEvent(CONST_ClassName, "processDeactivate_DependantRecord_XXX",
                                   
structapplication_entity_BOC.StatusMsg);
/* Verarbeitung innerhalb dieses 'case' mit 'break' beenden. */
          break;
/* Ende des zu kopierenden und adaptierenden Codes.
 * ***********
 * */
        case JSBS_BO.CONST_CHANGED_INBETWEEN:
/* In der Liste angezeigtes BO wurde in der Zwischenzeit von einem anderen Anwender
. . . . . . . . . . .
. . . . . . . . . . .

Weiters wird, wenn der Datensatz in der Zwischenzeit bereits von einem anderen Anwender deaktiviert wurde, die Anwender-bekannte Identifikation an die Methode für die Anzeige von Warnungen und Fehlermeldungen übergeben..

. . . . . . . . . . .
. . . . . . . . . . .
           break;
        
case JSBS_BO.CONST_NOT_FOUND:
/* In der Liste angezeigtes BO wurde in der Zwischenzeit von einem anderen Anwender gelöscht. */
          parmTF.handleErrorEvent(CONST_ClassName, "processDeactivate_NotFound",
          parmTF.
structapplication_entity_BOC_Processed.User_Known_Key_Variable_1,
          parmTF.
structapplication_entity_BOC_Processed.User_Known_Key_Variable_2);
/* Verarbeitung innerhalb dieses 'case' mit 'break' beenden. */
          break;
        
default:
. . . . . . . . . . .
. . . . . . . . . . .

zum Inhaltsverzeichnis

Anleitung zur Adaptierung in der Klasse für den DocumentListener 

In den folgenden Abschnitten sind jene Adaptierungen beschrieben, die nur in der Klasse für den DocumentListener durchzuführen sind.

zum Inhaltsverzeichnis

Definieren der 'Document's und der 'Flag's für die Eingabeprüfungen

Voraussetzung ist, dass der Abschnitt Adaptieren der 'Constructor'-Methoden für jedes GUI-Element fertig gestellt wurde.

/*
 * Objekte der Klasse 'Document', die für die Textaufbereitung bei GUI-Elementen zuständig sind.
 * Diese werden aus Performanz-Gründen im 'Constructor' aus den GUI-Elementen herausgelesen und
 * in den folgenden Variablen gehalten. */

    
private Document doc_txt_Sample_JTextField;
    
private Document doc_txt_Sample_JTextArea;
    
private Document doc_combo_Sample_JComboBox;
/*
 * Merker (Flags) ob die Eingaben in den GUI-Elementen korrekt sind. */

    
private boolean bol_txt_Sample_JTextField_OK;
    
private boolean bol_txt_Sample_JTextArea_OK;
    
private boolean bol_combo_Sample_JComboBox_OK;

Für jedes GUI-Element vom (Java-)Typ JTextField, JTextArea und JComboBox wird eine Variable definiert, die das Document (den Teil des Objekts, der den eingegebenen Text enthält) des jeweiligen GUI-Elementes referenziert.

Diesen Variablen vom Type Document werden in der 'Constructor'-Methode die Referenzen auf das 'Document' des jeweiligen GUI-Elementes zugewiesen (Details im anschliessenden Abschnitt).

In der Methode anyUpdate(DocumentEvent e) kann abgefragt werden, in welchem 'Document' eine Änderung des Textes vorgenommen wurde - Details sind in einem folgenden Abschnitt beschrieben.

Weiters werden Variable vom Typ boolean zu jedem GUI-Element mit einem 'Document' definiert. Diese werden in der Methode anyUpdate(DocumentEvent e) verändert und zeigen an, ob die Eingabe im jeweiligen GUI-Element die Prüf-Regeln erfüllt oder nicht.

zum Inhaltsverzeichnis

Zuweisen der 'Document's der GUI-Elemente auf die Variablen

In der 'Constructor'-Methode der Klasse werden die 'Document's aus den GUI-Elementen extrahiert und die Referenz den im vorherigen Abschnitt definierten Variablen zugewiesen.
Grund für diesen Algorithmus ist, dass das Extrahieren der 'Document's nur einmal beim Starten des Task-Frames ausgeführt werden muss und in der Methode
anyUpdate(DocumentEvent e) sofort verglichen werden kann, in welchem 'Document' der Text verändert wurde.

/* 
 * 'Herausholen' des jeweiligen 'Document' aus den GUI-Elementen für die Eingabe von Werten.
 * Das wird aus Performanz-Gründen einmalig im 'Constructor' durchgeführt. */

        
doc_txt_Sample_JTextField = frmTF.get_txt_Sample_JTextField().getDocument();
        
doc_txt_Sample_JTextArea = frmTF.get_txt_Sample_JTextArea().getDocument();

Für GUI-Elemente vom (Java-)Typ JTextField und JTextArea kann das 'Document' einfach extrahiert werden.
/* 
 * Spezieller Algorithmus für JComboBoxes um das 'Document' zu ermitteln.
 * Zuerst muss die 'JTextComponent' herausgeholt werden. */

        JTextComponent tc_combo_Sample_JComboBox = (JTextComponent)
            frmTF.get_combo_Sample_JComboBox().getEditor().getEditorComponent();
/* Anschliessend wird das 'Document' der 'JTextComponent' ermittelt. */
        doc_combo_Sample_JComboBox = tc_combo_Sample_JComboBox.getDocument();

Für ein GUI-Element vom (Java-)Typ JComboBox muss zuerst die JTextComponent der JComboBox ermittelt werden.
Anschliessend das 'Document' aus der
JTextComponent extrahiert.

zum Inhaltsverzeichnis

Erstmaliges Setzen der 'Flags' im 'Constructor'

In der 'Constructor'-Methode der Klasse werden die 'Flag's (vom Typ boolean), die signalisieren ob ein der Wert in einem Feld die Eingabeprüfung 'bestanden' hat, auf einen initiellen Wert gesetzt.
Diese Initialwerte sind notwendig nachdem das Task-Frame gestartet wurde und wenn in die leeren Felder Daten eingegeben werden.
Dabei wird die Eingabeprüfung erst ausgeführt, wenn der Inhalt eines 'Document's verändert wird.
Ohne Initialisierung der 'Flag's würden Pflichtfelder, bei denen kein Wert eingegeben wird, ohne Prüfung auf das BO übernommen.

/* 
 * Erstmaliges 'Setzen' der OK-Flags.
 * Für alle als 'Mandatory' definierten GUI-Elemente wird 'false' gesetzt.
 * Damit wird bewirkt, dass beim erstmaligen Aufrufen des Task-Frames in leere Felder,
 * die als 'Mandatory' definiert sind, Werte eingegeben werden müssen. */

        
bol_txt_Sample_JTextField_OK =
            
frmTF.structJSBS_EntryRules.checkMandatory(frmTF.get_txt_Sample_JTextField());
        
bol_txt_Sample_JTextArea_OK =
            
frmTF.structJSBS_EntryRules.checkMandatory(frmTF.get_txt_Sample_JTextArea());
        
bol_combo_Sample_JComboBox_OK =
            
frmTF.structJSBS_EntryRules.checkMandatory(frmTF.get_combo_Sample_JComboBox());

Durch den Algorithmus werden die 'Flag's abhängig davon gesetzt, ob ein Wert in das Feld eingegeben werden muss oder nicht.

zum Inhaltsverzeichnis

Reagieren auf Eingaben - Methode anyUpdate(...)

Diese Methode wird aufgerufen wenn der 'DocumentListener' eine Veränderung eines überwachten 'Document's (ein Document, dem über die Methode addListeners(...) in der Basisklasse JSBS_TaskFrame der DocumentListener zugeordnet wurde) bemerkt.
Der folgende Code-Muster ist die Standard-Bearbeitung für die Veränderung von Text in Eingabefeldern.
Bitte kopieren Sie den Code für jedes Eingabefeld und adaptieren Sie die Platzhalter entsprechend Ihren Anforderungen.

/* 
 * Standard-Algorithmus; für die Zuweisung des Wertes auf das Attribut des BO (Business Object)
 * wird die Methode 'getFromGUI(...)' der jeweiligen BOC-Klasse aufgerufen. */

        
if (edoc == doc_txt_Sample_JTextField) {
/* 
 * Korrekturmassnahme wenn dieses GUI-Element in der Methode 'copy' des ActionHandlers als Feld
 * mit Schlüsselwert markiert wurde: Wiederherstellen von Standard-Farbe, -Font und -Schriftgrösse.
 * Wenn dieses GUI-Element nicht Teil des Anwender-bekannten Schlüssels ist kann dieser Code
 * weg gelassen werden. */

          JSBS_GUIServices.setDefinedForegroundColor(
frmTF.get_txt_Sample_JTextField(), frmTF);
/* 
 * Eingabe im GUI-Feld auf Gültigkeit prüfen. Dazu wird die Methode zum Auslesen des Wertes
 * verwendet. In der verwendeten Methode wird auch der Hintergrund des GUI-Elements eingefärbt.
 * Unter 'Kommentar' (//) stehen alternative Methoden für die Eingaben von numerischen Werten
 * in einem 'JTextField' und 'JTextArea'. Bitte entfernen Sie die nicht benötigen Zeilen
 * mit den Methoden-Aufrufen. */

          
bol_txt_Sample_JTextField_OK = (
            JSBS_GUIServices.getTextFromJTextField(
frmTF.get_txt_Sample_JTextField(), frmTF)
//            JSBS_GUIServices.getTextFromJTextArea(frmTF.get_txt_Sample_JTextArea())
//            JSBS_GUIServices.getInteger(frmTF.get_txt_Sample_JTextField(), frmTF)
//            JSBS_GUIServices.getShort(frmTF.get_txt_Sample_JTextField(), frmTF)
//            JSBS_GUIServices.getBigDecimal(frmTF.get_txt_Sample_JTextField(), frmTF)
//            JSBS_GUIServices.getSelectedTextFromJComboBox(frmTF.get_combo_Sample_JComboBox(), frmTF)
              !=
null);
/* Wenn der eingegebene Wert die Prüf-Regeln bestanden hat dann wird der Wert auf das
 * zugehörige Attribut des BO übertragen.
 * Dazu wird die Methode 'getFromGUI(...) der jeweiligen BOC-Klasse verwendet. */

          
if (bol_txt_Sample_JTextField_OK)
            
frmTF.structapplication_entity_BOC_Processed.getFromGUI(
                
null, frmTF.get_txt_Sample_JTextField(), null, ...);
        }


Im Muster-Code sind zusätzlich Beispiele enthalten um den Wert eines Eingabefeldes auszulesen – anschließend an die Erläuterung finden Sie als Beispiel das Code-Muster für das Auslesen von Text.
Der spezielle Muster-Code kann erforderlich sein, wenn der eingegebene Wert innerhalb des Teil-Programms für die weitere Bearbeitung benötigt wird und nicht nur auf das Attribut des BO übertragen werden muss.
Die weitere Bearbeitung wird individuell für Ihr Anwendungs-Programms sein – deswegen wird auf eine Anleitung zur Adaptierung verzichtet.
Lesen Sie bitte in den Kommentaren zum Code, wie das Auslesen der Werte aus dem GUI-Element (Eingabefeld) erfolgt.
Die im Eingabefeld erfassten Werte stehen in den Variablen
strAuxString, intAuxInteger, intAuxShort bzw. bdAuxBigDecimal zur Verfügung – sofern die Eingabe fehlerfrei ist.
Aus diesen Variablen können die Werte zu den von Ihnen speziell benötigten Variablen zugewiesen werden.

Sofern Sie keine spezielle Verarbeitung der Variablen benötigen löschen Sie bitte die zutreffenden Code-Muster.

/* 
 * ***************************************************
 * Die folgenden Code-Muster werden nur empfohlen, wenn ein spezielles Verfahren notwendig
 * ist um den Wert aus dem Eingabefeld in das Attribut des BO zu übertragen und die Methode
 * 'getFromGUI(...)' nicht ausreicht. */

/* 
 * 'Document' aus einem JTextField vergleichen. */

        
if (edoc == doc_txt_Sample_JTextField) {
/* 
 * Korrekturmassnahme wenn dieses GUI-Element in der Methode 'copy' des ActionHandlers als Feld
 * mit Schlüsselwert markiert wurde: Wiederherstellen von Standard-Farbe, -Font und -Schriftgrösse.
 * Wenn dieses GUI-Element nicht Teil des Anwender-bekannten Schlüssels ist kann dieser Code
 * weg gelassen werden. */

          JSBS_GUIServices.setDefinedForegroundColor(
frmTF.get_txt_Sample_JTextField(), frmTF);
/* Wert des GUI-Elementes in die Hilfs-Variable (definiert in der geerbten Klasse)
 * übertragen. In der verwendeten Methode wird auch die Prüfung auf Gültigkeit
 * des eingegebenen Wertes durchgeführt und der Hintergrund des GUI-Elements eingefärbt. */

          
strAuxString =
            JSBS_GUIServices.getTextFromJTextField(
frmTF.get_txt_Sample_JTextField(), frmTF);
/* Wenn der eingegebene Wert nicht den Prüf-Regeln entspricht dann ist von der Methode
 * zurückgelieferte Wert 'null'. Das wird abgefragt und damit das Flag gesetzt. */

          
bol_txt_Sample_JTextField_OK = (strAuxString != null);
/* Wenn der eingegebene Wert die Prüf-Regeln bestanden hat dann wird der Wert auf das
 * zugehörige Attribut des BO übertragen. */

          
if (bol_txt_Sample_JTextField_OK)
            
frmTF.structapplication_entity_BOC_Processed.Variable_1 =
            
strAuxString;
        }
/* 

zum Inhaltsverzeichnis

Reagieren auf Änderungen bei CheckBoxes, RadioButtons und ComboBoxes - Methode itemStateChanged(...)

Nachdem GUI-Elemente vom Typ JToggleButton (in der konkreten Verwendung: JCheckBox und JRadioButton) keinen Text - und damit kein 'Document' - enthalten, müssen Veränderungen bei diesen GUI-Elementen anders erkannt werden.
Diesen GUI-Elementen wurde über die Methode 
addListeners(...) (in der Basisklasse JSBS_TaskFrame) ein 'ItemListener' zugeordnet und dieser 'ItemListener' ruft die Methode itemStateChanged(...) auf wenn sich der Status eines solchen GUI-Elementes verändert.
Auf gleiche Weise wird die Änderung der Auswahl bei einer
JComboBox erkannt und behandelt. Unterschied zwischen JComboBox und JToggleButton ist, dass bei einer JComboBox der ausgewählte Wert aus der Liste der in der JComboBox angezeigten Werte ermittelt werden muss – bei einem JToggleButton hängt der Wert des Attributes von dem gewählten ab und muss vorab innerhalb des Business Objects definiert sein.

Das folgende Code-Muster ist die Standard-Bearbeitung für die Veränderung der Auswahl in GUI-Elementen vom Typ JComboBox.
Bitte kopieren Sie den Code für jedes GUI-Element vom Typ
JComboBox und adaptieren Sie die Platzhalter entsprechend Ihren Anforderungen.

/*
 * Muster-Code für das Auslesen des Wertes aus einer JComboBox.
 * In dieser Combobox darf eine Eingabe eines Wertes nicht möglich sein -
 * nur die Auswahl aus der angezeigten Liste.
 * Die Bearbeitung eines eingegebenen Wertes wird in der Methode 'anyUpdate(...)' ausgeführt. */

        
if (strEventSourceName.compareTo(frmTF.get_combo_Sample_JComboBox().getName()) == 0) {
/*
 * Prüfen ob dieses GUI-Element ausgewählt ('selektiert') wurde.
 * Bei einer Änderung eines Status wird diese Methode auch dann aufgerufen, wenn die
 * Auswahlmöglichkeit eines GUI-Elements 'verlassen' (de-selected) wird - in diesem Fall
 * soll der Code nicht ausgeführt werden. */

          
if (e.getStateChange() == ItemEvent.SELECTED) {
/* 
 * Korrekturmassnahme wenn dieses GUI-Element in der Methode 'copy' des ActionHandlers als Feld
 * mit Schlüsselwert markiert wurde: Wiederherstellen von Standard-Farbe, -Font und -Schriftgrösse.
 * Wenn dieses GUI-Element nicht Teil des Anwender-bekannten Schlüssels ist kann dieser Code
 * weg gelassen werden. */

          JSBS_GUIServices.setDefinedForegroundColor(
frmTF.get_combo_Sample_JComboBox(), frmTF);
/* 
 * Eingabe im GUI-Feld auf Gültigkeit prüfen. Dazu wird die Methode zum Auslesen des Wertes
 * verwendet. In der verwendeten Methode wird auch der Hintergrund des GUI-Elements eingefärbt. */

          
bol_combo_Sample_JComboBox_OK = (
            JSBS_GUIServices.getSelectedTextFromJComboBox(
frmTF.get_combo_Sample_JComboBox(), frmTF)
              !=
null);
/* Wenn der eingegebene Wert die Prüf-Regeln bestanden hat dann wird der Wert auf das
 * zugehörige Attribut des BO übertragen.
 * Dazu wird die Methode 'getFromGUI(...) der jeweiligen BOC-Klasse verwendet. */

          
if (bol_combo_Sample_JComboBox_OK)
            
frmTF.structapplication_entity_BOC_Processed.getFromGUI(
                
null, frmTF.get_combo_Sample_JComboBox(), null, ...);
/* ---------------------------------------------------------------------------------- */
/*
 * ALTERNATIV oder zusätzlich zum Übertragen eines Wertes auf das BO kann es auch erforderlich
 * sein, eine Methode auszuführen.
 * Hier ein Beispiel zum Aufruf einer Methode im Action-Handler. */

            
application_task__ActionHandler.method(frmTF, further_parameters);
/* ---------------------------------------------------------------------------------- */
          }
/*
 * Anmerkung: Bei einer Combobox ist eine Verarbeitung beim Trigger DESELECTED nicht notwendig
 * weil mit dem deselektieren eines Eintrages in der Combobox-Liste auch ein Trigger SELECTED
 * (eines anderen Eintrags aus der Liste)erfolgt.
*/
        }


Das folgende Code-Muster ist die Standard-Bearbeitung für die Veränderung der Auswahl in GUI-Elementen vom Typ JCheckBox oder JRadioButton.
Bitte kopieren Sie den Code für jedes GUI-Element vom Typ
JCheckBox oder JRadioButton und adaptieren Sie die Platzhalter entsprechend Ihren Anforderungen.

/*
 * Muster-Code für das Auslesen des Wertes aus einer Checkbox oder eines Radiobuttons. */

        
if (strEventSourceName.compareTo(frmTF.get_GUI_Element().getName()) == 0) {
/*
 * Prüfen ob dieses GUI-Element ausgewählt ('selektiert') wurde.
 * Bei einer Änderung eines Status wird diese Methode auch dann aufgerufen, wenn die
 * Auswahlmöglichkeit eines GUI-Elements 'verlassen' (de-selected) wird - in diesem Fall
 * soll der Code nicht ausgeführt werden. */

          
if (e.getStateChange() == ItemEvent.SELECTED) {
/* ---------------------------------------------------------------------------------- */
/* Zugehörige Variable des BO ändern. Dazu wird die Methode 'getFromGUI(...)' des BO aufgerufen. */

          
frmTF.structapplication_entity_BOC_Processed.getFromGUI(
                
null, frmTF.get_GUI_Element(), null, ...);
/* ---------------------------------------------------------------------------------- */
/*
 * ALTERNATIV oder zusätzlich zum Übertragen eines Wertes auf das BO kann es auch erforderlich
 * sein, eine Methode auszuführen.
 * Hier ein Beispiel zum Aufruf einer Methode im Action-Handler. */

            
application_task__ActionHandler.method(frmTF, further_parameters);
/* ---------------------------------------------------------------------------------- */
          }
/*
 * Prüfen ob dieses GUI-Element (eine CheckBox) nicht gewählt ('deselektiert') wurde.
 * Das Prüfen auf DESELECTED ist nur bei einer Checkbox notwendig; bei einem Radiobutton
 * wird mit dem deselektieren eines Buttons gleichzeitig an anderer Button selektiert
 * und damit die Verarbeitung beim Trigger SELECTED ausgeführt.
*/
          
if (e.getStateChange() == ItemEvent.DESELECTED) {
/* ---------------------------------------------------------------------------------- */
/*
 * Zugehörige Variable des BO ändern. Dazu wird die Methode 'getFromGUI(...)' des BO aufgerufen. */

          
frmTF.structapplication_entity_BOC_Processed.getFromGUI(
                
null, frmTF.get_GUI_Element(), null, ...);
/* ---------------------------------------------------------------------------------- */
/*
 * ALTERNATIV oder zusätzlich zum Übertragen eines Wertes auf das BO kann es auch erforderlich
 * sein, eine Methode auszuführen.
 * Hier ein Beispiel zum Aufruf einer Methode im Action-Handler. */

            
application_task__ActionHandler.method(frmTF, further_parameters);
/* ---------------------------------------------------------------------------------- */
          }
        }

zum Inhaltsverzeichnis

Zusammenfassen der Flags für korrekte / fehlerhafte Eingaben - Methode checkEntriesOK()

/*
 * METHODE, die alle Flags (boolsche Variablen die signalisieren, ob die Eingabe im zugehörigen
 * GUI-Element die Eingabe-Regel erfüllt) zu einer boolschen Variable zusammenfaßt.
 * Die dafür verwendete Variable ist in der geerbten Klasse definiert. */

    
private void checkEntriesOK() {
/* Boolsche Operation die prüft, ob alle Eingaben den Eingabe-Regeln entsprechen. */
        
bolCompleteEntryOK =
              
bol_txt_Sample_JTextField_OK
           && 
bol_txt_Sample_JTextArea_OK
           && 
bol_combo_Sample_JComboBox_OK;
    }

Der Muster-Code ist so zu adaptieren dass die Werte aller Flags in der Variablen bolCompleteEntryOK zusammen gefasst werden.

zum Inhaltsverzeichnis

Spezieller Muster-Code

In diesem Teil wird Muster-Code vorgestellt, der nicht in jeder der in diesem Dokument beschriebenen Klassen vorkommen wird und deswegen nicht in den Muster-Code der Klasse aufgenommen wurde.

zum Inhaltsverzeichnis

Übernehmen von Werten aus den Parameter-Feldern des CommandCenter

Wenn bereits im CommandCenter (Start-Frame) die Eingabe von Parameter-Werten für die Einschränkung der Anzeige in der Auswahlliste möglich ist, dann können die Parameter-Werte auf verschiedene Arten verarbeitet werden.
Je nach Anforderung des zu bearbeitenden Geschäftsfalls müssen eventuell auch verschiedene Arten der Verarbeitung kombiniert werden.

Übernehmen in Eingabefeld oder Combobox 
Füllen der Liste wenn dies durch eine Schaltfläche ausgelöst wird 
Anzeigen der Daten wenn in der Liste nur ein Datensatz vorhanden ist 
Anzeigen der Daten für den im CommandCenter eingegebenen Wert 
Anzeigen der Daten für den im CommandCenter eingegebenen Wert – mit Ähnlichkeitsvergleich 

zum Inhaltsverzeichnis

zum Inhaltsverzeichnis (Übernahme Parameter-Werte)
zum Inhaltsverzeichnis (Gesamt)

zum Inhaltsverzeichnis (Übernahme Parameter-Werte)
zum Inhaltsverzeichnis (Gesamt)

zum Inhaltsverzeichnis (Übernahme Parameter-Werte)
zum Inhaltsverzeichnis (Gesamt)

zum Inhaltsverzeichnis (Übernahme Parameter-Werte)
zum Inhaltsverzeichnis (Gesamt)

zum Inhaltsverzeichnis (Übernahme Parameter-Werte)
zum Inhaltsverzeichnis (Gesamt)

Weitere Schritte und verwandte Dokumentation

Dokument

Inhalt

Leitfaden für die Entwicklung von Heavyweight-Clients mit dem JS-FCF – Alle Schritte zur Entwicklung des Task-Frames  

In diesem Leitfaden werden alle Tätigkeiten für die Entwicklung eines Task-Frames (Teilprogramm für die Abwicklung eines Geschäftsfalls) gelistet – auch jene die nicht direkt das Codieren in Java umfassen.

zum Inhaltsverzeichnis