Entra

View Full Version : [Java] Richiamare Oggetto


Peppe 93
04-04-2014, 08:39
sono nuovo del Java ed ho ancora problemi con alcune cose.
il mio problema è questo:

import java.awt.BorderLayout;


public class frame1 extends JFrame {

private JPanel contentPane;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
frame1 frame = new frame1();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

public frame1() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);

JButton Selezione = new JButton("Seleziona File");
Selezione.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent arg0) {

JFileChooser scelta= new JFileChooser();
FileFilter documentoWord = new FileNameExtensionFilter("DOC file", "doc");
FileFilter documentoPdf = new FileNameExtensionFilter("PDF file", "pdf");
FileFilter documentoOdt = new FileNameExtensionFilter("ODT file", "odt");

scelta.addChoosableFileFilter(documentoPdf);
scelta.addChoosableFileFilter(documentoOdt);
scelta.setFileFilter(documentoWord);

int sel=scelta.showDialog(null, "Scegli File..");
if(sel==JFileChooser.APPROVE_OPTION){
File scelto = scelta.getSelectedFile();
String FileN=scelto.getName();
String FileP=scelto.getPath();
DatiFile a =new DatiFile();
a.setDati(FileN, FileP);
}

}
});
Selezione.setBounds(303, 23, 105, 23);
contentPane.add(Selezione);
JLabel stringaPath = new JLabel("Nessun file selezionato");
stringaPath.setForeground(new Color(0, 0, 0));
stringaPath.setBackground(Color.LIGHT_GRAY);
stringaPath.setBounds(33, 22, 234, 24);
contentPane.add(stringaPath);

if ((a.getNome()==null)||(a.getPath==null)) stringaPath.setText("Nessun File Selezionato");
else stringaPath.setText(a.getNome + " " + a.getPath);
}

public class DatiFile{
public String NomeFile;
public String PathFile;

public String getNome(){
return this.NomeFile;
}
public String getPath(){
return this.PathFile;
}

public void setDati(String Nome, String Path) {
this.NomeFile= Nome;
this.PathFile= Path;

}

}
}


nel richiamare l'oggetto "a" fuori dal metodo (actionlistener) in cui è stato creato mi da errore, so che sto sbagliando qualcosa nel passaggio dei valori ma non so cosa.

gianmpu
04-04-2014, 16:03
In Java un oggetto è visibile solo nella porzione di codice delimitata dalle due parentesi in cui è stato dichiarato.
Nel tuo caso, se dichiari a in mouseClicked non lo vedi al di fuori
Se ti serve in altri punti del codice, devi spostare la dichiarazione di a

Peppe 93
04-04-2014, 16:46
In Java un oggetto è visibile solo nella porzione di codice delimitata dalle due parentesi in cui è stato dichiarato.
Nel tuo caso, se dichiari a in mouseClicked non lo vedi al di fuori
Se ti serve in altri punti del codice, devi spostare la dichiarazione di a

si si lo sapevo..solo non mi rendo conto dove dovrei dichiararlo per poterlo usare...

se lo dichiaro all'inizio del frame mi dice: "cannot refer to a non-final variable a inside an inner class defined in a different method" se invece lo metto dentro al listener non lo riconosce fuori e se invece lo metto all'inizio del file non mi da errore ma la label continua a mostrare path e nome del file come nulli...come devo fare?

wingman87
04-04-2014, 16:55
Perché se la dichiari all'interno di un metodo è una variabile locale che cioè esiste solo finché il metodo in cui è dichiarata è in esecuzione, quello che a te serve è una variabile d'istanza che invece esiste finché l'oggetto di cui è parte è in memoria.
La devi dichiarare allo stesso livello di
private JPanel contentPane;

In verità vedendo velocemente il tuo codice non mi torna molto l'utilizzo che fai di questa variabile "a"... Comunque dichiarandola come variabile d'istanza e inizializzandola a null dovrebbe compilare.

Peppe 93
04-04-2014, 17:12
Perché se la dichiari all'interno di un metodo è una variabile locale che cioè esiste solo finché il metodo in cui è dichiarata è in esecuzione, quello che a te serve è una variabile d'istanza che invece esiste finché l'oggetto di cui è parte è in memoria.
La devi dichiarare allo stesso livello di
private JPanel contentPane;

In verità vedendo velocemente il tuo codice non mi torna molto l'utilizzo che fai di questa variabile "a"... Comunque dichiarandola come variabile d'istanza e inizializzandola a null dovrebbe compilare.


praticamente a me serviva inizialmente che dopo aver scelto il file la label mi mostrasse path e nome del file

wingman87
04-04-2014, 17:19
Quindi il testo della label lo devi modificare quando viene fatto click sul pulsante, cioè nel listener dell'evento.

Peppe 93
04-04-2014, 17:27
Quindi il testo della label lo devi modificare quando viene fatto click sul pulsante, cioè nel listener dell'evento.

esattamente ma ho verificato che i valori passati sono sempre null :mbe:

wingman87
04-04-2014, 19:05
Prova a postare il codice corretto e vediamo...

Peppe 93
04-04-2014, 19:12
Prova a postare il codice corretto e vediamo...

grazie ma non serve, ho risolto..avevo dimenticato di spostare la dichiarazione della label all'inizio del frame :D