PDA

Visualizza la versione completa : Oggetto: centrare un'immagine di sfondo ad un Jpanel


peppespe
01-06-2003, 14:21
Ho creato un frame in Java2 il quale visualizza un immagine su un Jpanel, vorrei sapere come posso far comparire l'immagine al centro del frame?
Di seguito viene riportato il listato del programma:

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

/****************** CLASSE DI TEST **********************/

public class ImageTest{

public static void main(String[] args){
ImageFrame frame = new ImageFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOS E); //permette di chiudere il frame
frame.show(); //visualizza il frame
}//main
}//ImageTest

/******************* CLASSE CHE COSTRUISCE IL PANNELLO *******************/

public class ImageFrame extends JFrame{

/*** Costruttore ***/

/**
@requires richiede i package java.awt, java.awt.geom e javax.swing
@effects dopo aver acquisito le impostazioni ddello schermo dal sistema operativo crea un frame il quale risulterà un quarto dell'intero schermo
@return restituisce un frame pari ad 1/4 del video contenente figure geometriche
*/

public ImageFrame(){
//acquisisce le dimensioni dello schermo
// La classe Toolkit iteragisce con il sistema operativo
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize(); //restituisce la dimensione dello schermo come oggetto Dimension
int screenHeight = screenSize.height;
int screenWidth = screenSize.width;

//centra il frame nello schermo
setSize(screenWidth/2, screenHeight/2); //dimezza la larghezza ed altezza delle dimensioni del video precdentemente acquisite
setLocation(screenWidth/4, screenHeight/4); //consente di riposizionare il frame

//imposta l'icona ed il titolo del frame
Image img = kit.getImage("icon.gif");
setIconImage(img); //prende un oggetto img e lo usa come icona del frame
setTitle("Giuseppe SPECCHIO - Progetto LI4"); //imposta il titolo del frame

//aggiunge un pannello al frame
ImagePanel panel = new ImagePanel();
panel.setBackground(SystemColor.window); //imposta il colore di sfondo del frame sul colore predefinto nel sistema operativo
Container contentPane = getContentPane(); //restituisce l'oggetto pannello del contenuto del JFrame
contentPane.add(panel); //aggiunge il pannello al frame
}//ImageFrame

}//ImageFrame{}

/***************************** CLASSE CHE GESTISCE L'IMMAGINE ***************************/


public class ImagePanel extends JPanel{

/*** Variabili di Classe ***/

private Image image;

/**
@requires richiede i package java.awt, java.awt.event e javax.swing
@effects dopo aver acquisito le impostazioni dello schermo dal sistema operativo crea un frame il quale risulterà un quarto dell'intero schermo
@return restituisce un frame pari ad 1/4 del video contenente un'immagine di sfonfo
*/

public ImagePanel(){

//acquisisce l'immagine
image = Toolkit.getDefaultToolkit().getImage("Background.gif");
MediaTracker tracker = new MediaTracker(this);
tracker.addImage(image, 0); //aggiunge image all'elenco d'immagini da caricare
try{ tracker.waitForID(0);} //attende che siano caricate tutte le immagini con l'id specificato
catch (InterruptedException exception) {}
}//ImagePanel

public void paintComponent(Graphics g){
super.paintComponent(g);

//acquisisce le dimensioni dello schermo
// La classe Toolkit iteragisce con il sistema operativo
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize(); //restituisce la dimensione dello schermo come oggetto Dimension
int screenHeight = screenSize.height;
int screenWidth = screenSize.width;

//disegna l'immagine
g.drawImage(image, 0, 0, null); //per ottenere l'immagine al centro del frame????
}//paintComponent

}//ImagePanel{}

ivanet
08-06-2003, 21:58
Buonasera! Dopo una lettura del codice, per centrare l'immagine nel panel occorre eseguire un semplice calcolo a livello di pixel.
Mediante l'oggetto di classe ToolKit hai acquisito le dimensioni dello schermo assegnandole alla variabile screenSize di tipo Dimension.
Ciò che ho fatto non è stato altro che settare le coordinate del punto dell'angolo iniziale dell'immagine, in maniera tale da ottenere il punto centrale dell'immagine, in posizione metà ascissa schermo e metà ordinata schermo (naturalmente della risoluzione). Per fare questo ho calcolato la metà dell'ascissa della risoluzione video:
int screenWidth=screenSize.width/2;
Allo stesso modo ho calcolato la metà dell'ordinata della risoluzione video:
int screenHeight=screenSize.height/2;
Avendo questi due dati, le coordinate del punto dell'angolo sinistro dell'immagine, possono essere calcolate facendo la differenza tra la dimensione metà ottenuta (del video) meno la dimensione metà dell'immagine, eseguendo così una semplice differenza di segmenti che portano il punto centrale dell'immagine proprio al centro del video, centrando dunque l'immagine nel panel. Quest'ultima parte e per aver più chiare le idee ecco la tua classe ImagePanel, l'unica modificata.
I valori ottenuti saranno quelli da immettere come parametri all'interno del metodo drawImage!

package forum; //Serve nell'area di sviluppo dove lavoro
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
*

Title: Risoluzione bug Forum</p>
*

Description:Immagine centrata </p>
*

Copyright: Copyright (c) 2003</p>
*

Company: </p>
* @author ivanet & diabolik860
* @version 1.0
*/

/***************************** CLASSE CHE GESTISCE L'IMMAGINE ***************************/


public class ImagePanel extends JPanel{

/*** Variabili di Classe ***/

private Image image;

/**
@requires richiede i package java.awt, java.awt.event e javax.swing
@effects dopo aver acquisito le impostazioni dello schermo dal sistema operativo crea un frame il quale risulterà un quarto dell'intero schermo
@return restituisce un frame pari ad 1/4 del video contenente un'immagine di sfonfo
*/

public ImagePanel(){

//acquisisce l'immagine
image = Toolkit.getDefaultToolkit().getImage("C:/WINDOWS/BACKGRND.GIF");
MediaTracker tracker = new MediaTracker(this);
tracker.addImage(image, 0); //aggiunge image all'elenco d'immagini da caricare
try{ tracker.waitForID(0);} //attende che siano caricate tutte le immagini con l'id specificato
catch (InterruptedException exception) {}
}//ImagePanel

public void paintComponent(Graphics g){
super.paintComponent(g);

//acquisisce le dimensioni dello schermo
// La classe Toolkit iteragisce con il sistema operativo
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize(); //restituisce la dimensione dello schermo come oggetto Dimension
int screenHeight = screenSize.height / 2; //Ottieni la metà della lunghezza dello schermo
int screenWidth = screenSize.width / 2; //Ottieni la metà della larghezza dello schermo
//disegna l'immagine
int centroAscissaImage=screenWidth - image.getWidth(null)/2; //Metà larghezza schermo (400) meno metà larghezza immagine, ottenendo l'ascissa del centro dell'immagine
int centroOrdinataImage=screenHeight - image.getHeight(null)/2;//Metà lunghezza schermo (300) meno metà lunghezza immagine, ottenendo l'ordinata del centro dell'immagine
g.drawImage(image,centroAscissaImage,centroOrdinat aImage,null);
}//paintComponent

}//ImagePanel{}


ivanet

Loading