Vinnaren i pepparkakshustävlingen!
2016-09-21, 22:04
  #1
Medlem
Tillbaks här igen, försöker skapa ett object för alternativ till en meny men lyckas inte riktigt begripa hur man kan skicka in en metod och sedan lagra den. Har försökt följa detta utan framgång. http://stackoverflow.com/questions/8...-a-java-thread

Kod:
import java.lang.reflect.Method;

public class Option {
    private final String label;
    private final String className;
    private final String methodName;
    
    public Option(String label_, String className_, String methodName_) {
        this.label = label_;
        this.className = className_;
        this.methodName = methodName_;
        if (className_ == "" || methodName_ == "" ) {
            this.hasMethod = false;
        } 
        else {
            this.hasMethod = true;
            this.className = className_;
            this.methodName = methodName_;
        }
    }
        
    public void execute() throws ClassNotFoundException, InstantiationException, NoSuchMethodException, IllegalAccessException {
            Class<?= Class.forName(this.className);     // covert string classname to class
            
Object o c.newInstance();
            
Method m c.getClass().getMethod(this.methodNameVoid.class);
            
m.invoke(ovoid);  // Denna del kompilerar inte ens
    

}

public class 
MenuTest {

    public static 
void main(String[] args) { 
        
// Skapa en option och på nått sätt skapa en ny metod i Option som är en kopia av someMethod

     // invoka den skapade metoden via objektet option.
    
}
    private 
void someMethod() {
         
System.out.println("I was succesfully sent!");
    }
Citera
2016-09-21, 22:13
  #2
Medlem
Är helt lost, vad vill du ens uppnå?
Citera
2016-09-21, 22:23
  #3
Medlem
Jag vill skapa en dynamisk meny, så på nått sätt vill jag spara metoden i en array, eller i detta fall objektet Option.

Tänk dig att du har ett dialogfönster, detta fönstrer har ett antal alternativ, varje alternativ har en ettiket (label) samt ett metodsanrop för när man trycker på det.


Så jag skulle då vilja spara metodsanropet i objektet Option så där man jämför vilket alternativ som valdes så kör man bara dess respektive metod ("Option.execute()").

I koden ovan skulle då ett alternativ anropa metoden someMethod.
__________________
Senast redigerad av tago 2016-09-21 kl. 22:26.
Citera
2016-09-21, 22:29
  #4
Medlem
Citat:
Ursprungligen postat av tago
Jag vill skapa en dynamisk meny, så på nått sätt vill jag spara metoden i en array, eller i detta fall objektet Option.

Tänk dig att du har ett dialogfönster, detta fönstret har ett antal alternativ, dessa har en ettiket (label) samt ett metodsanrop för när man trycker på det.


Så jag skulle då vilja spara metodsanropet i objektet Option så där man jämför vilket alternativ som valdes så kör man bara dess respektive metod.

I koden ovan skulle då ett alternativ anropa metoden someMethod.

Okej det blev något klarare nu. Jag föreslår att du antingen gör det du vill inne i "execute" metoden och kallar på den utifrån eller så får du väl köra en switch på en getLabel() metod så att du kan avgöra vad det är för "option" du tryckt på och sedan agera på det?
Citera
2016-09-21, 22:37
  #5
Medlem
Citat:
Ursprungligen postat av negerbarnet
Okej det blev något klarare nu. Jag föreslår att du antingen gör det du vill inne i "execute" metoden och kallar på den utifrån eller så får du väl köra en switch på en getLabel() metod så att du kan avgöra vad det är för "option" du tryckt på och sedan agera på det?

Jo men säg att du har en meny i en meny i en meny eller bara flera i följd då blir det jobbigt att följa, jag vill liksom slippa koda varje steg i processen utan bara skapa rubriker och metoder kopplade till dessa alternativ.

Ska prova detta.


Det funkar!
__________________
Senast redigerad av tago 2016-09-21 kl. 22:41.
Citera
2016-09-21, 22:48
  #6
Medlem
Vettefan hur det fungerar riktigt i Java, men testa att kolla upp Callable. (I C# kan man använda sig utan Func och Action)

https://docs.oracle.com/javase/7/doc.../Callable.html

Du kan således lägga in metorderna i en dictionary och sedan vid click plocka ut just den metoden du vill ha med nån parameter och köra den. Lite mindre overhead, slippa skapa klass o sedan method, osv osv.
Dock behöver du ju ha tillgång till grejerna när du skapar dictionaryn.

*edit* i c# e det bara o binda och köra commands. Betydligt enklare.
Citera
2016-09-21, 22:51
  #7
Medlem
Citat:
Ursprungligen postat av tago
Tillbaks här igen, försöker skapa ett object för alternativ till en meny men lyckas inte riktigt begripa hur man kan skicka in en metod och sedan lagra den.

Jag tycker du ska skippa reflection i det här fallet. Det är mycket snyggare att använda interface istället.

Kod:
    public interface OptionCmd {
        public void execute();
    };

    public class Option {
        private final String label;
        private final OptionCmd cmd;

        public Option(String label_, OptionCmd cmd_) {
            this.label = label_;
            this.cmd = cmd_;
        }
        
        public void execute() {
            this.cmd.execute();
        } 
    };

Kommandot kan du skapa som en instans av en anonym klass (eller så kan du implementera interfacet i en namngiven klass på vanligt sätt).

Anonymt gör du så här:

new OptionCmd(){
public void execute() { xxxx;}
});

Tillägg: Callable som en annan person nämnde kanske är ett bättre alternativ.
Citera
2016-09-21, 23:48
  #8
Medlem
.
__________________
Senast redigerad av tago 2016-09-21 kl. 23:55.
Citera
2016-09-22, 00:11
  #9
Medlem
Xer0s avatar
Det känns lite som overenginering. Nästan allt som folk gör med refelection är dåligt för att reflection används för att få dåligt uttänkta lösningar att fungera.

Jag skulle använda ObserverPattern.
https://en.wikipedia.org/wiki/Observer_pattern

Varje MenuButton implementerar Observable och gör notify(this) på alla observers, Eventuellt gör man notify(new ClickEvent(this)), då kan man ha flera eventtyper.

Det blir enkelt möjligt att registrera flera observers på samma knapp om man vill.
__________________
Senast redigerad av Xer0 2016-09-22 kl. 00:16.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback