prototipo88
06-08-2010, 01:24
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"
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);
}
}
}
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"
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);
}
}
}