|
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
struct
application_task
__DocumentListener
;
/*
* Business-Objects (Client-Side-Klasse)
* für
die Detail-Anzeige und-Bearbeitung definieren. */
protected
application_entity
_BOC
struct
application_entity
_BOC_Read
;
protected
application_entity
_BOC
struct
application_entity
_BOC_Processed
;
/*
* Liste mit Business-Objects (Client-Side-Klasse)
* für die Auswahl-Liste definieren. */
protected
application_entity
_BOC_Set
struct
application_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.
*/
struct
application_entity
_BOC_Read
=
new
application_entity
_BOC(
frmCC
,
this
);
struct
application_entity
_BOC_Processed
=
new
application_entity
_BOC(
frmCC
,
this
);
struct
application_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.
*/
struct
application_task
__DocumentListener
=
new
application_task
__DocumentListener(
this
);
addListeners(this
.getContentPane(),
struct
application_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.process
ChangedImage
(
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. */
struct
application_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
.
ColumnWidthArray
0x
=
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.struct
application_entity
_BOC_Read
.
copyFromapplication_entity
_BO(
parmTF.struct
application_entity
_BOC_Processed
);
/*
* Prüfen
und Aktivieren / Deaktivieren von Schaltflächen (JButtons).
*/
parmTF.
struct
application_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.
struct
application_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.
struct
application_entity
_BOC_Read
.
attribute1
+
"
/ "
+
parmTF.
struct
application_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.
struct
application_entity
_BOC_Set
.select
xxx
(
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.
struct
application_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.struct
application_entity
_BOC_Set
.
StatusCode
),
parmTF.struct
application_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.
struct
application_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.struct
application_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.
struct
application_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.
struct
application_entity
_BOC_Processed
.store();
/*
* Prüfen
ob die Datenbank-Operation fehlerfrei war; dazu den Status-Code des
* BOC abfragen.
*/
switch
(parmTF.
struct
application_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.
struct
application_entity
_BOC_Read
.
copyFromapplication_entity
_BO(
parmTF.struct
application_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.struct
application_entity
_BOC_Processed
.
User_Known_Key_Variable_1
,
parmTF.struct
application_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.struct
application_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.struct
application_entity
_BOC_Processed
.
User_Known_Key_Variable_1
,
parmTF.struct
application_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.struct
application_entity
_BOC_Processed
.
StatusCode
),
parmTF.struct
application_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.
struct
application_entity
_BOC_Processed
.
Variable_of_Type_String
.
compareTo(parmTF.str_Selection_
VariableName
)
== 0)
&&
(parmTF.struct
application_entity
_BOC_Processed
.
Variable_of_Elementary_Type
==
int_Selection_
VariableName
)
)
redisplayBOList(parmTF);/*
* Methode
zum Aktivieren / Deaktivieren von Schaltflächen (JButtons) aufrufen.
*/
parmTF.struct
application_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.struct
application_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.struct
application_entity
_BOC_Processed
.
DataSetID
=
0;
parmTF.struct
application_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.struct
application_entity
_BOC_Read
.
copyFromapplication_entity
_BO(
parmTF.struct
application_entity
_BOC_Processed
);
/*
* Methode
zum Aktivieren / Deaktivieren von Schaltflächen (JButtons) aufrufen.
*/
parmTF.struct
application_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.
struct
application_entity
_BOC_Processed
.
copyFromapplication_entity
_BO(
parmTF.struct
application_entity
_BOC_Read
);
/*
*
Methode des BOC, das den 'nächsten' Datensatz holt,
aufrufen.
* Dabei wird der 'Startpunkt' aus den
angezeigten Daten gewonnen.
*/
parmTF.
struct
application_entity
_BOC_Read
.selectNext(
parmTF.struct
application_entity
_BOC_Read
.
attribute1
,
parmTF.struct
application_entity
_BOC_Read
.
attribute2
);
/*
* Prüfen
ob die Datenbank-Operation fehlerfrei war; dazu den Status-Code des
* BOC abfragen.
*/
switch
(parmTF.
struct
application_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.
struct
application_entity
_BOC_Processed
.
copyFromapplication_entity
_BO(
parmTF.struct
application_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.
struct
application_entity
_BOC_Read
.
copyFromapplication_entity
_BO(
parmTF.struct
application_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.struct
application_entity
_BOC_Read
.
StatusCode
),
parmTF.struct
application_entity
_BOC_Read
.
StatusMsg
,
parmTF.struct
application_entity
_BOC_Read
.
User_Known_Key_Variable_1
,
parmTF.struct
application_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.
struct
application_entity
_BOC_Processed
.
copyFromapplication_entity
_BO(
parmTF.struct
application_entity
_BOC_Read
);
/*
*
Methode des BOC, das den 'vorigen' Datensatz holt, aufrufen.
* Dabei
wird der 'Startpunkt' aus den angezeigten Daten gewonnen.
*/
parmTF.
struct
application_entity
_BOC_Read
.selectPrevious(
parmTF.struct
application_entity
_BOC_Read
.
attribute1
,
parmTF.struct
application_entity
_BOC_Read
.
attribute2
);
/*
* Prüfen
ob die Datenbank-Operation fehlerfrei war; dazu den Status-Code des
* BOC abfragen.
*/
switch
(parmTF.
struct
application_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.
struct
application_entity
_BOC_Processed
.
copyFromapplication_entity
_BO(
parmTF.struct
application_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.
struct
application_entity
_BOC_Read
.
copyFromapplication_entity
_BO(
parmTF.struct
application_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.struct
application_entity
_BOC_Read
.
StatusCode
),
parmTF.struct
application_entity
_BOC_Read
.
StatusMsg
,
parmTF.struct
application_entity
_BOC_Read
.
User_Known_Key_Variable_1
,
parmTF.struct
application_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.struct
application_entity
_BOC_Read
.selectByUserKnownKey(
parmAttribute1
,
parmAttribute2
);
/*
* Prüfen
ob die Datenbank-Operation fehlerfrei war; dazu den Status-Code des
* BOC abfragen. */
switch
(parmTF.
struct
application_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.struct
application_entity
_BOC_Processed
.
copyFromapplication_entity
_BO(
parmTF.struct
application_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.struct
application_entity
_BOC_Read
.
StatusCode
),
parmTF.struct
application_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
struct
application_entity
_BO
=
(application_entity
_BO)
parmTF.struct
application_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
struct
application_entity
_BO
=
(application_entity
_BO
)
parmTF.struct
application_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
struct
application_entity
_BOC
=
new
application_entity
_BOC(parmTF.
frmCC
,
parmTF);
struct
application_entity
_BOC.copyFrom
application_entity
_BO(struct
application_entity
_BO);
/*
*
Methode zum Deaktivieren aufrufen.
*/
struct
application_entity
_BOC.deactivate();
/*
* Prüfen
ob die Datenbank-Operation fehlerfrei war; dazu den Status-Code des
* BOC abfragen.
*/
switch
(struct
application_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
(struct
application_entity
_BOC.
ObjectID
==
parmTF.
struct
application_entity
_BOC_Read
.
ObjectID
)
{
/*
Ein 'leeres' BOC für die anzuzeigenden Daten erstellen. */
parmTF.
struct
application_entity
_BOC_Read
=
new
application_entity
_BOC(parmTF.
frmCC
,
parmTF);
/*
Auf das BOC zum Vergleichen kopieren. */
parmTF.
struct
application_entity
_BOC_Processed
.
copyFrom
application_entity
_BO(parmTF.
struct
application_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
"
,
struct
application_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"
,
struct
application_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"
,
struct
application_entity
_BOC
.
User_Known_Key_Variable_1
,
struct
application_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.
struct
application_entity
_BOC_Processed
.isDifferent(
parmTF.
struct
application_entity
_BOC_Read
))
{
/*
*
Variable aus dem DocumentListener ob die Daten komplett und
fehlerfrei sind und
* gespeichert werden können. */
boolean
bolSaveable
=
parmTF.
struct
application_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
.
struct
application_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
.
struct
application_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
.
struct
application_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
.
struct
application_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
.
struct
application_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
.
struct
application_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
.
struct
application_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
.
struct
application_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
.
struct
application_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
.
struct
application_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
.
struct
application_entity
_BOC_Read
.isDifferent(
frmTF
.
struct
application_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
.
struct
application_entity
_BOC_Read
.isDifferent(
frmTF
.
struct
application_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 Klassen
Am
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-Packages
package
application_package
.client;
/*
D
ieser
Name kommt mehrmals in allen drei Klassen vor.
Änderung
des Namens der Klassen
In
der Klasse für das Frame:
*/
public
class
application_task
extends
JSBS_TaskFrame
{
/*
In
der Klasse für den 'ActionHandler':
*/
public
class
application_task
__ActionHandler
{
/*
In
der Klasse für den 'DocumentListener':
*/
public
class
application_task
__DocumentListener
extends
JSBS_TaskFrame__DocumentListener
{
/*
Dieser
Name muß mit dem Namen der Klasse übereinstimmen, der beim
Eröffnen der Klasse gewählt wurde.
Durch das Ersetzen des
Platzhalters
application_task
durch
den Namen der Klasse für das Frame (z.B.
JSProjAssist_Project
)
kann in allen 3 Klassen der jeweils richtige Namen eingesetzt
werden.
Durch die gewählte Namens-Konvention in den Muster-Codes
werden dadurch auch die Referenzen auf verbundene Klassen richtig
gestellt.
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 CommandCenters
public
class
application_task
extends
JSBS_TaskFrame
{
/*
* Variable für die Referenz auf die Klasse des Start-Frame
(CommandCenter). */
protected
application
_CommandCenter
frmCC
;
/*
* Zugehöriges DocumentListener Objekt definieren. */
D
er
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 Liste
Damit
nach einem Einfügen, Ändern oder Löschen (Deaktivieren) eines
Business Object die Auswahlliste neu angezeigt werden kann, werden
die – vom Anwender zum Zeitpunkt der Abfrage in den Eingabefeldern
erfassten Auswahlkriterien - in eigenen Variablen aufgehoben.
Damit
wird erreicht, dass bei einer neuerlichen Anzeige der Auswahlliste
wieder die ursprünglich verwendeten Selektionskriterien angewendet
werden und nicht inzwischen – vielleicht unabsichtlich – erfasste
Werte.
Die
Methode zum Versorgen der Variablen mit den Werten ist im Abschnitt
Anleitung
zur Adaptierung in der Klasse für den ActionHandler > 'Aufheben'
der Werte für die Auswahlkriterien – Methode
getSelectionCriteria(...)
beschrieben.
/*
* Werte der Selektion für die Anzeige der
Auswahl-Liste.
* Diese werden gesetzt wenn die Liste
neu angezeigt wird und werden gebraucht,
* wenn die Liste
neu angezeigt werden soll aber die GUI-Elemente für die Auswahl
*
schon geändert sein können.
* Das ist der Fall, wenn ein
BO gelöscht wurde. */
protected
int
int_Selection_
VariableName_1
=
0;
protected
String
str_Selection_
VariableName_2
=
""
;
Im
Muster-Code sind für zwei gebräuchliche Java-Typen Definitionen
enthalten; es kann selbstverständlich jeder andere Java-Typ
verwendet werden
.
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. */
D
iese
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_DetailFields
In
der Basisklasse JSBS_TaskFrame
ist ein GUI-Element mit dem Namen
pnl_DetailFields
vom
Java-Typ 'JPanel' definiert.
Dieses JPanel nimmt alle GUI-Elemente
für die Detail-Information des Teil-Programms auf.
Im
Muster-Code sind bereits 'Platzhalter' für eine große Anzahl von
GUI-Elementen verschiedener Java-Typen enthalten; diese Muster müssen
entsprechend der individuellen Aufgabe des GUI-Elements adaptiert
werde
n.
/* */
/*
* ******************************
* 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
werde
n.
Die
Adaption erfolgt analog der Beschreibung im Abschnitt Aufnehmen
der GUI-Elemente in das
pnl_DetailFields
.
Festlegen
von Feldern mit verpflichtender Eingabe
Wenn
durch die Geschäftsregeln festgelegt ist, dass in Eingabefeldern
eine Eingabe unbedingt notwendig ist, dann wird das in den folgenden
Anweisungen codiert.
Mit diesen Anweisungen ist es nicht mehr
möglich, über die Konfigurationsdatei 'DisplayStrings.xml' zu
steuern ob eine Eingabe in einem Feld verpflichtend ist oder
nicht.
Eine detaillierte Beschreibung über die Möglichkeiten
finden Sie im Dokument Datei
'DisplayStrings.xml' mit sprachabhängigen Texten für die Anzeige
auf der GUI
.
/*
* Methode
mit den Initialisierungen die notwendig sind nachdem das Frame
(Window)
* angezeigt wird. */
private
void
initialize_after_frame()
{
/* Methode
zum Zuordnen des sprachabhängigen Textes zu den GUI-Elementen
aufrufen.
*/
JSBS_GUIServices.processLanguageDependantElements(this
);
/* GUI-Elemente,
bei denen eine Eingabe zwingend erforderlich ist
('Mandatory'),
* festlegen. Die Festlegung hier ist
'stärker' als eine eventuelle Prüf-Regel
* in der
Datei 'DisplayStrings.xml'.
*/
structJSBS_EntryRules
.addApplicationMandatoryGUIElement(get_
txt_SampleJTextField()
);
/* DocumentListener
konstruieren und anschließend die Methode der geerbten Klasse
* aufrufen mit der die notwendigen Listener zu den
GUI-Elementen hinzugefügt werden. */
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
.
ColumnWidthArray
0x
=
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_frame
In
dieser Methode wird für das 'ContentPane' das bereits in der
geerbten Basisklasse enthaltene
pnl_Main_With_Currency_Selection
verwendet.
Dazu
wird im Muster-Code die entsprechende Zeile auskommentiert – und
die davor stehende Zeile gelöscht oder unter 'Kommentar' gesetzt:
/*
* METHODE
mit der das Frame (Window) angezeigt wird. */
.
. . . .
* (JSBS_StartFrame)
festgelegt. *///
setContentPane(get_pnl_Main());
/*
* Wenn
in Ihrer Anwendung die Auswahl von Währungen möglich sein
soll,
* dann kommentieren Sie bitte die folgende Zeile
aus und setzen die
* Zeile oberhalb unter Kommentar.
*///
setContentPane(get_pnl_Main_With_Currency_Selection());
.
. . . .
Adaptieren
in der Methode
initialize_after_frame
In
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.struct
application_entity
_BOC_Read
.
copyFromapplication_entity
_BO(
parmTF.struct
application_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.
struct
application_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.
struct
application_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.
struct
application_entity
_BOC_Read
.
attribute1
+
"
/ "
+
parmTF.
struct
application_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.
struct
application_entity
_BOC_Set
.select
xxx
(
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.
struct
application_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.struct
application_entity
_BOC_Set
.
StatusCode
),
parmTF.struct
application_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.
struct
application_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.
struct
application_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.struct
application_entity
_BOC_Processed
.
User_Known_Key_Variable_1
,
parmTF.struct
application_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.struct
application_entity
_BOC_Processed
.
User_Known_Key_Variable_1
,
parmTF.struct
application_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.
struct
application_entity
_BOC_Processed
.
Variable_of_Type_String
.
compareTo(parmTF.str_Selection_
VariableName
)
== 0)
&&
(parmTF.struct
application_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.struct
application_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.
struct
application
_
entity
_BOC_Processed
.
DataSetID
=
0;
parmTF.
struct
application_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.
struct
application_entity
_BOC_Read
.selectNext(
parmTF.struct
application_entity
_BOC_Read
.
attribute1
,
parmTF.struct
application_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.struct
application_entity
_BOC_Read
.
StatusCode
),
parmTF.struct
application_entity
_BOC_Read
.
StatusMsg
,
parmTF.struct
application_entity
_BOC_Read
.
User_Known_Key_Variable_1
,
parmTF.struct
application_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.struct
application_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,
struct
application_entity
_BO.
attribute1
,
struct
application_entity
_BO.
attribute2
))
{
/*
*
BO erfolgreich gelesen und angezeigt. *//*
* Setzen
des Focus auf das Feld für die Eingabe des Auswahl-Codes für einen
Datensatz..
. . . . . . . . . .
.
. . . . . . . . . .
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
"
,
struct
application_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.struct
application_entity
_BOC_Processed
.
User_Known_Key_Variable_1
,
parmTF.struct
application_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üfungen
Voraussetzung
ist, dass der Abschnitt
Adaptieren
der 'Constructor'-Methoden für jedes GUI-Element
fertig
gestellt wurde.
/*
* Objekte der Klasse 'Document', die für die
Textaufbereitung bei GUI-Elementen zuständig sind.
* Diese
werden aus Performanz-Gründen im 'Constructor' aus den GUI-Elementen
herausgelesen und
* in den folgenden Variablen
gehalten. */
private
Document
doc_
txt_Sample_JTextField
;
private
Document
doc_
txt_Sample_JTextArea
;
private
Document
doc_
combo_Sample_JComboBox
;
/*
* Merker (Flags) ob die Eingaben in den GUI-Elementen
korrekt sind. */
private
boolean
bol_
txt_Sample_JTextField
_OK;
private
boolean
bol_
txt_Sample_JTextArea
_OK;
private
boolean
bol_
combo_Sample_JComboBox
_OK;
Für
jedes GUI-Element vom (Java-)Typ
JTextField
,
JTextArea
und
JComboBox
wird
eine Variable definiert, die das Document (den Teil des Objekts, der
den eingegebenen Text enthält) des jeweiligen GUI-Elementes
referenziert.
Diesen
Variablen vom Type
Document
werden
in der 'Constructor'-Methode die Referenzen auf das 'Document'
des jeweiligen GUI-Elementes zugewiesen (Details im anschliessenden
Abschnitt).
In
der Methode
anyUpdate(DocumentEvent
e)
kann
abgefragt werden, in welchem 'Document' eine Änderung des Textes
vorgenommen wurde - Details sind in einem folgenden Abschnitt
beschrieben.
Weiters
werden Variable vom Typ
boolean
zu
jedem GUI-Element mit einem 'Document' definiert. Diese werden in der
Methode
anyUpdate(DocumentEvent
e)
verändert
und zeigen an, ob die Eingabe im jeweiligen GUI-Element die
Prüf-Regeln erfüllt oder nicht.
Zuweisen
der 'Document's der GUI-Elemente auf die Variablen
In
der 'Constructor'-Methode der Klasse werden die 'Document's aus den
GUI-Elementen extrahiert und die Referenz den im vorherigen Abschnitt
definierten Variablen zugewiesen.
Grund für diesen Algorithmus
ist, dass das Extrahieren der 'Document's nur einmal beim Starten des
Task-Frames ausgeführt werden muss und in der Methode
anyUpdate(DocumentEvent
e)
sofort
verglichen werden kann, in welchem 'Document' der Text verändert
wurde.
/*
* 'Herausholen'
des jeweiligen 'Document' aus den GUI-Elementen für die Eingabe von
Werten.
* Das wird aus Performanz-Gründen einmalig im
'Constructor' durchgeführt. */
doc_
txt_Sample_JTextField
=
frmTF
.get_
txt_Sample_JTextField
().getDocument();
doc_
txt_Sample_JTextArea
=
frmTF
.get_
txt_Sample_JTextArea
().getDocument();
Für
GUI-Elemente vom (Java-)Typ
JTextField
und
JTextArea
kann
das 'Document' einfach extrahiert werden.
/*
*
Spezieller Algorithmus für JComboBoxes um das 'Document' zu
ermitteln.
* Zuerst muss die 'JTextComponent' herausgeholt
werden. */
JTextComponent
tc_
combo_Sample_JComboBox
=
(JTextComponent)
frmTF
.get_
combo_Sample_JComboBox
().getEditor().getEditorComponent();
/*
Anschliessend wird das 'Document' der 'JTextComponent' ermittelt.
*/
doc_
combo_Sample_JComboBox
= tc_
combo_Sample_JComboBox
.getDocument();
Für
ein GUI-Element vom (Java-)Typ
JComboBox
muss
zuerst die
JTextComponent
der
JComboBox
ermittelt
werden.
Anschliessend das 'Document' aus der
JTextComponent
extrahiert.
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
.
struct
application_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
.
struct
application_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
.
struct
application_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
.
struct
application_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
.
struct
application_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
.
struct
application_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
.
struct
application_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
.
struct
application_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-Code
In
diesem Teil wird Muster-Code vorgestellt, der nicht in jeder der in
diesem Dokument beschriebenen Klassen vorkommen wird und deswegen
nicht in den Muster-Code der Klasse aufgenommen wurde.
Übernehmen
von Werten aus den Parameter-Feldern des CommandCenter
Wenn
bereits im CommandCenter (Start-Frame) die Eingabe von
Parameter-Werten für die Einschränkung der Anzeige in der
Auswahlliste möglich ist, dann können die Parameter-Werte auf
verschiedene Arten verarbeitet werden.
Je nach Anforderung des zu
bearbeitenden Geschäftsfalls müssen eventuell auch verschiedene
Arten der Verarbeitung kombiniert werden.
Übernehmen
in Eingabefeld oder Combobox
Füllen
der Liste wenn dies durch eine Schaltfläche ausgelöst
wird
Anzeigen
der Daten wenn in der Liste nur ein Datensatz vorhanden ist
Anzeigen
der Daten für den im CommandCenter eingegebenen Wert
Anzeigen
der Daten für den im CommandCenter eingegebenen Wert – mit
Ähnlichkeitsvergleich
Ü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
wird
Voraussetzung
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 ist
Dieser
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.
struct
application_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 Wert
Dieser
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.
struct
application_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.
struct
application_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
Ähnlichkeitsvergleich
Dieser
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.
struct
application_entity
_BOC_Set
.
vecRecordSet
.size();
int
intVectorIndex;
application_entity
_BO
loc
application_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.struct
application_entity
_BOC_Set
.
vecRecordSet
.elementAt(intVectorIndex);
/*
Vergleichen, ob eine komplette Übereinstimmung vorliegt.
*/
if
(loc
application_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
(loc
application_entity
_BO.
attribute
.startsWith(strParameterToCompare))
{
/*
Ermitteln, wie viele Zeichen nach dem übereinstimmenden Teil noch
vorhanden sind. */
int
intRemainingChars
= loc
application_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. |