Newsgroup: it.comp.java
Titolo: Problemi elementari

Sto cercando di imparare ad usare Java da un po' di tempo dopo avere fatto
un corso molto elementare su questo linguaggio. Cercando appunto di
migliorare un pochino le mie conoscenze sto cercando di fare dei programmini
personali abbastanza elementari, e nonostante ciò incorro in problemi e
dubbi di difficile risoluzione per me, li sottopongo nella speranza che
qualcuno voglia venire in contro alle mie vanità di autodidatta.
1° dubbio:        mi è stato consigliato di creare una classe per JMenuBar
fuori dalla classe del frame perché se il programma crescerà potrei trovare
più semplice avere le due cose staccate. Così ho preso i metodi con i quali
creavo la JMenuBar nel frame (funzionanti) e li ho messi in una nuova classe
che estendesse JMenuBar, ma quando poi la istanziavo nel frame la nuova
classe non veniva mai creata la menubar. setJMenuBar() funziona solo con
JMenuBar e non con una classe che la estende? Perché?
1° problema:    ho poi risolto il problema precedente creando una classe che
contenesse soltanto i metodi necessari per creare una menubar completa, così
scrivendo, per esempio, JMenuBar br = creaMB (String voci [][] ); la menubar
veniva creata. Ma ho ancora un problema: dentro una tale classe implemento
ActionListener ma poi, quando aggiungo l'ascoltatore ai vari JMenuItem, non
so che parametro passare visto che this non va bene. Come posso creare
quindi una classe che oltre a creare una JMenuBar valida aggiunga anche ad
ogni JMenuItem un ascoltatore?
Vi ringrazio in anticipo dell'aiuto, Grazie

Devi implementare una classe a parte che implementa ActionListener, nella
quale implementi il metodo actionPerformed, inserendo le istruzione che vuoi
che siano compiute alla selezione di quella voce di menù.
Oppure fai implementare alla tua classe che estende JMenuBar l'interfaccia
ActionListener ed gli e crei in questa classe il tuo metodo
actionPerformed(ActionEvent ae).
Se non sono stato abbastanza chiaro dimmelo,
ciao

Grazie per la risposta, perņ, effettivamente, non tutto mi č chiaro: nella
prima soluzione che mi hai proposto scrivendo che devo "implementare una
classe a parte che implementa ActionListener, nella quale implementi il
metodo actionPerformed" intendi forse che devo scrivere una interfaccia?
Temo che le mie conoscenze dei termini "tecnici" siano un po' carenti,
perdona la mia ignoranza.
Per quanto riguarda invece la seconda soluzione, "fai implementare alla tua
classe che estende JMenuBar l'interfaccia ActionListener ed gli e crei in
questa classe il tuo metodo actionPerformed(ActionEvent ae)" era la
soluzione che volevo adottare, ma poi la classe che estende JMenuBar non
viene accettato da setJMenuBar(), il compilatore non dą errore ma poi nel
frame non compare nessuna barra.
Grazie di nuovo per l'attenzione.

frame non compare nessuna barra.
http://java.sun.com/docs/books/tutorial/uiswing/components/menu.html
Magari posta un poco di codice, così si capisce meglio.
HTH
-- 
Ciao
	Fabrizio C.

"Magari posta un poco di codice, cosě si capisce meglio" effettivamente
credo sia piů facile, ma credevo che leggere una decina di righe di codice
sarebbe stato fastidioso cosě..., ma ora riparo: quello che volevo fare era
una classe, sempre disponibile, che mi permettesse solo con due righe di
codice (l'inizializzazione di una array di array di tipo String e di un
JMenuBar) di creare un JMenuBar (č corretto ma per vederlo NON funzionare
dovreste istanziare la classe in un JFrame)
import java.awt.event.*;
import javax.swing.*;
public class Barra extends JMenuBar implements ActionListener
{
 //il costruttore
 Barra (String [][] nomi)
 {
  creaMenuBar(nomi);
 }
 //i metodi usati dal costruttore
 JMenuBar creaMenuBar(String[][]menu)
 {
  JMenuBar mb = new JMenuBar();
  for (int y=0; y<menu.length;y++)
  {
   JMenu unMenu = creaMenu(menu[y]);
   mb.add(unMenu);
  }
  return mb;
 }
 JMenu creaMenu(String[]voci)
 {
  JMenu menu = new JMenu(voci[0]);
  for (int x=1; x<voci.length;x++)
  {
   if(voci[x].equals(""))
   {
    menu.addSeparator();
   }
   else
   {
    menu.add(aggiungiVoce(voci[x]));
   }
  }
  return menu;
 }
 JMenuItem aggiungiVoce(String voce)
 {
  JMenuItem elemento = new JMenuItem(voce);
  return elemento;
 }
 public void actionPerformed (ActionEvent e)
 {
  Object origine = e.getSource();
  JMenuItem origineMI = (JMenuItem) origine;
  String arg = e.getActionCommand();
  if (arg.equals("Nuovo"))
  {
   System.out.println("Nuovo");
  }
  else if (arg.equals("Esci"))
  {
   System.exit(0);
  }
 }
}
GRAZIE ANCORA A TUTTI!

}
Questo metodo, invece, IMHO vanifica la "flessibilità" della classe che 
stai creando (o magari del builder ;-)).
Inoltre dichiarare che la classe Barra implementa ActionListener, 
"sporca" decisamente l'interfaccia (sempre IMO).
Ma di questo, se serve, potremo parlare dopo che avrai fatto funzionare 
la parte grafica :-)


 "sporca" decisamente l'interfaccia (sempre IMO).
Mi fido del tuo occhio evidentemente più esperto (cmq anche quando tutto
funzionava e la barra veniva creata e l'ActionPerformed era all'interno
della classe CreaBarra poi durante l'esecuzione l'ascoltatore era proprio
sordo, per cui...), ma allora dove metterlo? Sto cercando di metterlo
all'interno del frame dove vado a creare la barra e sto scrivendo una classe
che riprende la barra la scompone, prende i vari JMenuItem e gli aggiunge
l'ascoltatore. Mi pare un po' troppo complicato e vorrei cercare un modo più
semplice di mettere l'ascoltatore, c'è inoltre il fatto che questa classe
deve essere interna al frame se voglio che non si riverifichi il problema di
prima (ossia che, tutto funzionante, l'ascoltatore rimane sordo). Posso
sperare in un altro tuo consiglio? Grazie grazie ancora, anche per la fatica
di leggere le mie e.mail che so essere decisamente particolari.
E poi che cosa signifca "HTH"?
"Fabrizio Camera" <f.came...@Mtiscali.it> ha scritto nel messaggio
news:MPG.17c2f6da2...@powernews.libero.it...


E poi che cosa signifca "HTH"?
Hope This Helps
Sei nuovo dei newsgroup, vero? :-)
-- 
Ciao
	Fabrizio C.

 Ci sarà tempo per complicarlo.
Mmm, qui ho dei dubbi: il tuo consiglio sarebbe di eliminare proprio
l'ascoltatore dalla classe o semplicemente di renderlo semplice semplice
così che, quando istanzio la classe poi io possa usare l'ascoltatore
adattando il metodo ai nuovi bisogni riscrivendo l'ActionPerformed?
Ora ti lascio, devo ringraziarti veramente tanto per i tuoi consigli, ma ora
devo leggere un po' di cosette se voglio metterli in pratica, grazie ancora.

Grazie veramente di tutto, credo di aver fatto un passetto in avanti: ho
accettato l'idea del builder, ho capito perché il costruttore iniziale era
superfluo, ho esteso quindi il builder e, non avendo questo alcun
ascoltatore (come avevi suggerito), contemporaneamente ho implementato
ActionListener riscrivendo (overriding no?) un metodo e aggiungendoci
l'actionPerformed (per quanto riguarda il suggerimento delle classe anonime
interne... beh beh, ci devo ancora lavorare sopra, le devo ancora guardare
per bene prima di poterle usare, ma terrò presente anche questo
suggerimento). Ti ringrazio ancora e torno alle mie letture.

adattando il metodo ai nuovi bisogni riscrivendo l'ActionPerformed?
Beh, io non l'avrei fatto così, comunque intendevo:
rendilo semplice-semplice (anche un if è troppo) per fare le prove e, 
quando avrai appurato che tutto (il resto) funziona, fanne quello che 
vuoi ;-)
-- 
Ciao
	Fabrizio C.

l'actionPerformed
Non credo che si possa chiamare proprio overriding (non sostituisci un 
metodo esistente, ma dai un corpo... ad una firma), ma il senso è 
quello.
Tienici aggiornati.
-- 
Ciao
	Fabrizio C.