Avatar billede faceorbit Nybegynder
02. august 2001 - 15:26 Der 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
}

er der nogle gode ideer?

Avatar billede disky Nybegynder
02. august 2001 - 15:29 #1
Hvorfor ikke bare nøjes med at caste til JComponent, den er jo en Super klasse til f.eks. JLabel, JTextField osv.

Forresten hvis du ikke absolut har brug for multitrådnings brug af din vector brug ArrayList istedet, den er ikke syncronized og derfor hurtigere.
Avatar billede delbing Nybegynder
02. august 2001 - 15:39 #2
nok fordi JComponent ikke har nogen setText() metode
Avatar billede disky Nybegynder
02. august 2001 - 15:43 #3
delbing: nå ja, jeg vendte det lige på hovedet :)

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
Avatar billede faceorbit Nybegynder
02. august 2001 - 15:50 #4
Jeg bruger tråde :)
JComponent implementerer ikke
setText();
Avatar billede delbing Nybegynder
02. august 2001 - 16:03 #5
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) {}
Avatar billede faceorbit Nybegynder
02. august 2001 - 17:32 #6
nu ser koden sådan ud:

try {
    Class[] argString = { Class.forName(\"java.lang.String\") };
    Class componentClass;
    Object[] arguments = {\"gotcha\"};
    Method setText;
    JComponent jc;

    Iterator i = fields.iterator();
    while (i.hasNext()) {
        jc = (JComponent) i.next();
        componentClass = jc.getClass();
        setText = componentClass.getMethod(\"setText\",argString);
        setText.invoke(jc, arguments);
    }
} catch (Exception e) {e.printStackTrace();}
}

og det virker, så points til delbing.

Hvis der er andre forslag, så slå på tråden!
Der kunne være point\'s i det.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester