Newsgroup: it.comp.java
Titolo: Quesito niubbio :)

Ciao,
premetto che sono un autodidatta, dunque la mia domanda risulterà quasi
offensiva per voi :) Ovviamente se la cosa vi pare troppo stupida e non
ritenete opportuno rispondermi capirò...
Stavo provando a creare un interfaccia grafica per leggere alcuni input da
tastiera, di cui allego il codice:
import java.awt.*;
import java.awt.event.*;
public class LineaDiTesto extends Frame implements ActionListener {
 TextField t1;
 TextField t2;
 TextField t3;
 public static void main(String[] args) {
  LineaDiTesto ist = new LineaDiTesto();
  ist.CreateFrame();
 }
 public void CreateFrame () {
  setLayout(null);
  setBounds(30,10,300,250);
  setTitle("CD Insert Dialog");
  Button bData = new Button("Importa");
  bData.setBounds (50,200,70,30);
  bData.addActionListener(this);
  Button bEsci = new Button("Esci");
  bEsci.setBounds (200,200,50,30);
  bEsci.addActionListener(this);
  t1 = new TextField();
  t1.setBounds( 100,50,100,20);
  t2 = new TextField();
  t2.setBounds( 100,100,100,20);
  t3 = new TextField();
  t3.setBounds( 100,150,100,20);
  add(t1);
  add(t2);
  add(t3);
  add(bData);
  add(bEsci);
  setVisible(true);
 }
 public void paint (Graphics g) {
  g.drawString ("Nome", 20, 65);
  g.drawString ("Autore", 20, 115);
  g.drawString ("Casa Disc", 20, 165);
 }
 public void actionPerformed(ActionEvent e) {
  if (e.getActionCommand().equals("Esci"))
   System.exit(0);
  if (e.getActionCommand().equals("Importa")) {
   System.out.println(t1.getText());
   System.out.println(t2.getText());
   System.out.println(t3.getText());
  }
 }
}
Ciò che mi pare del tutto oscuro è come far "tornare" nel main il contenuto
dei tre box di testo nel caso in cui venga premuto importa. In altri termini
al momento i tre valori sono stampati a video mediante console, ma quale
metodo dovrei implementare affinchè abbia in ritorno un oggetto della classe
CD (che ho implementato a parte) dove gli attributi dello stesso sono
acquisiti dalla finestra?
In altri termini cercavo di realizzare una specie di
"JOptionPane.showInputDialog()" ma personalizzato alle mie esigenze.
Vi ringrazio per l'attenzione che mi avete dedicato e per le eventuali
risposte.
Ciao,
Luca.

 Luca.
Ciao
Vito
-- 
by \ \/ /\/
PerezDeQueya80 on AzzurraNET.org

 cambierebbe un pochino.
Prima di tutto grazie per la tua disponibilità!
Ora già che ci sono vorrei chiederti un ulteriore cosa, è possibile che
l'istanza di classe CD1 i cui dati provengono dalla finestra di input che mi
hai costruito, venga creata successivamente alla pressione del tasto
"Importa".
Purtroppo mi affaccio solo ora agli OOPL, quindi spiego meglio il mio
dubbio... nel main ho messo
  CD CD1;
  CD1 = showInputDialog();
  CD1.stampaCD();
Ecco io immaginavo che il controllo fosse "call and return", nel senso che
veniva chiamata showInputDialog e il controllo passasse a questa finchè non
ritornava il valore CD, poi proseguiva la scansione delle istruzioni del
main... invece la funzione stampaCD() (che stampa i valori del CD) è
lanciata immediatamente e quindi rende valori nulli.
Ti ringrazio ancora (o ringrazio chi ha la pazienza di rispondermi :) )
Ciao,
Luca.

 lanciata immediatamente e quindi rende valori nulli.
Questo è strano, nel senso che questo dovrebbe succedere solo se la 
chiamata del metodo fosse riferita ad un metodo contenuto in un Thread 
differente da quello chiamante, ovvero CD1 = showInputDialog(); in 
questo caso dovrebbe attendere il risultato di ritorno per passare a 
CD1.stampaCD();
E da quello che dici in effetti secondo me lo fa, perchè se l'oggetto CD 
non venisse restituito prima di CD1.stampaCD(); quest'ultima istruzione 
invece che stampare valori nulli, dal momento che l'oggetto CD è 
dichiarato ma non istanziato, dovrebbe lanciare una NullPointerException.
Quindi secondo me l'errore sta in showInputDialog(); che non crea 
correttamente l'oggetto CD, o meglio lo crea ma non popola correttamente 
i dati che dovrebbe contenere.
Questo se non ho capito male (anche io sono un povero autodidatta :D)
Ciao
Ivan

 i dati che dovrebbe contenere.
Esattamente Ivan! Ti ringrazio molto, e il problema è proprio qui. Il metodo
showInputDialog() infatti crea subito una nuova istanza temp CD
CD cd = new CD(ist.t1.getText(),ist.t2.getText(),ist.t3.getText());
quindi penso proprio che il CD che torna indietro al main con il return sia
quello in cui ciascun getText() renda i valori di default ("") dei tre
campi. Insomma secondo il mio modestissimo parere mi pare di capire che il
return CD avvenga immediatamente, in fondo la showInputDialog non richiede
da nessuna parte che bisogna aspettare gli input prima di fare il return di
cd, in altri termini credo che una volta creata la showInputDialog, questa
si comporti come un thread indipendente dal main (non mangiatemi se ho usato
termini a sproposito). Insomma il mio problema sarebbe risolto se si
attendesse che venga premuto "Importa" prima di effettuare il return. Posto
anche il codice modificato, grazie a tutti ancora.
import java.awt.*;
import java.awt.event.*;
public class LineaDiTesto extends Frame implements ActionListener {
 TextField t1;
 TextField t2;
 TextField t3;
 public static void main(String[] args) {
  String nome;
  String titolo;
  String casadisc;
  CD CD1 = importCDdata();
  CD1.stampaCD();
  CD1.stampaCD();
 }
 public static CD importCDdata() {
  LineaDiTesto ist = new LineaDiTesto();
  ist.CreateFrame();
   CD cd = new CD(ist.t1.getText(),ist.t2.getText(),ist.t3.getText());
   //ist.dispose(); // se metto int.dispose() la finestra si chiude
immediatamente
   return cd;
 }


 public void actionPerformed(ActionEvent e) {


 valori del CD) è lanciata immediatamente e quindi rende valori nulli.
è il discorso che ti dicevo in riferimento a quanto ti dicevo di fare la 
finestra estendendo una dialog. Vabè, allora ti dico come fare :P
Prima di tutto la classe "LineaDiTesto" deve estendere la Dialog e non la 
Frame. Poi il metodo showInputDialog lo modifichi in questo modo:
public static CD showInputDialog(Frame owner) {
 LineaDiTesto ist = new LineaDiTesto(owner, true);
 return showInputDialog(ist);
}
public static CD showInputDialog(Dialog owner) {
 LineaDiTesto ist = new LineaDiTesto(owner, true);
 return showInputDialog(ist);
}
private static CD showInputDialog(LineaDiTesto lineaDiTesto) {
 ist.CreateFrame();
 CD cd = new CD();
 cd.1 = ist.t1.getText(); // in questo modo dovresti dichiarare
 cd.2 = ist.t2.getText(); // t1, t2 e t3 public.
 cd.3 = ist.t3.getText(); // sarebbe meglio con dei metodi come getT1()...
 ist.dispose();
 return CD
}
devi farti questi tre metodi e passare alla showInputDialog il frame/dialog 
padre (cioè chi da dove lo richiami).
Fammi sapere ;)


 }
public LineaDiTesto(Dialog owner, boolean modal) {
...
}
Ok io ho provato a studiarmi la documentazione di Dialog e in soldoni ho
capito che, come plausibile, è necessario definire un costruttore che
indichi il proprietario sia esso Dialog o Frame del nuovo Dialog... Ecco,
qui viene fuori la mia ignoranza... Ma questo "proprietario" come lo
definisco? Immagino che debba essere un Frame altrimenti mi pare che il
tutto sia molto ricorsivo... Ossia il main dovrà contenere una riga del
genere:
CD CD1 = showInputDialog(frameOwner);
Avevo pensato di provare a mantenere LineaDiTesto come frame e poi
denominare una nuova classe LineaDialog, in modo tale che all'interno di
LineaDiTesto avessi messo qualcosa del tipo
LineaDialog(this);
ma il tutto va al di là delle mie capacità :)
Ti ringrazio infinitamente se avessi la pazienza di rispondermi nuovamente,
Ciao,
Luca.

 ha detto:
---8<---
no no, il Frame/Dialog owner in pratica è il frame che richiama lineaditesto. 
se questo non esiste puoi tranquillamente mettere "null". In questo caso 
lineaditesto verrà posizionata al centro dello schermo.
