PDA

View Full Version : [JAVA] Inserimento immagine in Frame


davide_sana
05-10-2009, 09:50
Salve a tutti.
Ho il seguente problema. Vorrei inserire un'immagine in un JFrame. La soluzione credo dovrebbe essere : creare un'icona con l'immagine e metterla dentro una label, dopo aggiungere la label al frame.

Il codice scritto è il seguente:

JLabel sfondo_davide = new JLabel(new ImageIcon("me.jpeg"));
JFrame nuovo_davide = new JFrame("Ciao Davide");

//assegno la label al frame
nuovo_davide.add(sfondo_davide);

nuovo_davide.setBounds(300,300,LARGHEZZA,ALTEZZA);
nuovo_davide.setVisible(true);

Il problema è che quando il frame si apre nn visualizza nessuna immagine ma solo una schermata grigia con il titolo finestra da me scelto. L'immagine me.jpg che vorrei caricare è su desktop.

Dov'è sta l'errore?
Ed inoltre, è corretto scrivere "me.jpeg" visto che l'immagine sta sul desktop?

PGI-Bis
05-10-2009, 10:17
La stringa che passi al costruttore di ImageIcon denota un file. In java quando è richiesto il nome di un file e non ne viene fornito il percorso assoluto, la stringa relativa viene trasformata in un file preponendo alla stessa il valore della variabile di sistema user.dir. Tale variabile indica il percorso della directory di lavoro del processo java.

A conti fatti tu scrivi:

"me.jpeg"

e ImageIcon capisce:

System.getProperty("user.dir") + File.separator + "me.jpeg"

Se lanci il programma Java da "c:\bingo" allora ImageIcon capirà:

"c:\bingo\me.jpeg"

Poichè il percorso assoluto dell'immagine dipende dal percorso della directory di lavoro ecco che l'immagine è trovata o non trovata a seconda di come sia eseguito il programma stesso.

Una soluzione - peraltro non consigliabile in un contesto reale ma più che accettabile durante l'apprendimento - consiste nello specificare il percorso assoluto dell'immagine. Supponendo che "me.jpeg" sia in "C:\Documents and Settings\utente\desktop" dirai:


JLabel sfondo_davide = new JLabel(new ImageIcon("c:\\Documents and Settings\\utente\\desktop\\me.jpeg"));

Verifica il percorso e, in particolare, controlla che il file immagine abbia effettivamente estensione "jpeg" e non solo "jpg".

davide_sana
05-10-2009, 10:39
Grazie.
Il problema stava proprio nella descrizione del percorso dell'immagine.

Ne approfitto per chiederti la seguente. Supponiamo di avere un frame con diversi bottoni. Cliccando su uno di questi bottoni si apre un nuovo frame. Come faccio a rendere nn selezionabile il frame precedente? ovvero vorrei che,una volta aperto il nuovo frame, siamo possibili operazioni solo sui bottoni del nuovo frame aperto.

PGI-Bis
05-10-2009, 11:05
Anzichè aprire un nuovo JFrame apri un nuovo JDialog. JDialog è una finestra simile a JFrame, ma a differenza di quest'ultima, è in grado di prevalere obbligatoriamente su un'altra finestra.

Supponendo che la finestra principale sia "finestra001", alla pressione del pulsante dirai:

JDialog finestra002 = new JDialog(finestra001, "Titolo Finestra 002", Dialog.ModalityType.APPLICATION_MODAL);

//imposta il contenuto di finestra002, la posizione, la dimensione eccetera

finestra002.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
finestra002.setVisible(true);

Dopo il setVisible e finchè finestra002 è visibile l'interazione con altre finestre dello stesso programma è impedita - e, dunque, è impedito l'uso del contenuto di quelle finestre.

davide_sana
05-10-2009, 12:54
Ho scritto il seguente codice:

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;

class Window extends JFrame
{
public static final int LARGHEZZA = 400;
public static final int ALTEZZA = 250;

public static void main(String[] args) {

JFrame finestra = new JFrame ("Prova");
JPanel pannello = new JPanel (new BorderLayout());
JButton Avanti = new JButton ("Avanti");
pannello.add(Avanti);
finestra.setBounds(300,300,LARGHEZZA,ALTEZZA);
finestra.setVisible(true);

//aggiungo il pannello al frame nello spazio in basso
finestra.getContentPane().add(pannello, BorderLayout.PAGE_END);

//registra evento click su Avanti
Avanti.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {

JDialog finestra2 = new JDialog(finestra, "Titolo Finestra 002",
Dialog.ModalityType.APPLICATION_MODAL);
finestra2.setBounds(300,300,LARGHEZZA,ALTEZZA);
finestra2.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
finestra2.setVisible(true);

}
});

finestra.addWindowListener(new WindowAdapter()

{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}
}

Si apre il primo frame..ma quando clicco su "Avanti" si genera errore..e l'errore lo segnale nella seguete istruzione:

JDialog finestra2 = new JDialog(finestra, "Titolo Finestra 002",,
Dialog.ModalityType.APPLICATION_MODAL);

e in particolare nn riconosce "finestra".

Dove commetto l'errore?

PGI-Bis
05-10-2009, 13:03
usa i tag code quando inserisci del codice per preservarne l'indentazione nel forum.

Il codice così com'è non dovrebbe neppure compilare. La ragione sta in ciò che la variabile locale "finestra" è usata nel corpo di una classe locale (new ActionListener() {...}). Il linguaggio stabilisce che tale variabile locale debba essere dichiarata "final":

final JFrame finestra = new JFrame("prova");
...
avanti.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JDialog finestra2 = new JDialog(finestra, "titolo", Dialog.ModalityType.APPLICATION_MODAL);
finestra2.setSize(new Dimension(LARGHEZZA, ALTEZZA);
finestra2.setLocation(300, 300);
finestra2.setVisible(true);
}
});

davide_sana
05-10-2009, 14:13
Grazie!