Toon posts:

[java]@design time velden toevoegen aan een klasse

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Voor een project ben ik bezig met de syncronisatie tussen een xml bestand waarin de UI gedefinieerd staat en de controller (een java bestand). Van elk element, dat beschreven staat in de Xml, wordt een instantie van gecreëerd en toegekend aan de overeenkomstige variable (op basis van attribute "id") in de controller.

voorbeeld:

xml:
XML:
1
<textfield id="txtA"/>


controller
Java:
1
public JTextField txtA


De bestaande code zorgt er al voor dat het geheugenadres van het object, gedefinieerd in xml, gekopieerd wordt naar txtA. Het resultaat is dat we in ons java bestand aan de velden kunnen.

Probleem is dus dat de gebruiker (net zoals in asp.net) als zijn velden in zijn java bestanden moeten definieren. Eigenlijk wordt er zowel definitie gedaan in xml (ui) als in java (controller). Nu is dit dubbel werk.

In theorie is het mogelijk add runtime de velden toe te voegen aan de java classe! Het probleem is hierbij dat dit praktisch niet werkbaar is want je verliest je "intelli sense": tijdens het developpen kent hij die velden niet: tijdens het compilen OOK niet: dit gaat dus gewoon niet.

Zou iemand mij hier op weg kunnen helpen?

(in XAML van .net gaat het mogelijk zijn, MET intellisense)

Verwijderd

At runtime velden toevoegen gaat natuurlijk prima, maar tijdens het ontwikkelen eigenschappen van velden benaderen die je niet gedefineerd hebt lijkt mij een onmogelijkheid.

Wat je wel kan doen is een pool van objecten creeren, hier at runtime de velden instoppen en at designtime de objecten met typecasts benaderen. Dan moet je er echter wel voor zorgen dat je controleert of het object ook daadwerkelijk van het juiste type is maar kun je wel met intellisense werken en willekeurige XML files gebruiken.

  • flowerp
  • Registratie: September 2003
  • Laatst online: 04-02 02:01
Is het in dit geval niet makkelijker om met hashtables te werken waarin je dynamisch de nieuwe velden stopt?

Nadat je het veld uit de hashtable hebt gehaald en de juiste cast hebt gedaan staat gewoon alle name completion / content assist / intelli-sense tot je beschikking.

Eventueel kun je verschillende specialized generic-hashtables aanmaken, 1 voor elke type dat je toestaat in je XML file. (een specialized generic-hashtable is een instantie van een Java 5 generics hashtable voor een bepaald type: de compiler voegt dan automatisch de juiste casts voor je toe in bytecode).

It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.


  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Ik zie twee mogelijkheden, runtime of compiletime velden toevoegen.

De reacties hierboven geven voorbeelden van het at-runtime toevoegen, en daar heb ik verder niks aan toe te voegen.

At compile-time velden toevoegen kan ook, maar dan zou je een code-generator moeten schrijven die je xml-file uitleest en de relevante stukken (source)code toevoegd. Het heeft als voordeel dat alles compile-time al wordt gechecked, en dus minder foutgevoelig is.

Voorbeelden van bekende code-generators zijn bijvoorbeeld de Microsoft IDL compiler (midl) en de java RMI compiler (rmic) die proxy- en stub-code genereert om method-calls over een socketverbinding te sturen.

Verwijderd

Topicstarter
at runtim time toevoegen krijg je dan zoiets:
Java:
1
2
3
4
//definitie
Hashmap<String,JTextField> textfields = new HashMap<String,JTextField();
//gebruik
textfields.get("txtNaam").setText("aaap");

Voor bovenstaande aanpak moet ik bijna niets aan de bestaande code wijzigen: ipv referentie toe te kennen, voeg ik gewoon element toe aan de juist hashmap.


at compile time toevoegen
Java:
1
txtNaam.setText(); (zonder definitie)

MAAR geen intelli sense
IntelliJ moet voor intelli sense dat toch ook compilen of niet? kan je het dan zo niet aan de praat krijgen?

at compile time toevoegen is technisch een beetje moeilijker. Ik heb even gedacht om soort van "eigen" compiler te maken waaraan je dan twee parameters moet meegeven: je java file en je xml file. De java file wordt dan uitgebreid met "echte" velden zodat hij door de java compiler kan worden gecompileerd.

Ik denk dat er toch nog een betere oplossing zou moeten bestaan. Als je je IDE nu zegt dat hij jouw compiler zou moeten gebruiken (met paar extra features in: xml binden met java file), dan zou hij dat ook voor de intelli sense moeten doen?

Ik ben weer zwaar aan't dromen maar ik denk dat ik bij dit probleem eventjes buiten de standaard java grensen moet kijken!

Kan iemand mij nog goede tips geven.

[ Voor 63% gewijzigd door Verwijderd op 06-12-2004 19:13 ]


  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
Waarom genereer je niet de xml bestanden op basis van de javacode?

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 10-05 16:41

Nick_S

++?????++ Out of Cheese Error

Dit is precies waar een project, waar ik nu aan werk, mee bezig is. Wij genereren op basis van XML een java - file, die de userinterface beschrijft. Je codebehind extend deze klasse en kan dus de events afvangen, die je gespecificieerd hebt in je XML file.

Onze website is nog niet je van het, maar wil je een werkend voorbeeld zien, laat het dan even weten!

Voor broncode etc. zie http://www.sourceforge.net/projects/atlantissoft

[edit]

Ik heb even ons framework neergezet met een werkende applicatie, voor het transformeren van xml bestanden met xsl bestanden.

Het framework is binnen te halen vanaf: XADF. Uitvoeren met bin/run.bat en daarna bestand -> openen... applications/TransformationValidator.deploy.

[edit2]
Ik hoor net van een collega, dat de batch file verwijst naar het bestand c:/appl/xadf/applications/cleito.deploy. Mocht je de XADF directory dus ergens anders uitpakken, moet je de run.bat even aanpassen naar deze nieuwe directory.

[edit3]
Na het topic nog even goed doorgekeken te hebben, lijkt mijn bericht best op spam. Om toch nog even de overeenkomst met het probleem van de TS te geven, hier een stukje XML wat we gebruiken om Java te genereren:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
<?xml version="1.0" encoding="UTF-8"?>
<guiml version="1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.atlantissoftware.org/schemas/guiml.xsd">

    <view>
        <complexwidget id="canvas" type="Canvas">
            <properties>
                <property name="size">
                    <param>875</param>
                    <param>365</param>
                </property>
                <property name="layout">
                    <param>null</param>
                </property>
            </properties>
                <complexwidget id="selectactionscanvas" type="Canvas">
                    <properties>
                        <property name="layout">
                            <param>null</param>
                        </property>
                        <property name="size">
                            <param>875</param>
                            <param>365</param>
                        </property>
                    </properties>
                    <widget id="selectactionlabel" type="Label">
                        <properties>
                            <property name="font">
                                <param type="Font">
                                    <param>"Dialog"</param>
                                    <param>Font.PLAIN</param>
                                    <param>30</param>
                                </param>
                            </property>
                            <property name="text">
                                <param>"Step 1 of 3: Select Actions"</param>
                            </property>
                            <property name="size">
                                <param>400</param>
                                <param>40</param>
                            </property>
                        </properties>
                    </widget>
                    <widget id="inputschemacheckbox" type="CheckBox">
                        <properties>
                            <property name="text">
                                <param>"Use input validation"</param>
                            </property>
                            <property name="bounds">
                                <param>40</param>
                                <param>40</param>
                                <param>875</param>
                                <param>40</param>
                            </property>
                        </properties>
                    </widget>
                    <widget id="inputschemalabel" type="Label">
                        <properties>
                            <property name="text">
                                <param>"Before transformation schema:"</param>
                            </property>
                            <property name="bounds">
                                <param>20</param>
                                <param>80</param>
                                <param>200</param>
                                <param>25</param>
                            </property>
                        </properties>
                    </widget>
                    <widget id="inputschemacomplextextfield" type="FileChooserComplexTextField">
                        <properties>
                            <property name="text">
                                <param>"file:c:\\testvalidator\\BGNFAC.xsd"</param>
                            </property>
                            <property name="buttontext">
                                <param>"Browse"</param>
                            </property>
                            <property name="enabled">
                                <param>false</param>
                            </property>
                            <property name="bounds">
                                <param>220</param>
                                <param>80</param>
                                <param>600</param>
                                <param>25</param>
                            </property>
                        </properties>
                    </widget>
                    <widget id="transformationcheckbox" type="CheckBox">
                        <properties>
                            <property name="text">
                                <param>"Use transformation"</param>
                            </property>
                            <property name="bounds">
                                <param>40</param>
                                <param>120</param>
                                <param>875</param>
                                <param>40</param>
                            </property>
                        </properties>
                    </widget>
                    <widget id="transformationlabel" type="Label">
                        <properties>
                            <property name="text">
                                <param>"Stylesheet:"</param>
                            </property>
                            <property name="bounds">
                                <param>20</param>
                                <param>160</param>
                                <param>200</param>
                                <param>25</param>
                            </property>                     
                        </properties>
                    </widget>
                    <widget id="transformationcomplextextfield" type="FileChooserComplexTextField">
                        <properties>
                            <property name="text">
                                <param>"file:c:\\testvalidator\\XML2PDF.xsl"</param>
                            </property>
                            <property name="buttontext">
                                <param>"Browse"</param>
                            </property>
                            <property name="enabled">
                                <param>false</param>
                            </property>
                            <property name="bounds">
                                <param>220</param>
                                <param>160</param>
                                <param>600</param>
                                <param>25</param>
                            </property>
                        </properties>
                    </widget>
                    <widget id="outputschemacheckbox" type="CheckBox">
                        <properties>
                            <property name="text">
                                <param>"Use output validation"</param>
                            </property>
                            <property name="bounds">
                                <param>40</param>
                                <param>200</param>
                                <param>875</param>
                                <param>40</param>
                            </property>
                        </properties>
                    </widget>
                    <widget id="outputschemalabel" type="Label">
                        <properties>
                            <property name="text">
                                <param>"After transformation schema:"</param>
                            </property>
                            <property name="bounds">
                                <param>20</param>
                                <param>240</param>
                                <param>200</param>
                                <param>25</param>
                            </property>                     
                        </properties>
                    </widget>
                    <widget id="outputschemacomplextextfield" type="FileChooserComplexTextField">
                        <properties>
                            <property name="text">
                                <param>"file://c:/testout.xsd"</param>
                            </property>
                            <property name="buttontext">
                                <param>"Browse"</param>
                            </property>
                            <property name="enabled">
                                <param>false</param>
                            </property>
                            <property name="bounds">
                                <param>220</param>
                                <param>240</param>
                                <param>600</param>
                                <param>25</param>
                            </property>
                        </properties>
                    </widget>
                </complexwidget>
        </complexwidget>
    </view>
    <controller>
        <component component-ref="inputschemacheckbox">
            <action id="action5" codebehind-method="onSelectAction" event-type="COMPONENT_SELECTED"/>
            <action id="action6" codebehind-method="enableCTFInputSchema" event-type="COMPONENT_SELECTED"/>
        </component>
        <component component-ref="transformationcheckbox">
            <action id="action7" codebehind-method="onSelectAction" event-type="COMPONENT_SELECTED"/>
            <action id="action8" codebehind-method="enableCTFStylesheet" event-type="COMPONENT_SELECTED"/>
        </component>
        <component component-ref="outputschemacheckbox">
            <action id="action9" codebehind-method="onSelectAction" event-type="COMPONENT_SELECTED"/>
            <action id="action10" codebehind-method="enableCTFOutputSchema" event-type="COMPONENT_SELECTED"/>
        </component>
    </controller>
    <model/>
</guiml>


Hierachter kun je dan een andere java file hangen, die je code behind bevat. In dit geval dus de methodes, die je gedefinieerd hebt als acties op de verschillende componenten.

[ Voor 120% gewijzigd door Nick_S op 07-12-2004 09:50 ]

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Verwijderd

Topicstarter
dank je voor de uitgebreide informatie.

Maar de aanpak van jullie project is ook helamaal anders. Vanuit de xml file wordt de .java file gemaakt.
Bij ons is het zo dat de xml at runtime wordt geparsed bij het opstarten van de applicatie.

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 10-05 16:41

Nick_S

++?????++ Out of Cheese Error

Inderdaad, onze engine zal de eerste keer dat een applicatie gestart wordt, of als er een update op de webserver beschikbaar is, de GUIML parsen naar een java file (Door middel van xsl transformatie) en deze, samen met de code behind compileren.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Verwijderd

Waarom gebruik je niet gewoon SwiXML?

Wat je wilt kan wel met reflection, maar het is vrij veel werk om dat allemaal zelf te gaan schrijven.
Echter die "Intelli Sense" gaat niet werken daarmee nee, maar als je je XML-file openhoudt in je IDE lijkt me dat niet zo'n ramp, toch?
Pagina: 1