PDA

Visualizza la versione completa : [JAVA] Menu dianmico....


CrashOverride
12-01-2005, 13:55
ciao a tutti,

devo creare una specie di menu dianmico che legge gli elementi da un file di testo.
Creo il menu e fin qui tutto bene, faccio un ciclo for circa cos :



int N = .... /* Numero di elementi */
JMenu Menu = new JMenu("XXX");
for(int i = 0 ; i < N ; i++){
Menu.add(new JMenuItem(testo letto del file));
}


ora dovrei aggiungere degli ActionListener per segure dei comandi diversi a seconda dell item selezionato. Come faccio ??

:dh:

anx721
12-01-2005, 14:16
Allora, suppongo che il testo che leggi dal file e che identifica un menu sia suffficiente anche per sapere il tipo di azione da svolgere; un modo di procedere puo essere allora quello di costruire un'istanza di AbstractAction che rappresenta l'azione da eseguire quando si esegue il menu; l'item del menu quindi puo essere costruito passandogli direttamente l'AstracAction che una classe che implementa ActionListener; esempio:



int N = .... /* Numero di elementi */
JMenu Menu = new JMenu("XXX");
for(int i = 0 ; i < N ; i++){
String = testo letto del file;
Action action = null;
if(testo letto del file == "New"){
//Costruisco una Action per il menu item
action = new AbstractAction("New", new ImageIcon("New16.gif")) {
public void actionPerformed(ActionEvent e){
//Codice da eseguire quando viene selezionato il menu;
}
};

}
//il menu item viene costruito sulla action, che sara registrata
//come listener del menu item
Menu.add(new JMenuItem(action));
}


Il costruttore di AbstractAction prende la stringa da visualizzare nel menu item, e un'icona (credo sia opzionale) da visualizzare accanto alla voce di menu. Quello che si fa in quel codice costruire un'istanza di una classe anonima che estende AbstractAction, e ne implementa il metodo actionPerformed, che astratto in AstracAction.

CrashOverride
12-01-2005, 14:39
Grazie mille !! :ciauz:

CrashOverride
12-01-2005, 14:55
...non mi torna ancora una cosa...

cosa metto sotto

//Codice da eseguire quando viene selezionato il menu;

voglio dire, nel file di testo c' il testo da visualizzare e un nome di un file da caricare, devo associare il nome file del menu selezionato ad una variabile String.
ho fatto una cosa del genere :


String F

public void actionPerformed(ActionEvent e){
//Codice da eseguire quando viene selezionato il menu;
F = Classemia.getFilesNames(i);
}


ma non funziona.. :bh:

anx721
12-01-2005, 15:39
o dichiari F nel metodo actionperformed oppure deve essere un campo della classe all'interno della quale istanzi i menu, altrimenti non e visibile all'interno della classe interna.

CrashOverride
12-01-2005, 16:26
si, scusa in effetti l'ho dichiarata come campo della classe principale... ma non funziona :

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2

quindi ho provato a usare come indice i-1, e anche in questo caso non funziona, infatti mi restituisce dempre l'ultimo elemento del men anche se io seleziono il primo.

HELP !!! :dh:

anx721
12-01-2005, 17:12
l'errore non dipende dal codice che ho scitto io, ma da un accesso sbagliato che fai te nel codice; un errore di runtime; controlla gli indici di eventuali vettori ed array, se no posta il codice

CrashOverride
12-01-2005, 17:23
forse ho trovato l'errore... dipende dal fatto che quando chiamo il metodo ActionPerformed con il codice



public void actionPerformed(ActionEvent e){
//Codice da eseguire quando viene selezionato il menu;
F = Classemia.getFilesNames(i);
}


l'indice i sempre al valore dell'ultimo elemento (ad esempio con 2 elementi l'indice i a 2) perch lo chiamo dopo aver finito il ciclo for.

dovrei trovare il modo di avere un indice corrispondente alla voce di menu selezionata da passare alla al metodo getFilesNames della classe classemia.

Mi servirebbe qualcosa come il metodo getSelectedItemIndex delle Choice...ma non credo esista.

in sostanza devo passare a
F = Classemia.getFilesNames(i) un indice del menu selezionato.

CrashOverride
12-01-2005, 17:39
forse ho trovato un trucchetto non molto ortodosso ma....funziona.

il nome del file per me diventa il codice hash della classe ActionPerformed cos posso fare come segue :



File = ""+this.hashCode();


non il massimo ma come dicevo funziona...resto comunque in attesa di idee migliori.

CrashOverride
12-01-2005, 17:48
emm...no, in sealt non funziona, anche perch il codica hash cambia sempre....

Aiuto !!!! :dh:

Loading