02. august 2001 - 15:26Der er
5 kommentarer og 1 løsning
Dynamisk casts
private Vector fields = new Vector();
public addComponent(JComponent jc) { fields.add(jc); }
senere i koden tager jeg fat i feltet...
public void testBinding(Vector fields) { Iterator i = fields.iterator(); JComponent jc; while (i.hasNext()) { jc = (JComponent) i.next(); if (jc instanceof JTextField) ((JTextField) jc).setText(\"gotcha\"); else if (jc instanceof JLabel) { String s = \"gotcha\"; ((javax.swing.JLabel) jc).setText(s); }
Da der jo er en del JComponents at test ville jeg meget meget hellere lave et dynamisk cast hvis det overhovedet er muligt. Min bedste ide er:
public void testBinding(Vector fields) { Iterator i = fields.iterator(); JComponent jc; Class c; while (i.hasNext()) { jc = (JComponent) i.next(); c = Class.forName(jc.getClass().getName()); ((c) jc).setText(s); // det må man ikke }
faceorbit: Du kan også gemme objectet sammen med dens navn i et nyt object som du gemmer i din vector. Så ved det du henter fra vectoren selv hvad det skal castes til
Jeg er ikke så stærk i reflection (java.lang.reflect), men hvad med noget i stil med det her:
// Vi skal bruge et array med de argumenter der bruges i den metode vi leder efter Class[] stringClass = { Class.forName(\"String\") };
// få klassen på det object vi kigger på Class c = jc.getClass(); Method setText;
// de argumenter vi vil give til setText Object[] arguments = { \"gotcha\" }; try { // prøv at finde metoden, ellers smides exception setText = c.getMethod(\"setText\", stringClass); // kald den setText.invoke(jc, arguments); } catch (Exception ignored) {}
Hvis der er andre forslag, så slå på tråden! Der kunne være point\'s i det.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.