|
Letzte
Bearbeitung dieses Dokuments: |
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: 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.
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
Tutorial für die Programmierung eines Heavyweight-Clients (Fat-Client) durchgearbeitet.
Klassen für das
(die) verwendeten Business-Object(s) implementiert.
Den Leitfaden
dazu finden Sie im Dokument Leitfaden
für die Entwicklung von Heavyweight-Clients mit dem JS-FCF – Alle
Schritte zur Entwicklung von DBA (DataBase-Access) und BO
(Business-Object) Klassen.
Layout für die
Anordnung der GUI-Elemente.
Ein Formblatt dafür finden Sie unter
Poster
für das GUI-Layout der Basisklasse JSBS_TaskFrame.
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); }}
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.
copyFromapplication_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.
copyFromapplication_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.
copyFromapplication_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.
copyFromapplication_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.
copyFromapplication_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.
copyFromapplication_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.
copyFromapplication_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.
copyFromapplication_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.
copyFromapplication_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.
copyFromapplication_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,
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.
* 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(structapplication_entity_BOC.StatusCode),
structapplication_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;
}
}
}
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();
}}
Anleitung
zur Adaptierung in allen KlassenAm
leichtesten funktioniert die Anpassung des Muster-Codes an die
eigenen Erfordernisse durch Kopieren des Muster-Codes und Verwendung
von Edit
> Find/Replace... .
|
|
|
Änderung
des Namens des Java-Packagespackage
application_package.client;/*
Dieser
Name kommt mehrmals in allen drei Klassen vor.
Änderung
des Namens der KlassenIn
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.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..
Ä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.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.
Änderung
des Namens der Klasse des CommandCenterspublic
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.
Definieren
der Variablen für die 'aufzuhebenden' Selektionskriterien für die
Anzeige der ListeDamit
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.
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. Ein
Formblatt dafür finden Sie unter Poster
für das GUI-Layout der Basisklasse JSBS_TaskFrame.
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 -
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.
.
. . . .
. . . . .
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.
Aufnehmen
der GUI-Elemente in das pnl_DetailFieldsIn
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.
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.
Festlegen
von Feldern mit verpflichtender EingabeWenn
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. */
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.
Anleitung
zur Adaptierung bei Verwendung von Währungen in der Klasse für die
GUI Adaptieren
in der Methode initialize_frameIn
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());
.
. . . .
Adaptieren
in der Methode initialize_after_frameIn
dieser Methode sind zwei Änderungen notwendig:
Für
das Einfärben der Ränder muss ebenfalls - das in der geerbten
Basisklasse enthaltene - pnl_Main_With_Currency_Selection
in
das Array mit den einzufärbenden GUI-Elementen aufgenommen
werden:/*
* 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);
Die
Combobox für die Auswahl der Währung muss mit den festgelegten
Währungen gefüllt werden und die im StartFrame (CommandCenter)
bereits gewählte Währung muss übernommen werden: * 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 kommentieren Sie bitte die folgenden
Zeile aus .
*/// frmCC.fillComboBoxWithCurrencies(get_combo_CurrencySelection());
// JSBS_GUIServices.setJComboBoxItem(get_combo_CurrencySelection(),// frmCC.structJSBS_UniversalParameters.strPreferredCurrency,// frmCC.structJSBS_UniversalParameters,
true);
}
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.
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); }
}
'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.
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.
copyFromapplication_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);
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())
}
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);
}
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.
GUI-Felder
mit den Werten für die Anwender-bekannte Identifikation.
Kopieren
und Ändern Sie den Muster-Code entsprechend den Anweisungen im
Kommentar.
Aufgabe des Codes ist, jene GUI-Felder, die
den/die Wert(e) für die Anwender-bekannte Identifikation enthalten,
zu sperren wenn ein Datensatz (BO / Business Object) zum Ändern
angezeigt wird – bzw. zu öffnen wenn ein neuer Datensatz erfasst
werden soll.
Bei
der Version 'MobileClient' mit unterbrochener Verbindung zum JAS
(Java Application Server).
Erstellen
Sie vor der Implementierung des Codes eine Analyse, welche Werte
nicht geändert werden dürfen, wenn die Verbindung zum JAS
unterbrochen ist bzw. ob das Erfassen eines neuen Datensatzes
erlaubt sein soll.
Grund für die mögliche Sperre von
Eingaben ist, dass bei einer unterbrochenen Verbindung zum JAS –
und damit bei einem asynchronen Erfassen oder Ändern von Daten –
der gleiche Datensatz von verschiedenen Anwendern erfasst oder
geändert werden kann ohne dass die Änderung sofort für andere
Anwender abrufbar ist.
Um Zweideutigkeiten (z.B. gilt die spätere
Änderung und kann die frühere Änderung ignoriert werden) beim
Zusammenführen der asynchron erfassten Daten zu vermeiden, ergibt
die Analyse möglicherweise, dass es für den Geschäftsbetrieb
'sicherer' ist, das Ändern und Erfassen nur zu erlauben wenn der
Client mit dem Server verbunden ist.
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); }
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.
*/.
. . . . . . . . . ..
. . . . . . . . . .
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..
. . . . . . . . . ..
. . . . . . . . . .
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);
}
}
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
.
. . . . . . . . . ..
. . . . . . . . . .
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..
. . . . . . . . . ..
. . . . . . . . . .
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:
.
. . . . . . . . . ..
. . . . . . . . . .
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.
Definieren
der 'Document's und der 'Flag's für die EingabeprüfungenVoraussetzung
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.
Zuweisen
der 'Document's der GUI-Elemente auf die VariablenIn
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.
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.
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,
...);
}
Das
Eingabefeld, dessen Text geändert wurde, wird über sein 'Document'
identifiziert.
Die Variable für das 'Document' wurde im
Abschnitt Definieren
der Variable für 'Document's und 'Flag's
definiert
und im Abschnitt Zuweisen
der Referenz auf das 'Document' des GUI-Elements im 'Constructor'
wurde
der Wert aus dem Eingabefeld zugewiesen.
Ersetzen Sie bitte den
Platzhalter durch das entsprechende 'Document':
/*
* 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
Wenn
Sie den Hintergrund des Eingabefelds anders eingefärbt haben - um
beim Kopieren eines Datensatzes darauf hinzuweisen, dass der Wert
ein Teil der Anwender-bekannten Identifikation ist (siehe Abschnitt
Adaptieren
der Methode copy(...)
– dann
wird mit dem folgenden Code der Hintergrund des Eingabefeldes wieder
'normal' eingefärbt.
Wenn das Eingabefeld nicht Teil der
Anwender-bekannten Identifikation ist, löschen Sie bitte den
folgenden Code./*
* 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);
Als
nächstes wird die Prüfung auf einen gültigen Eingabewert
durchgeführt. Dazu werden die Methoden zum 'Auslesen' des Wertes
aus dem Eingabefeld verwendet.
Im Muster-Code ist die Methode zum
Auslesen von Text 'unkommentiert' und Methoden für das 'Auslesen'
von anderen Datentypen unter Kommentar.
Entfernen Sie bitte bei
Bedarf den Kommentar vor dem jeweiligen Aufruf der Methode und
Ersetzen Sie den Platzhalter durch den Namen des jeweiligen
GUI-Elements./*
* 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.
Zum
Übertragen des Wertes aus dem Eingabefeld auf das Attribut des BO
wird die beim BO definierte Methode getFromGUI(...)
verwendet.
Das
Codieren dieser Methode ist im Dokument Muster-Code
für ein BOC (Client-Side Klasse eines Business-Object) >
Methoden getFromGUI(...)
und
setToGUI(...)
adaptieren
beschrieben.
Beachten
Sie bitte, dass das GUI-Element (Eingabefeld) in der richtigen
Stelle der Parameter-Liste der Methode platziert ist.
Für die
Parameter aller anderen GUI-Elemente der Methode werden null-Werte
übergeben./* 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;
}/*
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.
*/
}
Die
JComboBox,
in der eine andere Auswahl aus der Liste mit den Werten getroffen
wurde, wird über den Namen (des GUI-Elements) identifiziert.
Ersetzen Sie bitte den Platzhalter durch das entsprechende
Objekt: /*
* 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.
Wenn
Sie den Hintergrund der JComboBox
anders
eingefärbt haben - um beim Kopieren eines Datensatzes darauf
hinzuweisen, dass der Wert ein Teil der Anwender-bekannten
Identifikation ist (siehe Abschnitt Adaptieren
der Methode copy(...)
– dann
wird mit dem folgenden Code der Hintergrund des Eingabefeldes wieder
'normal' eingefärbt.
Wenn der Wert der JComboBox
nicht
Teil der Anwender-bekannten Identifikation ist, löschen Sie bitte
den folgenden Code./*
* 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);
Als
nächstes wird die Prüfung auf einen gültigen Eingabewert
durchgeführt. Dazu wird die Methode zum 'Auslesen' des gewählten
Wertes aus der Liste in der Combobox verwendet./*
* 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.
Zum
Übertragen des ausgewählten Wertes auf das Attribut des BO wird
die beim BO definierte Methode getFromGUI(...)
verwendet.
Das
Codieren dieser Methode ist im Dokument Muster-Code
für ein BOC (Client-Side Klasse eines Business-Object) >
Methoden getFromGUI(...)
und
setToGUI(...)
adaptieren
beschrieben.
Beachten
Sie bitte, dass das GUI-Element (Eingabefeld) in der richtigen
Stelle der Parameter-Liste der Methode platziert ist.
Für die
Parameter aller anderen GUI-Elemente der Methode werden null-Werte
übergeben./* 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,
...);
Bei
komplexeren Abläufen kann es notwendig sein, dass bei der Änderung
der Auswahl in einer Combobox eine weitere Verarbeitung ausgeführt
wird; z.B. das Kontext-bezogene Sperren oder Freigeben der Eingabe
in bestimmten Eingabefeldern.
Um den Code in der
DocumentListener-Klasse klar strukturiert zu halten ist es sinnvoll,
die Kontext-bezogene Verarbeitung in einer eigenen Methode in der
Klasse für den ActionHandler zu implementieren.
Das folgende
Code-Muster zeigt, wie bei der Änderung der Auswahl in einer
Combobox diese Methode aufgerufen wird.
Wenn außer dem
Übertragen des Wertes aus der Combobox auf das Attribut des BO
keine weitere Verarbeitung notwendig ist dann löschen Sie bitte
diesen Teil des Muster-Codes./*
* 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);
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);/*
----------------------------------------------------------------------------------
*/
}
}
Die
JCheckBox
oder
der JRadioButton
der
selektiert wurde, wird über den Namen (des GUI-Elements)
identifiziert.
Ersetzen Sie bitte den Platzhalter durch das
entsprechende Objekt: /*
* 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.
Zum
Übertragen des zugehörigen Wertes auf das Attribut des BO wird die
beim BO definierte Methode getFromGUI(...)
verwendet.
Das
Codieren dieser Methode ist im Dokument Muster-Code
für ein BOC (Client-Side Klasse eines Business-Object) >
Methoden getFromGUI(...)
und
setToGUI(...)
adaptieren
beschrieben.
Beachten
Sie bitte, dass das GUI-Element (Eingabefeld) in der richtigen
Stelle der Parameter-Liste der Methode platziert ist.
Für die
Parameter aller anderen GUI-Elemente der Methode werden null-Werte
übergeben./* 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,
...);Bei
einem GUI-Element vom Typ JCheckBox
ist
der gleiche Aufruf der Methode getFromGUI(...)
auch
aufzurufen wenn die JCheckBox
'DESELECTED'
wurde.
Bei einem GUI-Element vom Typ JRadioButton
bedeutet
ein 'DESELECTED'
üblicherweise, dass ein anderer JRadioButton
'SELECTED'
wurde – daher kann der Muster-Code im 'DESELECTED'
Zweig gelöscht werden.
Bei
komplexeren Abläufen kann es notwendig sein, dass bei der Änderung
des Status einer JCheckBox
oder
eines JRadioButton
eine
weitere Verarbeitung ausgeführt wird; z.B. das Kontext-bezogene
Sperren oder Freigeben der Eingabe in bestimmten Eingabefeldern.
Um
den Code in der DocumentListener-Klasse klar strukturiert zu halten
ist es sinnvoll, die Kontext-bezogene Verarbeitung in einer eigenen
Methode in der Klasse für den ActionHandler zu implementieren.
Das
folgende Code-Muster zeigt, wie bei der Änderung des Status einer
JCheckBox
oder
eines JRadioButton
diese
Methode aufgerufen wird.
Wenn außer dem Übertragen des
zugehörigen Wertes auf das Attribut des BO keine weitere
Verarbeitung notwendig ist dann löschen Sie bitte diesen Teil des
Muster-Codes./*
* 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);Bei
einem GUI-Element vom Typ JCheckBox
ist
möglicherweise die gleiche oder eine andere Methode auch aufzurufen
wenn die JCheckBox
'DESELECTED'
wurde.
Bei einem GUI-Element vom Typ JRadioButton
bedeutet
ein 'DESELECTED'
üblicherweise, dass ein anderer JRadioButton
'SELECTED'
wurde – daher kann der Muster-Code im 'DESELECTED'
Zweig gelöscht werden.
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.
Spezieller
Muster-CodeIn
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.
Übernehmen
von Werten aus den Parameter-Feldern des CommandCenterWenn
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
Übernehmen
in Eingabefeld oder Combobox private
static void processCCParameter(application_task
parmTF)
{.
. . . ..
. . . ./*
Übernehmen in ein Textfeld. */
if
(parmTF.strCCParameter1.trim().length()
> 0)
{
JSBS_GUIServices.setTextToJTextField(parmTF.get_txt_EntryField(),
parmTF.strCCParameter1.trim());
}
.
. . . .
. . . . .Alternativ
der Code für das Auswählen eines Eintrages der
Combobox: private
static void processCCParameter(application_task
parmTF)
{.
. . . ..
. . . ./*
Übernehmen in eine Combobox. */
if
(parmTF.strCCParameter1.trim().length()
> 0)
{
JSBS_GUIServices.setJComboBoxItem(parmTF.get_combo_Combobox(),
parmTF.strCCParameter1.trim(),
parmTF.frmCC.structJSBS_UniversalParameters,
true);
}
.
. . . .
. . . . .Der
Code übernimmt den Text aus den Parameter-Feldern des CommandCenter
in Felder für die Auswahl.
Das Prüfen auf korrekte Eingabe
(Element aus der Liste einer Combobox oder Länge bzw. Wertebereich
bei einem Eingabefeld) wird automatisch erledigt weil das 'setzen'
von Text nur die Eingabe von der Tastatur (oder einem anderen
Eingabegerät) simuliert.
▲
zum
Inhaltsverzeichnis (Übernahme Parameter-Werte)▲
zum
Inhaltsverzeichnis (Gesamt)
Füllen
der Liste wenn dies durch eine Schaltfläche ausgelöst
wirdVoraussetzung
für diesen Code ist, dass bereits Parameter-Werte für das
'Filtern' übernommen wurden.
Für das Füllen der Liste wird ein
'Klick' auf die Schaltfläche simuliert.
Anschließend kann noch
Code für einen weiteren Vergleich und eine eventuelle Anzeige der
Werte eines BO implementiert werden..
. . . ..
. . . .
private
static void processCCParameter(application_task
parmTF)
{.
. . . ..
. . . ./*
Klick auf die Schaltfläche simulieren.
*/
parmTF.get_btn_ListBO().doClick();
.
. . . .
. . . . .
▲
zum
Inhaltsverzeichnis (Übernahme Parameter-Werte)▲
zum
Inhaltsverzeichnis (Gesamt)
Anzeigen
der Daten wenn in der Liste nur ein Datensatz vorhanden istDieser
Code prüft, ob in der Liste nur ein Datensatz angezeigt wird,
extrahiert die Werte für die Anwender-bekannte-Identifikation und
ruft dann die Methode zum Anzeigen der Daten auf..
. . . ..
. . . .
private
static void processCCParameter(application_task
parmTF)
{.
. . . ..
. . . ./*
* Ermitteln, wieviele BO in der Liste für die
Anzeige vorhanden sind.
* Wenn nicht genau 1 BO in der
Liste enthalten ist, dann die weitere Verarbeitung nicht ausführen.
*/
if
(parmTF.structapplication_entity_BOC_Set.vecRecordSet.size()
!= 1) return;/*
* Vergleich erfolgreich.
* Für die
Detail-Anzeige der Werte des BO bestehende Methoden verwenden:
* Setzen der Auswahl und dann Schaltfläche
'anklicken'.
* Anschließend Methode beenden.
*/
parmTF.get_txt_Selection().setText("1");
parmTF.get_btn_Get().doClick();
return;
▲
zum
Inhaltsverzeichnis (Übernahme Parameter-Werte)▲
zum
Inhaltsverzeichnis (Gesamt)
Anzeigen
der Daten für den im CommandCenter eingegebenen WertDieser
Code wird dann eingesetzt wenn die Anzeige in der Liste nicht durch
Selektionskriterien eingeschränkt wird (das kann der Fall sein,
wenn nur sehr wenige Einträge in der Liste erwartet werden – z.B.
bei möglichen Einstellungen des Anwendungsprogramms) oder durch
einen anderen Parameter bereits eine Auswahlliste angezeigt
wurde.
Um nicht zusätzlich eine – möglicherweise
ergebnislose – Abfrage auf die Datenbank ausführen zu müssen,
wird im Algorithmus geprüft ob der gesuchte Wert in der angezeigten
Liste vorhanden ist und bei einem erfolgreichen Vergleich die
bereits existierende Methode zum Anzeigen der Daten aufgerufen..
. . . ..
. . . .
private
static void processCCParameter(application_task
parmTF)
{.
. . . ..
. . . ./*
* Prüfen, ob im Parameter ein Wert eingegeben
wurde.
* Wenn auch die Eingabe von 'leeren'
Zeichenketten erlaubt ist, dann dieses 'if' löschen. */
if
(parmTF.strCCParameter2.trim().length()
> 0) {/*
* Ermitteln, wieviele BO in der Liste für die
Anzeige vorhanden sind.
* Wenn die Liste leer ist,
dann die weitere Verarbeitung nicht ausführen. */
int
intVectorSize
=
parmTF.structapplication_entity_BOC_Set.vecRecordSet.size();
if
(intVectorSize
<= 0) return;/*
* Liste enthält zumidest ein BO; enthaltene BO mit
dem Wert aus dem Parameter in einer 'for'-Schleife vergleichen.
*/
int
intVectorIndex;
application_entity_BO
locBO;
for
(intVectorIndex
= 0; intVectorIndex < intVectorSize; intVectorIndex++) {/* Zu
bearbeitendes BO aus der Liste 'herausholen'. */
locBO
= (application_entity_BO)
parmTF.structapplication_entity_BOC_Set.elementAt(intVectorIndex);/*
* Vergleichen des Parameter-Wertes mit dem
entsprechenden Attribut des BO.
* Der Vergleich
'compareToIgnoreCase' erlaubt eine Eingabe des Parameter-Wertes ohne
Gross-/
* Kleinschreibung beachten zu müssen.
* Wenn Sie einen genauen Vergleich der Werte
erreichen wollen, verwenden Sie bitte 'compareTo'.
*/
if
(parmTF.strCCParameter2.compareToIgnoreCase(locBO.attribute)
== 0) {/*
* Vergleich erfolgreich.
* Für die
Detail-Anzeige der Werte des BO bestehende Methoden verwenden:
* Setzen der Auswahl und dann Schaltfläche
'anklicken'.
* Anschließend Methode und damit
'for'-Schleife beenden.
*/
parmTF.get_txt_Selection().setText(JSBS_Formatter.toFormattedString(intVectorIndex
+
1));
parmTF.get_btn_Get().doClick();
return;
}
}
}
}
.
. . . .
. . . . .
▲
zum
Inhaltsverzeichnis (Übernahme Parameter-Werte)▲
zum
Inhaltsverzeichnis (Gesamt)
Anzeigen
der Daten für den im CommandCenter eingegebenen Wert – mit
ÄhnlichkeitsvergleichDieser
Code erweitert den obigen Algorithmus um eine Auswahl des
ähnlichsten Wertes wenn keine exakte Übereinstimmung gefunden
wird..
. . . ..
. . . .
private
static void processCCParameter(application_task
parmTF)
{.
. . . ..
. . . ./*
Übernehmen in ein Textfeld. */
if
(parmTF.strCCParameter1.trim().length()
> 0) {/*
Übernehmen in eine temporäre Variable die für den späteren
Vergleich verwendet wird
* Dabei gleich führende und
folgende Leerzeichen entfernen. */
String
strParameterToCompare = parmTF.strCCParameter1.trim();/*
Ermitteln der Anzahl der Zeichen im Parameter für spätere
Vergleiche. */
int
intParameterLength
= strParameterToCompare.length();/*
Anzahl der Zeichen um die der ähnlichste Vergleichswert länger ist
als der Wert des Parameters. */
int
intCharactersLeftBestMatching
= 9999999;/*
Index des ähnlichsten verglichenen Vergleichswertes in der Liste.
*/
int
intIndexBestMatching
= 999999;/*
Anzahl der Elemente in der Liste, Index zum Durchsuchen und Variable
für ein BO aus der Liste. */
int
intVectorSize
=
parmTF.structapplication_entity_BOC_Set.vecRecordSet.size();
int
intVectorIndex;
application_entity_BO
locapplication_entity_BO;/*
for-Schleife zum Vergleichen des Parameter-Wertes mit jedem BO in
der Liste. */
for
(intVectorIndex
= 0; intVectorIndex < intVectorSize; intVectorIndex++) {/*
'Herausholen der zu vergleichenden BO aus der Liste.
*/
locapplication_entity_BO
=
(application_entity_BO)
parmTF.structapplication_entity_BOC_Set.vecRecordSet.elementAt(intVectorIndex);/*
Vergleichen, ob eine komplette Übereinstimmung vorliegt.
*/
if
(locapplication_entity_BO.attribute.compareTo(strParameterToCompare)
== 0) {/*
Komplette Übereinstimmung; for-Schleife beenden.
* Die
weitere Verarbeitung erfolgt nach dem Ende der for-Schleife.
*/
intIndexBestMatching
= intVectorIndex;
break;
}/*
Vergleichen auf teilweise Übereinstimmung. */
if
(locapplication_entity_BO.attribute.startsWith(strParameterToCompare))
{/*
Ermitteln, wie viele Zeichen nach dem übereinstimmenden Teil noch
vorhanden sind. */
int
intRemainingChars
= locapplication_entity_BO.attribute.length()
- intParameterLength;/*
Vergleichen ob weniger verschiedene Zeichen übrig sind und in
diesem Fall die Werte merken. */
if
(intRemainingChars
< intCharactersLeftBestMatching)
{
intCharactersLeftBestMatching
= intRemainingChars;
intIndexBestMatching
= intVectorIndex;
}
}
}/*
Wenn eine Übereinstimmung gefunden wurde, dann diesen Datensatz im
Detail anzeigen.
* Dazu werden die bestehenden
Methoden verwendet. */
if
(intIndexBestMatching
>= 0)
{
JSBS_GUIServices.setTextToJTextField(parmTF.get_txt_Selection(),
JSBS_Formatter.toFormattedString(intIndexBestMatching
+
1));
parmTF.get_btn_Get().doClick();
}
}
.
. . . .
. . . . .Die
Verarbeitung erfolgt in zwei Phasen:
* 1.) Vergleich auf eine
komplette Übereinstimmung; wenn dieser nicht erfüllt wird, dann
*
2.) Finden jenes Eintrags in der Liste, dessen Wert am Anfang den
gesuchten Wert enthält und am wenigsten nachfolgende Zeichen hat.
▲
zum
Inhaltsverzeichnis (Übernahme Parameter-Werte)▲
zum
Inhaltsverzeichnis (Gesamt)
|
Dokument |
Inhalt |
|
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. |