Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Volkswagen ID.4, SUV elettrico per la famiglia che convince
Volkswagen ID.4, SUV elettrico per la famiglia che convince
La declinazione SUV elettrica per Volkswagen prende il nome di ID.4 e abbiamo avuto l'occasione di provarla. Ecco le nostre impressioni, test prestazionali, consumi e tante considerazioni che non sono mai troppe per un settore ancora difficile da digerire per l'utente abituato alle care e vecchie auto con motore termico.
iPad mini 6 contro iPad 9: il più piccolo contro il più economico. La recensione
iPad mini 6 contro iPad 9: il più piccolo contro il più economico. La recensione
Due tablet molto diversi accomunati da un sistema operativo uguale sempre più completo e professionale. iPad mini 6 e iPad 9 sono agli antipodi: uno piccolo, fortemente portatile e con processore di ultimissima generazione. L’altro con il prezzo più basso tra i tablet di Apple e con il supporto alla Apple Pencil di prima generazione. Quale scegliere e perché?
Recensione FIFA 22: ecco com'è su Google Stadia
Recensione FIFA 22: ecco com'è su Google Stadia
FIFA 22 introduce la nuova tecnologia HyperMotion, presente però solo sulle console di nuova generazione e nella versione Google Stadia, non in quella Windows PC. Ecco perché abbiamo deciso di provarlo su Stadia, incontrando però qualche limitazione...
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-02-2010, 20:47   #1
Player1
Senior Member
 
Iscritto dal: Feb 2002
Messaggi: 1370
[Java - Swing] Come applicare una immagine di sfondo ad un JPanel?

Ciao a tutti, ho un piccolo problema con l'utilizzo dei file immagine nelle applicazioni java che fanno uso di swing.
Vorrei realizzare una semplice finestra di dimensioni fisse che visualizza una immagine di sfondo e sopra questa immagine alcune icone più piccole posizionate in vari punti di coordinate x,y.
Usando Netbeans ho creato un JFrame di dimensione fissa (uguale a quella dell'immagine di sfondo, una semplice gif).
Dentro il JFrame ho inserito un JPanel vuoto che lo occupa interamente.
Come posso fare a mettere come sfondo del JPanel l'immagine gif?
Ed a posizionare delle altre icone gif all'interno del JPanel, sopra lo sfondo?
Grazie a tutti in anticipo per le risposte.
Ciao.
Player1 è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2010, 23:58   #2
Player1
Senior Member
 
Iscritto dal: Feb 2002
Messaggi: 1370
Posto anche il costruttore del JFrame:
Codice:
public mainFrame() {
		initComponents();
		Graphics g= jPanel1.getGraphics();
		g.drawImage(immagineDiSfondo,0,0,null);
		jPanel1.setVisible(true);
    }
Non riesco a capire dov'è l'errore, appare una finestra grigia.
Player1 è offline   Rispondi citando il messaggio o parte di esso
Old 07-02-2010, 00:42   #3
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Lo stato dell'oggetto "Graphics" restituito dai metodi getGraphics è temporaneo. In un certo senso non è sbagliato dire:

Graphics g= jPanel1.getGraphics();
g.drawImage(immagineDiSfondo,0,0,null);

ma quello che succede è che al primo aggiornamento di jPanel1 "g" viene cancellato e la tua immagine, che pure per un attimo è stata effettivamente disegnata, sparisce. Per rendere "permanente" il tuo disegno devi fare in modo che il:

g.drawImage(immagineDiSfondo,0,0,null);

sia invocato ogni volta che "g" viene aggiornato.

Per farla breve, un modo per garantire questa invocazione è mettere le istruzioni di disegno nel metodo paintComponent del componente AWT/Swing sul cui sfondo vuoi che appaiano i tuoi effetti.

Ti faccio un esempio: qui disegno un quadrato bianco ma puoi benissimo mettere le istruzioni per il disegno di una o più immagini.

Codice:
import java.awt.*;
import javax.swing.*;

public class Main {

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				new Main().startTest();
			}
		});
	}
	
	private void startTest() {
		JFrame finestra = new JFrame("Finestra");
		JPanel pannello = new JPanel() { //nota che con l'apertura della graffa creiamo una sottoclasse di JPanel
		
			@Override
			protected void paintComponent(Graphics graphics) {
				super.paintComponent(graphics);
				
				graphics.setColor(Color.WHITE);
				graphics.fillRect(0, 0, 100, 100);
			}
		};
		finestra.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		finestra.add(pannello);
		finestra.setSize(640, 480);
		finestra.setVisible(true);
	}
}
Il metodo paintComponent viene invocato automaticamente da Swing ogni volta che il framework rileva la necessità di aggiornare il componente. in questo metodo noi abbiamo messo le nostre istruzioni di disegno, quindi queste istruzioni saranno parimenti eseguite ogni volta che il framework dovrà determinare l'aspetto del componente.

Nota che la sovrascrittura non altera il comportamento del componente in quanto contenitore. Significa che puoi continuare a usare "pannello" come un qualsiasi altro JPanel. Se gli aggiungi dei componenti il risultato sarò che il tuo disegno apparirà sotto ai componentei aggiunti (questo per via dell'ordine di invocazione di paintComponent che precede un suo omologo, paintChildren, il quale disegna i componenti contenuti in un contenitore).
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 07-02-2010, 11:56   #4
Player1
Senior Member
 
Iscritto dal: Feb 2002
Messaggi: 1370
Grazie mille, ho provato a fare come dici tu e funziona perfettamente.
Tuttavia vorrei fare una piccola modifica e non ci riesco per via di NetBeans.
In pratica invece di utilizzare questa definizione di pannello
Codice:
JPanel pannello = new JPanel {...}
vorrei creare una classe "extendedJPanel" con tutti i metodi che mi serviranno per gestire al meglio lo sfondo e le icone

Codice:
private class extendedJPanel extends JPanel{
	@Override
	protected void paintComponent(Graphics graphics) {...}

	public int metodo1(){...}
	...
	public int metodoN(){...}
}
e poi fare
Codice:
extendedJPanel pannello = new extendedJPanel();
Purtroppo utilizzando netbeans non so come includere questo nuovo oggetto di tipo "extendedJPanel" nel JFrame principale poichè nel designer di netbeans ovviamente è presente solo JPanel (e non extendedJPanel) ed il codice relativo alla grafica non può essere modificato a mano (solo trascinando un oggetto dalla palette).
Tu usi NetBeans o Eclipse?
Sai per caso come posso risolvere questo problema ed inserire il mio extendedJPanel nel JFrame principale?
Grazie
Player1 è offline   Rispondi citando il messaggio o parte di esso
Old 07-02-2010, 13:47   #5
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Premetto che i GUI designer (qualsiasi GUI designer) vanno bene per fare interfacce semplici - del genere che forse non varrebbe neanche la pena di fare.

Comunque una soluzione è questa: creare un tuo tipo di componente da aggiungere al pannello dei componenti del gui builder di netbeans.

new project -> java class library -> next
project name -> "PaintablePanel" -> next


new file -> Java class -> class name: PaintablePanel, package "xyz" -> finish

Codice:
package xyz;

import java.awt.Graphics;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.JPanel;

public class PaintablePanel extends JPanel {
    public static interface Painter {

        void paint(Graphics g, JComponent target);
    }
    
    private final List<Painter> LAYERS = new ArrayList<Painter>(5);

    public void addPainter(Painter p) {
        LAYERS.add(p);
    }

    public void removePainter(Painter p) {
        LAYERS.remove(p);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        for(int i = 0; i < LAYERS.size(); i++) {
            LAYERS.get(i).paint(g, this);
        }
    }
}
Clean and build

Menu "tools" -> Palette -> "Swing/AWT Components"

"New category" -> "Custom Components" -> Ok

Premi "Add from jar"
seleziona il jar "PaintablePanel" che trovi nella cartella "dist" del progetto "PaintablePanel" (es: x:\PaintablePanel\dist\PaintablePanel.jar)
premi next
nella lista trovi "PaintablePanel", selezionalo e premi "next"
Seleziona la categoria "Custom Components" e premi "finish"
Premi close per chiudere il Palette Manager

A questo punto hai il tuo componente nella palette del gui builder, sotto la voce "Custom Components".

Cos'ha di particolare questo PaintablePanel? Direi niente a parte il fatto che ti permette di fare qualcosa che è concettualmente simile al tuo primo tentativo:

Graphics g = pannello.getGraphics();
g.drawqualcosa

cioè ti permette definire una o più procedure di disegno da applicare ad un componente dichiarandole al di fuori della classe del componente.

Per fare una prova, crea un nuovo progetto "test" e aggiungi un JFrame Form . Trascina dalla palette sulla destra "PaintablePanel" nel form.

Premi "Source"

Nel costruttore del form trovi un "initComponents". Dopo questo initComponents scrivi:

Codice:
        Painter painter = new Painter() {

            public void paint(Graphics g, JComponent target) {
                int w = target.getWidth();
                int h = target.getHeight();
                g.setColor(Color.PINK);
                g.fillRect(0, 0, w / 2, h / 2);
            }
        };
        this.paintablePanel1.addPainter(painter);
Se testi il tuo form vedrai che adesso un pezzo del pannello che hai inserito è diventato rosa. Accade perchè PaintablePanel nel suo paintComponent richiama tutti i "Painter" che stanno nella sua lista LAYERS e noi aggiungiamo a questa lista un certo "Painter" che colora di rosa una porzione di quel PaintablePanel.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 07-02-2010, 17:47   #6
Player1
Senior Member
 
Iscritto dal: Feb 2002
Messaggi: 1370
Fantastico!!!
Fa esattamente quello che volevo come volevo
Grazie mille!
Player1 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Volkswagen ID.4, SUV elettrico per la famiglia che convince Volkswagen ID.4, SUV elettrico per la famiglia c...
iPad mini 6 contro iPad 9: il più piccolo contro il più economico. La recensione iPad mini 6 contro iPad 9: il più piccolo...
Recensione FIFA 22: ecco com'è su Google Stadia Recensione FIFA 22: ecco com'è su Google ...
Sony rinnova il 70-200mm F2.8: più leggero e veloce, con la qualità dei GMaster Sony rinnova il 70-200mm F2.8: più legger...
Sapphire Pulse RX 6600 8GB, piccolissima ma con ciò che serve per giocare in Full HD Sapphire Pulse RX 6600 8GB, piccolissima ma con ...
Tutti vogliono la Porsche elettrica: la ...
Monopattino elettrico, allo studio l'obb...
Il mini-frigorifero a forma di Xbox Seri...
Criptovalute a corso legale: nel 2022 al...
"Il quarto stato" di Giuseppe ...
Amazon: SCONTI da fuori di testa in ques...
Call of Duty: Vanguard, la modalit&agrav...
VivoBook Pro e Pro X, ASUS porta in Ital...
Bonus Rottamazione TV: erogati più...
Latitude Rugged, i nuovi portatili 'estr...
Pochi giorni allo spegnimento dei canali...
Colpo di reni del Governo: rifinanziati ...
Axiom Space continua lo sviluppo della s...
TSMC conferma l'impianto produttivo in G...
Tesla Model S Plaid torna al Nürbur...
K-Lite Mega Codec Pack
K-Lite Codec Pack Full
K-Lite Codec Pack Standard
K-Lite Codec Pack Basic
K-Lite Codec Pack Update
Opera Portable
Opera 80
SmartFTP
LibreOffice 7.2.2
PCMark 10 Basic Edition
Prime95
Skype
Advanced SystemCare
ZoneAlarm Antivirus + Firewall
Dropbox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 11:11.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
Served by www2v