Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Il primo headset open-back della linea INZONE arriva a 200 euro con driver derivati dalle cuffie da studio MDR-MV1 e un peso record di soli 199 grammi
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA
Al .NEXT 2026 di Chicago, Nutanix ha mostrato quanto sia cambiata: una piattaforma software che gestisce VM, container e carichi di lavoro IA ovunque, dall’on-premise al cloud pubblico. Con un’esecuzione rapidissima sulle partnership e sulla migrazione da VMware
Recensione Xiaomi Pad 8 Pro: potenza bruta e HyperOS 3 per sfidare la fascia alta
Recensione Xiaomi Pad 8 Pro: potenza bruta e HyperOS 3 per sfidare la fascia alta
Xiaomi Pad 8 Pro adotta il potente Snapdragon 8 Elite all'interno di un corpo con spessore di soli 5,75 mm e pannello LCD a 144Hz flicker-free, per un tablet che può essere utilizzato con accessori dedicati di altissima qualità. Fra le caratteristiche esclusive, soprattutto per chi intende usarlo con la tastiera ufficiale, c'è la modalità Workstation di HyperOS 3, che trasforma Android in un sistema operativo con interfaccia a finestre
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-08-2010, 01:24   #1
prototipo88
Junior Member
 
Iscritto dal: Apr 2009
Messaggi: 8
[JAVA] - problema jpanel immagini dinamiche

ciao a tutti... ho un'applicazione dove arrivano messaggi, io voglio visualizzare l'immagine collegata al nodo che invia il messaggio in un jpanel associato... ad esempio arriva messaggio del nodo 5, creo un'immagine A nel jpanel1, invece dal nodo 6, creo immagine B nel jpanel2... quindi si dovrebbe modificare l'immagine del jpanel dinamicamente...
il problema è che viene visualizzata solo la PRIMA immagine associata al PRIMO messaggio ricevuto... se arriva prima il messaggio del nodo 5, viene visualizzata solo A, e viceversa...
può essere un problema dovuto alla dichiarazione delle variabili?
premetto che non capisco molto di java... ... grazie a tutti

//BIGMSG.nome è il nome dell'immagine.. es: "fragola.jpg"

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


public class DemoImage extends JFrame {

public static JFrame frame = new JFrame("My JFrame");
public static int WIDTH=300;
public static int HEIGHT=300;
public ImagePanel panel1 = new ImagePanel("");
public ImagePanel panel2 = new ImagePanel("");
public ImagePanel panel3 = new ImagePanel("");
public ImagePanel panel4 = new ImagePanel("");

public void setJFrame() {


frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(WIDTH, HEIGHT);
frame.setResizable(true);
frame.setLocationRelativeTo(null);
frame.validate();
frame.setVisible(true);
frame.getContentPane().setLayout(new GridLayout(2,2)); 
frame.pack();

panel1= new ImagePanel("");
panel1.setDoubleBuffered(true);
panel1.setBackground(Color.white);
panel1.validate();
panel1.setVisible(true);
panel1.setBorder(BorderFactory.createLineBorder(Color.black));

panel2= new ImagePanel("");
panel2.setDoubleBuffered(true);
panel2.validate();
panel2.setVisible(true);
panel2.setBorder(BorderFactory.createLineBorder(Color.black));

panel3= new ImagePanel("");
panel3.setDoubleBuffered(true);
panel3.validate();
panel3.setVisible(true);
panel3.setBorder(BorderFactory.createLineBorder(Color.black));

panel4= new ImagePanel("");
panel4.setDoubleBuffered(true);
panel4.validate();
panel4.setBackground(Color.white);
panel4.setVisible(true);
panel4.setBorder(BorderFactory.createLineBorder(Color.black));



frame.getContentPane().add(panel1, BorderLayout.NORTH); 
frame.getContentPane().add(panel2, BorderLayout.EAST); 
frame.getContentPane().add(panel3, BorderLayout.SOUTH); 
frame.getContentPane().add(panel4, BorderLayout.WEST); 
frame.validate();
frame.setVisible(true);

}


 // Aggiorna l'ImagePanel corretto con la nuova immagine.
 // BIGMSG contiene sia l'id del pannello da aggiornare
 // che l'immagine.

public void showImage() {


if(BIGMSG.numero_nodo==5){  //se è 5 tutto ok, se è 6, non mi fa vedere l'immagine, anche se entra nel ciclo
//RETTIFICA... anche il 6 funziona, solo se il 5 non crea l'immagine.. che cosa strana
panel1.resetImage(BIGMSG.image);
panel1.validate();
}
 if(BIGMSG.numero_nodo==6){ //metto l'else solo per ora... ma perchè == 6 non stampa niente? secondo me sta troppo poco tempo con BIGMSG.numero_nodo a 6
panel2.resetImage(BIGMSG.image);
panel2.validate();
}

if(BIGMSG.numero_nodo==7){
panel3.resetImage(BIGMSG.image);
panel3.validate();
}

if(BIGMSG.numero_nodo==8){ //in teoria dovrebbe essere  8
panel4.resetImage(BIGMSG.image);
panel4.validate();
}
/*
if(BIGMSG.numero_nodo==6){
ImageIcon image2  = new ImageIcon();
image2 = new ImageIcon(BIGMSG.nome);
panel2.resetImage(image2.getImage());
}
*/

frame.validate();

  
}

}

class ImagePanel extends JPanel{
	
	private Image image;
	private Dimension dim=null;
	
	public ImagePanel(String image) {
    	  this(new ImageIcon(image).getImage());
 	 }

	public ImagePanel(Image image){
		this.image=image;
		dim=new Dimension();
		dim.width=WIDTH;
		dim.height=HEIGHT;
		setPreferredSize(dim);  	
	}
	
	public void resetImage(Image image){
		
		this.image=image;
		repaint();
 		
                
	}



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

    		if(image!=null){    		  	
    		  	g.drawImage(image,10,10,null);
    	
    	}
        
    }

}
prototipo88 è offline   Rispondi citando il messaggio o parte di esso
Old 06-08-2010, 15:19   #2
tylerdurden83
Senior Member
 
Iscritto dal: Nov 2004
Messaggi: 691
Prova questo:

Codice:
package testimmagine;

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

public class DemoImage extends JFrame {
    private JPanel panel1;
    private JPanel panel2;
    private JPanel panel3;
    private JPanel panel4;
    private static final ImageIcon ICONA = new ImageIcon("C:\\Documents and Settings\\User15\\Documenti\\Immagini\\assist_listening.jpg");

    private static JPanel createNewJPanel(Color color){
        JPanel panel = new JPanel();
        panel.setBackground(color);
        panel.setDoubleBuffered(true);
        panel.setBackground(Color.white);
        panel.setBorder(BorderFactory.createLineBorder(Color.black));
        return panel;
    }

    public DemoImage() {
        //Create and set up the window.
        super("My JFrame");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        this.panel1 = createNewJPanel(Color.black);
        this.panel2 = createNewJPanel(Color.white);
        this.panel3 = createNewJPanel(Color.black);
        this.panel4 = createNewJPanel(Color.white);

        this.setLocationRelativeTo(null);
        this.getContentPane().setLayout(new GridLayout(2,2));

        this.getContentPane().add(this.panel1, BorderLayout.NORTH);
        this.getContentPane().add(this.panel2, BorderLayout.EAST);
        this.getContentPane().add(this.panel3, BorderLayout.SOUTH);
        this.getContentPane().add(this.panel4, BorderLayout.WEST);

        this.pack();
        this.setVisible(true);
    }

    public void showImage(int pannello) {
        if(pannello==5){  //se è 5 tutto ok, se è 6, non mi fa vedere l'immagine, anche se entra nel ciclo
            this.panel1.add(new JLabel(ICONA));
        }
        if(pannello==6){ //metto l'else solo per ora... ma perchè == 6 non stampa niente? secondo me sta troppo poco tempo con BIGMSG.numero_nodo a 6
            this.panel2.add(new JLabel(ICONA));
        }
        if(pannello==7){
            this.panel3.add(new JLabel(ICONA));
        }
        if(pannello==8){ //in teoria dovrebbe essere  8
            this.panel4.add(new JLabel(ICONA));
        }
        this.pack();
        this.setLocationRelativeTo(null);
    }

    public static void main(String[] args) throws InterruptedException {
        SwingUtilities.invokeLater(new Runnable() {
            @Override public void run() {
                DemoImage demoImage = new DemoImage();
                demoImage.showImage(5);
                demoImage.showImage(6);
            }
        });
    }
}
tylerdurden83 è offline   Rispondi citando il messaggio o parte di esso
Old 06-08-2010, 18:40   #3
*andre*
Senior Member
 
Iscritto dal: Sep 2007
Messaggi: 1071
in che modo prendi le immagini?
che può essere che ci sia l'oggetto e non sia nullo ma l'immagine dentro non ci sia, e poi aggiungi di disegnarla con altezza e larghezza WIDTH HEIGHT a meno che non sei sicuro che siano tutte e due 300
__________________
Affari: ariakasneverborne, PanCar, Luk@°°°, Fabio310, kintaro oe, krike, fabry180384, dariox am2, chiadoz, windsofchange, dado1979, Rudyduca, aleforumista, Sheva77
*andre* è offline   Rispondi citando il messaggio o parte di esso
Old 11-08-2010, 08:09   #4
prototipo88
Junior Member
 
Iscritto dal: Apr 2009
Messaggi: 8
il codice del BIGMSG è lunghissimo, non lo metto che tanto non si capisce niente ... però praticamente salva un'array di byte che sarebbe la mia immagine da visualizzare con l'id nel sensore che la invia (BIGMSG.numero_nodo==8)...
però arriva tutto correttamente, ne sono certo, in quanto la prima immagine si vede bene... e il codice che arriva dopo è giusto... per questo motivo penso che il problema sia solo in questo file che ho postato...

quindi o sbaglio qualcosa nel layout, o sono le variabili... o non ne ho idea...
praticamente mi fa vedere solo la prima immagine e poi è come se si bloccasse... (non si aggiorna nemmeno la stessa immagine)

Aggiungo che nel file BIGMSG.java chiamo questo file così:

Codice:
	
	DemoImage show1 = new DemoImage();
if(primo==1){
      	show1.setJFrame();
primo=0;
}	
	show1.showImage();

Ultima modifica di prototipo88 : 11-08-2010 alle 09:13.
prototipo88 è offline   Rispondi citando il messaggio o parte di esso
Old 11-08-2010, 11:13   #5
tylerdurden83
Senior Member
 
Iscritto dal: Nov 2004
Messaggi: 691
Il codice che t'ho postato ti funziona no?
tylerdurden83 è offline   Rispondi citando il messaggio o parte di esso
Old 11-08-2010, 17:11   #6
prototipo88
Junior Member
 
Iscritto dal: Apr 2009
Messaggi: 8
Quote:
Originariamente inviato da tylerdurden83 Guarda i messaggi
Il codice che t'ho postato ti funziona no?
si, il tuo codice funziona, mi fa vedere l'immagine nel pannello 5 e 6... però come faccio a implementarlo nel mio programma? nel senso che questo DemoImage.java ha un suo main, io il vero main lo voglio nel BIGMSG.java ... o va bene lo stesso avere 2 main diversi??
Dal BIGMSG.java richiamo la funzione così:
Codice:
show1.showImage(nodo);
dove nodo è il numero del sensore che invia l'immagine, così da selezionare il pannello corretto... Però così non mi perdo tutta la parte del :
Codice:
SwingUtilities.invokeLater(new Runnable() {
            @Override public void run() {
                DemoImage demoImage = new DemoImage();
                demoImage.showImage(5);
                demoImage.showImage(6);
            }
        });
il problema che ho ora è che mi si apre a ogni immagine che mi arriva una nuova finestra... quindi al termine del programma ho tanti jframe aperti...
come lo sistemo?
grazie

Ultima modifica di prototipo88 : 11-08-2010 alle 17:15.
prototipo88 è offline   Rispondi citando il messaggio o parte di esso
Old 11-08-2010, 18:31   #7
tylerdurden83
Senior Member
 
Iscritto dal: Nov 2004
Messaggi: 691
Quote:
Originariamente inviato da prototipo88 Guarda i messaggi
nel senso che questo DemoImage.java ha un suo main, io il vero main lo voglio nel BIGMSG.java ... o va bene lo stesso avere 2 main diversi??
Avere due main non è un problema, tanto sempre e solo uno è eseguito allo startup dell applicazione. Io avevo messo un main nella mia classe per lanciarla e testarla, puoi anche levarlo chiaramente.

Dove prima lanciavi

Codice:
DemoImage show1 = new DemoImage();
adesso devi mettere

Codice:
SwingUtilities.invokeLater(new Runnable() {
            @Override public void run() {
                DemoImage demoImage = new DemoImage();
            }
});
Poi devi cambiare il mio metodo

Codice:
public void showImage(int pannello) {...}
che ho messo in modo da prendere un int che rappresentava uno dei quattro pannelli e lo settava con una icona statica presa a caso dal mio pc perchè non avevo il codice di BIGMSG da cui far prendere l'id del pannello, l'immagine etc. Non dovresti avere problemi a modificarlo per usare il tuo codice.

Attenzione al BIGMSG, mi pare di capire che è una classe enorme che fa molte cose diverse, il che non è corretto. Anche la gui dovrebbe essere completamente slegata dal resto.

EDIT: rivedendo il tuo codice direi che show1.setJFrame(); era veramente superfluo, una volta inizializzato il frame non lo devi ricostruire tutte le volte, e se non è corretto che ne compaiano piu d'uno, penserei ad adottare il design pattern singleton

Ultima modifica di tylerdurden83 : 11-08-2010 alle 18:41.
tylerdurden83 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori Sony INZONE H6 Air: il primo headset open-back d...
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA Nutanix cambia pelle: dall’iperconvergenza alla ...
Recensione Xiaomi Pad 8 Pro: potenza bruta e HyperOS 3 per sfidare la fascia alta Recensione Xiaomi Pad 8 Pro: potenza bruta e Hyp...
NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abb...
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz ASUS ROG Swift OLED PG34WCDN recensione: il prim...
Ecovacs presenta la gamma 2026: paviment...
Efficienza energetica fino a 2.000 volte...
Lenovo 360: il programma di canale dell'...
Appena 10.000 qubit per rompere la critt...
Analisi dei transistor durante il funzio...
Attacco informatico a Booking.com: espos...
A quattro mesi dal divieto dei social ne...
NVIDIA GeForce RTX 5060 e 5060 Ti: in ar...
Rebellions, Arm e SK Telecom, nuova alle...
Modernizzazione delle app: Red Hat OpenS...
Nel mirino di Google c'è il back ...
PRAGMATA in bundle con GeForce RTX 5000:...
Le novità MOVA per il 2026: robot e impi...
Windows, stop all'attivazione telefonica...
ASUS porta la serie TUF nel formato Mini...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
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: 01:10.


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