Newsgroup: it.comp.java
Titolo: Creare una semplice interfaccia

Ciao a tutti.
Non ho mai programmato con la grafica java e mi servirebbe un aiutino
per creare una semplice interfaccia.
Quello che devo creare é una finestra che contiene una combobox e un
tasto.
Dopo aver scelto un valore dalla combobox diciamo "giardino" devo
passare questa stringa a un metodo "X" premendo il tasto.
Sono riuscito a creare la combobox e il tasto ma non riesco a
inserirli nella stessa finestra.
Ho provato due strade:
1) JComboBox menu = new JComboBox(locations); // location: array di
stringhe
   menu.setSelectedIndex(0);
   JButton sendButton = new JButton("Send");
   JFrame finestra = new JFrame("LocationsWindow");
   finestra.setContentPane(menu);
   finestra.setContentPane(sendButton);
   finestra.pack();
   finestra.setVisible(true);
così é come se il pulsante "sendButton" sovrascrivesse la combobox
"menu"
2) ho creato un oggetto "gui" il cui costruttore crea "menu" e
"sendButton" e poi ho fatto:
   JFrame finestra = new JFrame("LocationsWindow");
   finestra.setContentPane(gui);
   finestra.pack();
   finestra.setVisible(true);
risultato...non si vede nè "menu" nè "sendButton"
Cosa sbaglio?
Ringrazio anticipatamente tutte le persone che mi vorranno aiutare.

il 04/02/2009 20.16, Scrive alessandro 43447104:

1) la JFrame ha solo un contentPane, per cui ad ogni setContentPane 
glielo cambi. Inoltre una volta istanziata una JFrame ha gia' un 
contentPane, per cui, a meno di particolari esigenze, basta ottenere 
l'istanga tramite il metodo getContentPane.
2) A parte il discorso sul contentPane di cui sopra, va gia' meglio, 
dipendentemente da come e' costruito il tipo "gui" e da che cos'e'. Per 
contratto il contentPane deve essere un Component opaco, ad esempio:
JPanel gui = new JPanel(new FlowLayout());
gui.setOpaque(true);
gui.add(menu);
gui.add(sendButton);
JFrame finestra = new JFrame("LocationsWindow");
finestra.setContentPane(gui);
Io pero' farei cosi':
JFrame finestra = new JFrame("LocationsWindow");
finestra.getContentPane().add(menu);
finestra.getContentPane().add(sendButton);
finestra.pack();
oppure
JFrame finestra = new JFrame("LocationsWindow");
finestra.getContentPane().add(gui);
finestra.pack();
dove gui e' costruito come sopra.
-- 
Dr.Ugo Gagliardelli,Modena,ItalyCertifiedUindoscrasherAñejoAlcoolInside
Spaccamaroni andate a cagare/Spammers not welcome/Spammers vão à merda
Spamers iros a la mierda/Spamers allez vous faire foutre/Spammers loop
schijten/Spammers macht Euch vom Acker/Spamerzy wypierdalac'

 Qui è l'errore. Premesso che non devi chiamare pack() che è deprecato, ogni
http://java.sun.com/javase/6/docs/api/java/awt/Window.html#pack()
Scusa, dove sarebbe stato deprecato pack???
-- 
Scientology: se la conosci la eviti, se la conosci non ti uccide...
http://xenu.com-it.net
 - 
http://xenu.freewinds.cx
 - 
http://www.xenu.net
(per rispondere personalmente leva IlDitoDalCulo)
---> 09 F9 11 02 9D 74 E3 5B D8 41 56 C5 63 56 88 C0 <---

 finestra.setContentPane(gui);
Quello che non mi era chiaro e che omettevo del tutto era il JPanel.
Ora devo fare qualche prova per capire come inviare l'elemento
selezionato nella combobox
Grazie a tutti.
Se ho ancora qualche problema mi rifaccio vivo qui.
Grazie ancora.

 ---> 09 F9 11 02 9D 74 E3 5B D8 41 56 C5 63 56 88 C0 <---
In effetti anche a me NON risulta come deprecato.

il 05/02/2009 14.31, Scrive alessandro 43447104:

Usa un listener, poi dipendentemente dall'implementazione (selezione 
singola o multipla) usa rispettivamente
Object item = menu.getSelectedItem();
oppure
Object[] items = menu.getSelectedObjects();
ad esempio:
menu.addItemListener(new ItemListener() {
    void itemStateChanged(ItemEvent event) {
      Object item =((JComboBox)event.getSource()).getSelectedItem());		 
     setSelezionato(item);
    }
   });
dove setSelezionato sara' un metodo public della tua classe che fara' 
cio' che deve fare.


On 5 Feb, 17:19, "Dr.UgoGagliardelli"

ho risolto usando un actionListener in questo modo:
sendButton.addActionListener(this);
in questo modo la pressione del tasto "send" invoca il metodo
"actionPerformed" che recupera la selezione della combobox (menu)
tramite:
menu.getSelectedItem();
Una sola domanda anche se credo che non mi servirà...
Ma quando ci sono più tasti?
Potrebbe valere la pena creare una classe (tasto) separata per creare
i tasti e associrgli i relativi listener?
Il problema del mio codice é che non posso mettere due metodi
"actionPerformed" nella stessa classe e quindi non posso gestire più
di 1 tasto.

il 05/02/2009 18.10, Scrive alessandro 43447104:

Se usi una tecnica come quella che ti ho mostrato sopra, ovvero creare 
un listener "al volo" non hai bisogno di creare n-volte lo stesso 
metodo, bastera' un metodo specializzato per ogni evento.
Oppure puoi far implementare ActionListener  dalla classe stessa o da 
una classe apposita, con il metodo actionPerformed che valutera' tutti 
gli eventi. Ad esempio:
public class Mia implements ActionListener  {
 
    public Mia() {
      init();
    }
    void init() {
      JButton sendButton = new JButton("Send");
      sendButton.setActionCommand("send_command");
      sendButton.addActionListener(this);
      ....etc.etc.
    }
    public void actionPerformed(Action event) {
      if (event.getSorce() instanceof Jbutton) {
// processo tutti i button
        JButton b = (JButton)event.getSorce();
        if (b.getName().equals(sendButton.getName()) {
          doSendAction();
        }
       } ...
oppure
      if (event.getActionCommand()
		.equals(sendButton.getActionCommand()) {
        doSendAction();
      } ...
    }
    void doSendAction() {
      ....
    }
}
Ovviamente ti puoi sbizzarrire a creare il tuo paradigma per trattare il 
flusso delle operazioni, il consiglio e' di scegliere un paradigma gia' 
pensato, come il Model/View/Controller, anche se forse non e' il 
migliore, ma comunque evita di reinventare l'acqua calda ogni volta.


 migliore, ma comunque evita di reinventare l'acqua calda ogni volta.
Cosa consideri preferibile al MVC ?
Giorgio

il 05/02/2009 19.24, Scrive Giorgio Pastore 43447104:

Personalmente lo preferisco, sai, vengo dallo SmallTalk...
Pero' so che c'e' un gran dibattito, anche se non ho ne' tempo ne' 
voglia per mettermi ad utilizzare delle metodologie che possono darti 
dei vantaggi ma sono poi sempre prone ad altri svantaggi.
Volevo solo sottolineare che, dovendo iniziare from-scratch a 
programmare ad oggetti, forse, dovendo comunque farlo, sarebbe meglio 
guardarsi in giro. Non ho voluto semplicemente vendere la mia verita' 
come la migliore possibile.


On 5 Feb, 19:06, "Dr.UgoGagliardelli"

Se non ho capito male praticamente si tratta di:
1) attribuire una Action a un button tramite setActionCommand
2) all'interno di actionPerformed confrontare l'Action associata
all'evento event con getActionCommand
3) richiamare il metodo oppurtuno

il 05/02/2009 21.03, Scrive alessandro 43447104:

Si', grosso modo e' cosi'.
Se volessi implementare il pattern MVC, la responsabilita' di rilevare 
gli eventi sarebbe della classe View mentre la responsabilita' 
dell'elaborazione dell'evento sarebbe del Controller, e, nel tuo 
semplice caso, la responsabilita' di fornire la lista di elementi della 
combo dovrebbe essere del Model.
Come potrai intuire il pattern MVC non e' solo architetturale, ovvero 
che ti permette di separare il layer dei dati (Model) il layer della 
'business-logic' (Controller) e quello della presentazione (View), 
permettendoti di poter eseguire i tre layer anche su tre distinti 
computer (il server DB, il server applicativo ed il client), ma e' anche 
un pattern di progettazione.
Pensa ad esempio se dovessi estendere l'applicazione per fornire oltre 
che il client swing anche un client web, i due layer model e controller 
potrebbero essere esattamente gli stessi l'unica cosa da implementare 
sarebbe il layer view, che molto semplicemente potra' utilizzare la 
stessa logica di presentazione in una servlet.
In questo scenario le Interface Java la fanno da padrone. Ma questo e' 
un altro capitolo. Mi preme solo di sollecitare la tua curiosita'! :-)


On 6 Feb, 09:04, "Dr.UgoGagliardelli"

Sei un fenomeno!
Un giorno mi piacerebbe arrivare al tuo livello di programmazione :-)
Per ora ti ringrazio per i consigli.
Grazie ancora.

 Grazie ancora.
