Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [JAVA]repaint() JScrollPane???

    Salve a tutti ragazzi!! Sentite, io ho un problema che da troppo tempo mi attanaglia e del quale non riesco a venirne a capo
    Ho fatto un Applet con le Swing di Java, così impostato:
    L'applet ha un JTabbedPane...in tale modo ho una visione a schede dell'applet...in ogni scheda c'è un JPanel se la scheda relativa sarà di comandi, oppure un JInternalFrame se la scheda conterrà un'immagine (potendo così inserire all'interno un JScrollPane e scorrere l'immagine se questa è più grande delle dimensioni dell'applet). In una di queste schede con comandi (JPanel) ho inserito un bottone, il quale una volta premuto fa partire un Thread che mi crea delle immagini sull'HD(ma ciò è poco importante ) ...il problema viene ora VVoVe: le schede che dovrebbero contenere le immagini dovrebbero essere aggiornate in base alle immagini appena create sul disco...ho implementato dunque la seguente classe considerando che sarà la classe che gestirà le immagini nelle relative schede....Il problema è che gestisce le immagini in maniera corretta solo alla prima esecuzione (cioè alla prima pigiata del bottone)...alla seconda volta le immagini restano le stesse, anche se il Thread attivato dalla premuta del bottone genere le immagini diverse

    ...Spero di essere stato abbastanza chiaro per poter essere aiutato...PLEASE HELP
    codice:
    /*
     * Created on 28-mag-2005
     *
     */
    package GUI;
    
    import javax.swing.*;
    import java.awt.*;
    
    /**
     * @author Giovanni
     *
     * TODO To change the template for this generated type comment go to
     * Window - Preferences - Java - Code Style - Code Templates
     */
    
    public class ImageScroll extends JInternalFrame{
    	public JLabel label;
    	public JScrollPane scrollPane;
    	public JPanel topPanel;
    	public String title;
    	public ImageIcon image;
    	
    	private class changeImageThread extends Thread {
    		private ImageScroll is;
    		
    	public changeImageThread(ImageScroll imgscroll) {this.is=imgscroll;}
    		
    		public void run(){
    			is.label.setIcon(is.image);
    			is.repaint();
    			}	
    	}
    	
    	
    	//costruttore
    	public ImageScroll(Image immagine,String titolo) {
    	super();
    	title=titolo;
    	setTitle(titolo);
    	topPanel=new JPanel();
    	topPanel.setLayout(new BorderLayout());
    	getContentPane().add(topPanel);
    	image=new ImageIcon(immagine);
    	label=new JLabel(image);
    	scrollPane=new JScrollPane();
    	scrollPane.getViewport().add(label);
    	topPanel.add(scrollPane);
    	setVisible(true);
    	}
    	
    	
    	
    	public void changeImage(Image newimage) {
    		this.image=new ImageIcon(newimage);
    		changeImageThread cit=new changeImageThread(this);
    		cit.start();
    		}
    }

  2. #2
    vedo che nessuno ancora è riuscito a illumirmi d'immenso ahimè...allora ve la propongo in maniera più semplice...dimenticando il casino sopra fatto che può sviare (JTabbedPane, JScrollPane etc...)...vorrei semplicemente riuscire a fare un'applet che ha un bottone il quale una volta pigiato visualizza all'interno di esso (dell'applet appunto) delle immagini jpeg situate in una data cartella (una sorta di album fotografico con un bottone tipo "foto successiva")....quello che in fondo mi interessa è capire come funziona il repaint()..THANX

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Ciao! Prima ancora di leggere il codice, ho letto quel che vuoi fare (scrivere via Applet o far leggere qualcosa ad una Applet). Soprattutto la scrittura è un'operazione alquanto delicata (problemi di sicurezza). Anche per quanto riguarda la lettura ci sono delle restrizioni... sei sicuro che tu non stia facendo pescare all'applet file a cui non potrebbe accedere? Magari da qualche parte ti si solleva un'eccezione che gestisci poco (tipo blocco try catch vuoto), e non ti accorgi di eventuali errori. Sono solo supposizioni, chiaramente.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  4. #4
    Si, l'applet è poco utile (non sarà mai presente e funzionante su un sito appunto perchè scrivere e leggere dall'hd comporterebbe problemi di sicurezza ovviabili applicando la firma digitale...il che comporterebbe non pochi casini seguenti)
    ...E' un applet a scopo didattico (un laboratorio)
    ...Questo applet scrive e legge sull'hd del computer su cui è eseguito e non sarà mai integrato in una pagina web (per la questione sopra...sempre a meno che non si faccia uso di una firma digitale-mi sembra)..Utilizza JFilechooser per scegliere la directory dove scrivere le immagini e per scegliere l'eseguibile (graphviz...è un programma che genera grafi) per creare le immagini..l'applet funziona, nel senso che genera le immagini nella cartella temporanea...
    il problema che non riesco ad aggiornare le immagini nell'applet...o meglio metti che io abbia un bottone "genera"...il mio obiettivo è quello, una volta premuto tale bottone, di generare delle immagini (nella cartella prescelta) e di farle vedere all'interno dell'applet...tutto ok per quanto riguarda la "generazione"..il problema è nella visualizzazione, nel senso che ad ogni "pigiata" del bottone queste immagini cambiano (in base ad una stringa inserita dall'utente)..vengono create e messe nella directory prescelta, ma la visualizzazione è corretta solo alla prima "pigiata" del bottone...provo a fare un esempio pratico ( :master: spegare a parole mi è difficile):
    1. l'utente sceglie directory su cui verranno scritte le immagini e l'eseguibile del programma che le genererà in base ad una stringa che lo stesso utente inserirà.
    2. l'utente inserisce la stringa e pigia il bottone
    3. Alla pigiata del bottone viene generata un'immagine, chiamamola "immagineA" nella directory scelta dall'utente
    4. L'applet si aggiorna visualizzando l'immagineA
    ....
    ora, se volesse generare un'altra immagine, "immagineB", l'utente inserisce un'altra stringa, ripigia il bottone....e sull'applet resta visualizzata l'immagineA, mentre sulla directory da lui scelta c'è l'immagineB, cioè quella che dovrebbe essere visualizzata..... :rollo:
    :master:
    ......in fondo non riesco a fare il repaint(), ma non so perchè...se avessi un esempio prenderei spunto...ho provato anche a fare repaint in un thread..

  5. #5
    complimenti per l'anno di nascita...GRENDE ANNATA il 79!!

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    ok, ho del codice che funziona

    codice:
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    
    public class imageScroller extends JFrame implements ActionListener {
      
      private JLabel img = new JLabel();
      private JTextField imgt = new JTextField(20);
      private JButton imgb = new JButton("Set Image");
      private JScrollPane scr;
      private JPanel north = new JPanel();
    
      public void actionPerformed (ActionEvent ae) {
        this.remove(scr);
        img = new JLabel(new ImageIcon(imgt.getText()));
        scr = new JScrollPane(img);
        this.getContentPane().add(scr, BorderLayout.CENTER);
        this.validate();
      }
      
      public imageScroller() {
        super("Scroller di Immagini");
        this.setSize(400, 300);
        north.setLayout(new FlowLayout());
        north.add(imgt);
        north.add(imgb);
        img = new JLabel(new ImageIcon("Immagine.jpg"));
        
        this.getContentPane().setLayout(new BorderLayout());
        this.getContentPane().add(north, BorderLayout.NORTH);
        scr = new JScrollPane(img);
        scr.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        scr.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        this.getContentPane().add(scr, BorderLayout.CENTER);
        scr.setVisible(true);
        imgb.addActionListener(this);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
      }
      
      public static void main (String[] args) {
        imageScroller ims = new imageScroller();
      }
    }
    In altre parole elimino lo scrollpane e ne creo uno nuovo: vedi se lo adatti con i gli internal frames.

    79, già già
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  7. #7


    Mitico!!! provo e ti saprò dire...e se funzia ti offro una birra!!!!

    THANX!!!!!!!

  8. #8
    Purtroppo nada...il fatto è che le immagini creato hanno lo stesso nome...in paratica mi servirebbe una spece di refresh...anche col tuo applet caricata un'immagine, diciamo immagine A, poi caricata immagine B, cambiata immagine A con un'altra immagine, ricaricata immagine A...resta quella caricata per prima....il mio problema è simile al problema sorto per una webcam in una discussione sempre di questo forum...l'immagine sull'hd ha lo stesso nome, ma cambia (quindi solo l'url è lo stesso)....provo anchio con Mediatracker

  9. #9

    Risolto.....bastava fare, al momento di cambiare immagine, un semplce flush() dell'Image e un repaint()...e io che ci ho perso tutto sto tempo

    Comunque grazie!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.