Creare 4 jpanel con immagini diverse

di il
5 risposte

Creare 4 jpanel con immagini diverse

Ciao a tutti,
volevo sapere come faccio a creare 4 jpanel differenti posti in un unico jframe e poi caricare immagini differenti per ogni jpanel...
praticamente a ogni messaggio che mi arriva, leggo l'id del messaggio e in base a questo id cambio l'immagine del jpanel corrispondente... ora ho un unico jpanel e ogni vvolta che mi arriva un messaggio mi si cancella l'iimagine precedente e viene ricreata quella nuova (penso che venga creto un nuovo jpanel tutte le volte, non va bene!!!)...
scusate ma non ne capisco molto di java...

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 static ImagePanel panel;
//public JPanel panel = new JPanel();
public ImagePanel panel;


public void setJFrame() {


frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(WIDTH, HEIGHT);
frame.setResizable(true);
frame.setLocationRelativeTo(null);
frame.validate();
frame.setVisible(true);
}

public void showImage() {

panel= new ImagePanel(BIGMSG.image);  //corretta!!! legge l'immagine dai byte
//JPanel panel = new JPanel();

frame.getContentPane().add(panel, BorderLayout.CENTER);  
panel.setVisible(true); //se false,no si vede niente

panel.setDoubleBuffered(true);// ??? forse serve per una specie di buffer, mi fa vedere tutte le immagini e non solo la fragola
panel.setBackground(Color.white);
panel.setBorder(BorderFactory.createLineBorder(Color.black));
panel.setOpaque(true);
  
}

}

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();
	}

    
    public void paintComponent(Graphics g)
    {
    	if(image!=null){
    		  	super.paintComponent(g);
    		  	g.drawImage(image,BIGMSG.numero_nodo*30,BIGMSG.numero_nodo*30,null);
    	
    	}
        
    }

}

5 Risposte

  • Re: Creare 4 jpanel con immagini diverse

    Dal codice che hai messo si evince che hai una classe ImagePanel, che chiede nel costruttore un immagine (o una stringa) che poi viene disegnata dalla sub apposita, se vuoi avere delle immagini diverse per ogni panel devi istanziare più classi di tipo ImagePanel e passargli come argomento nel costruttore l'immagine per quel pannello, tipo: 

    
    public ImagePanel panel;
    public ImagePanel panel2;
    public ImagePanel panel3;
    public ImagePanel panel4;
    
    panel = new ImagePanel("stringaimmagine1");
    panel2 = new ImagePanel("stringaimmagine2");
    panel3 = new ImagePanel("stringaimmagine3");
    panel4 = new ImagePanel("stringaimmagine4");
    
    //questi componenti li metti nel jframe
    frame.getContentPane().add(panel, BorderLayout.CENTER);
    frame.getContentPane().add(panel2, BorderLayout.CENTER);
    frame.getContentPane().add(panel3, BorderLayout.CENTER);
    frame.getContentPane().add(panel4, BorderLayout.CENTER);
    
    

    Però come hai scritto la classe tu sembra non avere molto senso, infatti erediti i campi di JFrame ma non li utilizzi, infatti dovresti mettere un costruttore e fare una cosa del genere:

    
    public class Finestra extends JFrame
    {
    public Finestra(String TestoTitolo)
    {
    super(TestoTitolo);
    this.setSize(100, 100);
    //accedi ai metodi tramite this
    }
    }
    

    Se controlli nelle varie discussioni avevo messo del codice su come fare a mettere un immagine in un JPanel. Ah il DoubleBuffer serve quando disegni per non dare problemi, in poche parole si tratta di disegnare in un pezzo di memoria invece che subito sul JPanel, in questo modo appena hai finito di disegnare l'immagine viene aggiornata, se venisse aggiornata mentre stai disegnando vedresti un pezzo di JPanel con la nuova immagine, mentre un'altro pezzo resterebbe con quella vecchia, e questi sarebbero problemi, se non sei convinto oppure hai dei dubbi chiedi.

  • Re: Creare 4 jpanel con immagini diverse

    Ciao, grazie dei consigli... sono alle prime armi con java... allora ho modificato un po' il mio programma, ma non ho capito molto bene la seconda parte dei tuoi consigli... così ho aggiunto solo la prima.... non ho usato
    frame.getContentPane().add(panel, BorderLayout.CENTER);
    ma solo perchè li ho inseriti con
    frame.getContentPane().setLayout(new GridLayout(2,2));
    o almeno credo:)

    il problema è che io ricevo deile immagini ogni X sec, ma mi si vede solo la prima immagine che arriva, mentre tutte le altre non si vedono, l'immagine poi non si aggiorna neanche (quindi mi trovo un pannello con un'immagine fissa e tre pannelli vuoti)... io penso che sia un problema di come ho dichiarato le variabili, cosa ne pensi?
    grazie mille
    
    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);
        	
        	}
            
        }
    
    }
    
  • Re: Creare 4 jpanel con immagini diverse

    Puoi mettere il codice di BIGMSG? Si tratta di un thread (extends thread)? Per far si che l'immagine viene aggiornata devi ridisegnare l'interfaccia ogni volta che cambi l'immagine, se ci fai caso in frame.getContentPane() ci dovrebbe essere il metodo repaint() chiamalo alla fine della sub dove scegli le immagini prima che questa ritorni al chiamante (appena sopra la parentesi graffa). Se hai sempre problemi metti il codice che ti ho chiesto.
  • Re: Creare 4 jpanel con immagini diverse

    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, per questo motivo penso che il problema sia solo in questo file che ho postato...

    il repaint non me lo fa già quando faccio
    panel2.resetImage(image2.getImage());

    penso di si...
    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 pure che nel file BIGMSG.java chiamo questo file così:
    
    	
    	DemoImage show1 = new DemoImage();
    if(primo==1){
          	show1.setJFrame();
    primo=0;
    }	
    	show1.showImage(); 
    
  • Re: Creare 4 jpanel con immagini diverse

    Prova a fare questo:
    
    public void paintComponent(Graphics g)
        {
    
              if(image!=null){               
                   g.drawImage(image,10,10,null);
           
           }
           
        }
    
    public void update(Graphics g)
    {
    super.paintComponent(g);
    }
    
    ho sovrascritto la sub update ed ho cancellato il codice super.paintComponent(g); da paintComponent.
    Ho notato che nel codice crei nuove istanze dei pannelli, sia nel momento della dichiarazione che dopo nel metodo setJFrame, fallo solo in questo metodo oppure crea un costruttore tipo:
    
    public DemoImage()
    {
    //istanzia i pannelli qui metti il codice che hai messo in setJFrame
    }
    
    al momento di usare la classe fai una cosa del genere DemoImage di = new DemoImage(); facendo new DemoImage() chiami il costruttore che ti ho scritto sopra e non hai bisogno più del metodo setJFrame.
    Se continua a non funzionare dimmelo che il pezzo di applicazione che ti serve te la scrivo io.

    P.S.
    BIGMSG da dove li prende le immagini? Puoi descrivermi i metodi di questa classe, dimmi più o meno secondo te cosa fanno, però se metti il codice è meglio, altrimenti non posso avere una visione globale dell'applicazione, non ti preoccupare della lunghezza i database sono belli grandi.
Devi accedere o registrarti per scrivere nel forum
5 risposte