[Java] dynamisch veranderen member

Pagina: 1
Acties:

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
een klein java vraagje:

Java:
1
2
3
4
5
6
7
8
9
public class myClass
{
   private JTabbedPane mPane = null; //weet niet of Java automatish 'nulled'

   public myClass()
   {
      addRegisterAbleObject("myPane", mPane, JTabbedPane.class);
   }
}


het gaat als volgt die addRegisterAbleObject maakt een HashMap van objecten waarvan de '"key" == "myPane". het Object op die key is een miniobject die
bijhoudt , mPane en de classe van mPane (as expected)...

nu kan er ergens in verdere code een object geregistreerd worden (eg: een XML file die beschrijfd hoe mPane eruit ziet enzo) ... een UI builder zal dus een JTabbedPane creeren en deze doorgeven aan een myClass instance, samen met de key string die ook in de XML staat eg:

code:
1
2
3
4
5
<ui>
    <uiElement type="myClass" registrable="true">  
       <uiElement register-as="myPane" type="JTabbedPane" />
    </uiElement>
</ui>


zodoende bouwd de builder een JTabbedPane op met key die nu geregistreerd moet worden bij myClass...

nu zoekt myClass in zijn HashMap naar "myPane" en vindt een hit, maar nu zit ik
met een probleem. Hij weet dat de beide objecten van het juiste type zijn en nu moet hij dus een mPane = autoGenerateUIObject doen... maar ik mPane doorgeef als NULL kan dat dus niet.

nu weet ik niet goed hoe in Java ik nu moet zeggen dat hij de mPane member van mijn instance moet 'assignen' aan de generated. Het probleem kom dus neer op het doorgeven van het adress van een member variable en die ergens anders (wel indezelfde class) te assignen. vroeger maakte ik gewoon een method in myClass...

Java:
1
2
3
4
public boolean onRegister(JComponent aComponent, String aName)
{
   if (aName.equals("myPane")) mPane = (JTabbedPane)aComponent;
}


maar als ik grotere UI wil maken vindt ik dat een nuisance en wou ik het graag
wat eenvoudiger maken. bij C++ deed ik dit al een tijdje (pointers - woohoo! :) maar in Java zit ik vast... Zoals je ziet wil ik geen regel van Swing UI design in
mijn code zien.

Verwijderd

hmm ik heb je verhaal nog niet helemaal gelezen, maar wist je dat in java alle objecten (dus daar vallen ook arrays onder) als pointer worden doorgegeven?

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
yep vandaar mijn vraag of je die mPane (null) wel kunt doorgeven en daarna veranderen (dus vanuit die functie). Als ik een mPane = new JTabbedPane(); moet doen in mijn construction is dat weer extra overhead en zelfs dan ben ik niet zeker of de approach werkt..

Verwijderd

Pointers werken net even anders. Even kort door de bocht: Je geeft dus niet een variabele door, maar de inhoud van die variabele.

beschouw het volgende
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Vector a = new Vector().add("blaat");
Vector b = new Vector().add("blaat2");

public void c (Vector v){
 v.add("blaat3");
}
public void d (Vector v){
 v = new Vector("blaat4");
 v.add("blaat4");
}

c(a);
d(b);

c.size() // == 2
d.size() // == 1

[ Voor 55% gewijzigd door Verwijderd op 27-02-2003 16:11 ]


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
je bedoelt vast : a.size() and b.size() ? if so dan geeft ie de variable door en niet de variables... ??? dus met void d() wordt de originele (b) veranderd... maw das is dus een reference.. helaas kun je niet null = new .... het verschil is dat bij jouw code in c een modify doe (dat snap ik wel) maar in d wordt v redefined. dan neem ik aan dat java gewoon v als een temp aanziet maar de originele (b) gewoon hetzelfde laat? ik ga effe jou code c/p ;).

effe gedaan (mits wat edits) en zoals ik dacht laat de d gewoon b zoals ie is. bestaat er dan methode om dit te doen (zonder reflectie als het even kan ;)?

[ Voor 15% gewijzigd door hobbit_be op 27-02-2003 16:29 ]


Verwijderd

nou zoals je ziet werkt wrappen wel... vandaar dat ik het voorbeeld van een vector heb genomen.

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
dus het enige dat ik kan doen is via reflectie en dan 'this' als parameter doorgeven en dan "mPane" eruit halen? Java is toch niet volledig op zijn pootjes vind ik dan... (zal vast wel een of ander design principe achter zitten :) ).

Verwijderd

Ik zeg toch net gewoon wrappen, dan hoef je niet middels reflectie te werken. Dus geef bv een Vector door waar je mPane object in zit. Als je in de reciever dan op dat object opereert zul je zien dat het hetzelfde object is als van die in sender

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Misschien dat ik je vraag niet helemaal goed begrijp maar:
ipv:
code:
1
2
3
4
public boolean onRegister(JComponent aComponent, String aName) 
{ 
   if (aName.equals("myPane")) mPane = (JTabbedPane)aComponent; 
}


Kun je toch ook:
code:
1
2
3
4
 public boolean onRegister(JComponent aComponent, String aName) 
{ 
   myHashMap.get(aName) = aComponent; 
}


Doen? En dan heb je toch wat je wilt bereiken? Of heb ik het nu fout?
private JTabbedPane mPane = null; //weet niet of Java automatish 'nulled'
Java "nulled" automatisch

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
wasigh:
sorry voor de nogal onduidelijk vraagstelling :)

jouw onregister zal vast wel werken zolang als de mPane die ik erin heb gegooid niet NULL is.

ik ga alvast =null overal weghalen dan :)

markvleth:
dus iets in de aard van:

Java:
1
2
3
4
5
6
7
8
   mVector = new Vector();
   mVector.add(mPane); //laten we dan alvast stellen dat mPane!=null is 
   //dan een setRegister(tVector) 

   void onRegister(aObject) //zonder key effe 
   {
      mVector.get(0) = aObject; 
   }


ga ik effe testen...

niks ervan hoor die wrap (zoals ik dacht gaat niet de originele 'overschrijven' . en
een mVector.get(0) = aObject; geeft compile fouten...

zucht.

in c++

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class myClass
{
   Object* mObject; 

   myClass()
   {
      register(&mObject); //store adress of Pointer!!! ie pointer 
   }
};

void register(Object** aRefObject)
{
   static Object** storedObject = aRefObject;
}

void onRegister(Object* aNewObject)
{
   *storedObject = aNewObject... ///overwrite original mObject
}


en nu blijkt dat het zelfs met reflection niet gaat omdat het field (member) dan public moet staan... brilliant - maar te begrijpen van een security standpunt... wat wel kan is natuurlijk ipv mPane te werken is na het registration een

a) mPane = mRegistredObjects("pane"); te doen

of :

b) mUIElements("pane").doIt(); //maar iedere request = cast :)

ik zal bij a blijven denk ik...

[ Voor 51% gewijzigd door hobbit_be op 27-02-2003 18:15 ]

Pagina: 1