Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    33

    Web applet : Problema refresh panel

    Ciao a tutti,
    ho sviluppato una web applet che si occupa di mandare in stampa dei pdf.
    Il mio problema è il seguente:
    Quando cliccko un pulsante (JButton), nel metodo ActionPerformed() rendo lo stesso pulsante cliccato READONLY e modifico un pannello presente nell'applet per informare l'utente circa l'attesa della stampa del pdf...successivamente parte il metodo che si occupa di mandare in stampa il documento (il quale impiega qualche secondo prima di terminare l'esecuzione). Il problema però è che il pulsante diventa readonly solo dopo che il metodo che manda in stampa il documento è terminato..anche il pannello modificato si aggiorna solo al termine della stampa.

    codice:
    public void actionPerformed(ActionEvent e) {
    		String command = e.getActionCommand();
            
    		if (STAMPA_COMMAND.equals(command)) {
    		
    			stampa.setEnabled(false);
    			JPanel areaPrint =  new JPanel();
    			JLabel lab = new JLabel("Wait Printing...");
    			areaPrint.setBackground(Color.magenta);
    			areaPrint.add(lab);
    			scrollArea.getViewport().add(areaPrint); // Quì ho il problema!...il pannello non viene aggiornato prima del ciclo for, ma solo al termine di questo
    			scrollArea.validate();
    			scrollArea.repaint();
    			
    			try {
    				PrintPdf printPDFFile;
    				ArrayList assegniDaStampare = new ArrayList();
    			
    	for(int i=0;i<assegni.size();i++){	
    		DatiAssegno datiAss = (DatiAssegno) assegni.get(i);
    	
    		if(datiAss!=null && datiAss.getStatoAssegno().equals(STATUS_OK)){				
    						printPDFFile = new PrintPdf("Stampa Assegni", datiAss);
    	
    						printPDFFile.print();
    						
    						String servletLocation = "http://localhost/Servlet";
    						
    						//		   connect to the servlet 
    	
    							URL studentDBservlet = new URL( servletLocation ); 
    							URLConnection servletConnection = studentDBservlet.openConnection(); 
    							servletConnection.setUseCaches (false); 
    							servletConnection.setDefaultUseCaches(false); 
    							servletConnection.setDoInput(true);
    							servletConnection.setDoOutput(true);
    	
    							OutputStream outstream = servletConnection.getOutputStream();
    							ObjectOutputStream oos = new ObjectOutputStream(outstream);
    							oos.writeObject(datiAss.idAssegno);
    							oos.flush();
    							oos.close();
    	
    							ObjectInputStream inputFromServlet = new ObjectInputStream(servletConnection.getInputStream());
    							try {
    								String statusSave = (String)inputFromServlet.readObject();
    							} catch (ClassNotFoundException e4) {
    								e4.printStackTrace();
    							}
    				
    					}
    			}							
    				JPanel areaPrint2 =  new JPanel();
    				JLabel lab2 = new JLabel("Print Complete");
    				areaPrint2.setBackground(Color.green);
    				areaPrint2.add(lab2);
    				scrollArea.getViewport().add(areaPrint2);
    			} catch (FileNotFoundException e1) {				
    					//do something
    			} catch (IOException e2) {			
    					//do something
    			}  catch (PrinterException e3) {			
    					//do something
    			}
    		} 
    
    		if (EXIT_COMMAND.equals(command)) {		
    			JSObject win = JSObject.getWindow(appletParent);
    			appletParent.stop();
    			appletParent.destroy();
    			win.eval("self.close()");
    		} 
    	}

    Sapete darmi qualche indicazione utile per risolvere questo problema? Grazie mille!

  2. #2
    Semplice devi lanciare(implementare) un altro Thread che si occupi della stampa. Altrimenti non hai modo di aggiornare l'interfaccia in quanto il thread che si occupa di essa è "impegnato" nella stampa.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    33
    e questo mi permetterebbe di:

    1. modificare il JPanel con la scritta "Wait Printing..."
    2. Eseguire la stampa tramite il nuovo thread
    3. rimodificare il JPanel con la scritta "Print Completed"

    giusto?

  4. #4
    Certo, ovviamente gestendo la comunicazione tra i due thread.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    33
    scusami l'ulteriore domanda (forse da pivello)...che intendi per "gestire la comunicazione tra i 2 thread"?
    In base al codice postato, cosa dovrei fare?

  6. #6
    Praticamente devi fare in modo che il thread principale, cioè quello che gestisce l'interfaccia grafica, venga avvertito quando il thread della stampa finisce, per esempio condividendo una variabile statica etc...

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    33
    ho provato a lanciare un nuovo thread e farlo attendere 10 secondi, per vedere se il pannello cambiava (Almeno alla prima modirfica) in questo modo:


    public void actionPerformed(ActionEvent e) {
    String command = e.getActionCommand();

    if (STAMPA_COMMAND.equals(command)) {

    // Create a PDFFile from a File reference
    stampa.setEnabled(false);
    JPanel areaPrint = new JPanel();
    JLabel lab = new JLabel("STAMPA IN CORSO");
    areaPrint.setBackground(Color.magenta);
    areaPrint.add(lab);
    scrollArea.getViewport().add(areaPrint);
    scrollArea.revalidate();
    scrollArea.repaint();


    try {
    Thread t = new Thread();
    t.sleep(10000);
    } catch (InterruptedException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    }
    JPanel areaPrint2 = new JPanel();
    JLabel lab2 = new JLabel("STAMPA EFFETTUATA");
    areaPrint2.setBackground(Color.green);
    areaPrint2.add(lab2);
    scrollArea.getViewport().add(areaPrint2);
    }

    if (EXIT_COMMAND.equals(command)) {
    JSObject win = JSObject.getWindow(appletParent);
    appletParent.stop();
    appletParent.destroy();
    win.eval("self.close()");

    }
    }
    ma non va..quindi ho non ho capito niente io o la tua idea non funziona...

  8. #8
    Semplicemente perchè con lanciare un nuovo thread io non intedevo creare un thread e laciarlo dalla finestra; ovviamente gli devi dire che cosa deve fare. Leggiti il tutorial della oracle per quanto riguarda l'implementazione di thread.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    33
    Risolto grazie all'utilizzo di SwingWorker.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.