Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [Java Application] JProgressBar non visualizzata correttamente

    Ciao!
    Mi scuso fin da ora per la mancanza di commenti nel codice che ho dovuto rimuovere per restare nei 13k caratteri di limite

    Ho un problema alquanto strano dal quale non riesco ad uscire.. Allora prima di tutto ho creato una classe "ProgressBar" che estende JFrame. La classe in questione tramite i metodi open(), close(), setPbValue(int i) controlla e modifica la finestra che contiene la progress bar.
    I sorgenti per comodità li piazzo tutti nel fondo del messaggio
    Ora, testando la classe così com'è questa funziona e la progressbar scorre senza problemi.

    Nel momento in cui io vado ad istanziare un oggetto di ProgressBar in un'altra classe ho il problema che non avviene correttamente il refresh della barra di progressione e quindi rimane un "pop-up" bianco fino al termine dell'operazione. Perchè dico che non avviene il refresh? Perchè in un ciclo di prova
    codice:
    ProgressFrame prog = new ProgressFrame(title);
    prog.open();
    for(int i=0; i<=100; i++) {
      prog.setPbValue(i%1);
      JOptionPane.showMessageDialog(null,"pause until ok");
    }
    prog.close();
    ogni volta che l'applicazione si ferma a causa del message dialog che aspetta l'input da parte dell'utente la finestra aperta da ProgressFrame è disegnata correttamente sullo schermo con il valore corretto.
    Se invece io rimuovo il comando
    codice:
    JOptionPane.showMessageDialog(null,"pause until ok");
    la finestra contenente la progress bar non si visualizza correttamente. In particolare rimane bianca (senza nemmeno l'indicazione del titolo o scritta alcuna) durante tutta l'esecuzione del ciclo.
    Ho provato a modificare il ciclo in modo da inserire un ritardo causato da
    codice:
    Thread.pause(100);
    ma non ottengo nessun miglioramento.
    È interessante notare che il metodo
    codice:
    public void setPbValue(int i) {
      pb.setValue(i);
      System.err.println("\t PB: "+pb.getValue()+"/100");
    }
    stampa correttamente sulla console il valore corretto di pb.

    Vi posto qui le tre classi del mio progetto:
    ProgressBar.java
    codice:
    package programmi;
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.HeadlessException;
    import java.awt.Toolkit;
    
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JProgressBar;
    
    public class ProgressFrame extends JFrame {
    	private static final long serialVersionUID = 1L;
    	private static Tools t = new Tools();
    	private JFrame win = new JFrame();
    	private static JLabel titleLabel;
    	private static JLabel versionLabel;
    	private static JPanel NPanel = new JPanel();
    	private static JPanel CPanel = new JPanel();
    	private JProgressBar pb;
    	private Dimension screenSize;
    	private Dimension frameSize;
    	private static Color bg = Color.white;
    	
    	@SuppressWarnings("static-access")
    	public ProgressFrame(String title) throws HeadlessException {
    		screenSize = Toolkit.getDefaultToolkit ().getScreenSize ();
    		frameSize = win.getSize ();
    		pb = new JProgressBar(0,100);
    		
    		titleLabel = t.getTitle();		
    		versionLabel = t.getLabelFromString(title, Color.black, Color.white, new Font("Serif", Font.BOLD, 14), JLabel.CENTER);
    		
    		win.setLayout(new BorderLayout());
    		NPanel.setLayout(new BorderLayout());
    		NPanel.add(BorderLayout.NORTH, titleLabel);
    		NPanel.add(BorderLayout.SOUTH, versionLabel);
    
    		CPanel.setLayout(new BorderLayout());
    		
    		pb.setValue(0);
    		pb.setStringPainted(true);
    		pb.setSize(300, 30);
    		
    		CPanel.add(BorderLayout.EAST, new JLabel("  "));
    		CPanel.add(BorderLayout.WEST, new JLabel("  "));
    		CPanel.add(BorderLayout.NORTH, new JLabel("  "));
    		CPanel.add(BorderLayout.SOUTH, new JLabel("  "));
    		CPanel.add(BorderLayout.CENTER, pb);
    		
    		NPanel.setBackground(bg);
    		CPanel.setBackground(bg);
    		pb.setBackground(bg);
    		
    		win.add(BorderLayout.NORTH, NPanel);
    		win.add(BorderLayout.CENTER, CPanel);
    		
    		win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		win.pack();
    		
    		win.setLocation ((screenSize.width-frameSize.width)/2,(screenSize.height-frameSize.height)/2);
    	}
    	
    	public void open() {
    		JOptionPane.showConfirmDialog(null, "Iniziare il Download?");
    		win.setVisible(true);
    	}
    	
    	public void close() {
    		win.setVisible(false);
    	}
    	
    	public void setPbValue(int i) {
    		pb.setValue(i);
    		System.out.println("\t PB: "+pb.getValue()+"/100");
    	}
    
    }
    La classe Tools che interagisce direttamente con la ProgressBar
    Tools.java
    codice:
    package programmi;
    
    import java.awt.Color;
    import java.awt.Font;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLConnection;
    import java.util.Enumeration;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipFile;
    
    import javax.swing.JDialog;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    
    public class Tools {
    
    	public static String title = "";
    	
    	public Tools() {
    		
    	}
    	
    	public static JLabel getVersion() {
    		JLabel result = new JLabel("© 2011 - Zago Mattia - Version: 2.0", JLabel.CENTER);
    		[omiss....]
    	}
    	public static JLabel getTitle() {
    		[omiss....]
    	}
    	public static JLabel getLabelFromString(String text, Color fg, Color bg, Font font, int pos) {
    		[omiss....]
    	}
    	
    	public URL getUrlFromString(String url) {
    		[omiss....]
    	}
    	
    	public void chmod(String file) throws IOException, InterruptedException {
    		[omiss....]
    	}
    	
    	public void download(URL url, String FileName) throws IOException {
    				
    		title="Download di '"+FileName.substring(FileName.lastIndexOf("/")+1)+"' in corso";
    		URLConnection conn;
    		conn = url.openConnection();
    		conn.connect();
    		
    		InputStream streamIN = conn.getInputStream();
    		File f = new File(FileName);
    		OutputStream streamOUT = new FileOutputStream(f);
    					
    		int dimensione = conn.getContentLength();
    							
    		double progress;
    			
    		long bytesCopied = 0;
    		byte[] buffer = new byte[4096];
    		int bytes;
    		
    		
    		
    		ProgressFrame prog = new ProgressFrame(title);
    		
    		System.err.println("Apro prog");
    		prog.open();
    		while ( (bytes = streamIN.read( buffer )) != -1 ){
    			streamOUT.write( buffer, 0, bytes );
    			bytesCopied += bytes;
    			progress = ((100*bytesCopied)/dimensione);
    			System.err.println("\tprogress: "+progress);
    			prog.setPbValue((int) progress);
    		}
    		/* CICLO DI PROVA CON THREAD.SLEEP
    		for(int i=0; i<=100; i++) {
    			try {
    				Thread.sleep(100);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			prog.setPbValue(i);
    		}
                    */
    		streamOUT.close();
    		streamIN.close();
    		prog.close();
    	}
    	
    	public void unzip(String file) throws FileNotFoundException, IOException {
    	    [omiss....]
    	  }
    	private static void copyInputStream(int dimensione, InputStream in, OutputStream out)
    			  throws IOException
    			  {
    					byte[] buffer = new byte[4096];
    					int bytes;				
    					while ( (bytes = in.read( buffer )) != -1 ){out.write( buffer, 0, bytes );}
    					in.close();
    					out.close();
    			  }
    
    	public boolean askQuestion(String question) {
    		int q = JOptionPane.showConfirmDialog(null, question);
    		if (q == 0) {return true;}		
    		if (q == 2) {return askQuestion(question);}
    		return false;
    	}
    
    	public String askString(String question, String title, int messageType) {
    		return JOptionPane.showInputDialog(null, question, title, messageType);
    	}
    	
    	public Object optionBox(Object[] selectionValues, String initialSelection, String question, String title) {
    		JDialog.setDefaultLookAndFeelDecorated(true);
    		
    		return JOptionPane.showInputDialog(null, question,
    	        title, JOptionPane.QUESTION_MESSAGE, null, selectionValues, initialSelection);
    	}
    	
    	public void forceClose(String message, String title, int status) {
    		JOptionPane.showMessageDialog(null, message, title, JOptionPane.WARNING_MESSAGE);
    		System.exit(status);
    	}
    }
    ed infine la classe principale che utilizza il tutto
    Amunaptra.java
    codice:
    package main;
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.GridLayout;
    import java.awt.HeadlessException;
    import java.awt.Image;
    import java.awt.MediaTracker;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.net.MalformedURLException;
    import java.net.URL;
    
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JCheckBox;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JProgressBar;
    
    import programmi.Eclipse;
    import programmi.Firefox;
    import programmi.ProgressFrame;
    import programmi.Tools;
    
    
    
    @SuppressWarnings({"static-access","unused"})
    public class Amunaptra {
    	private static Color bg = Color.white;
    	private static JButton btnOK = new JButton("Download");
    	private static Tools t = new Tools();
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    	// Crea Frame Primario e Secondario
    		JFrame primaryWin = new JFrame("Amunaptra");
    		JPanel secondaryWin = new JPanel();
    	// Crea componenti frame secondario
    		JPanel NPanel = new JPanel(), CPanel = new JPanel(), SPanel = new JPanel();
    	// Crea etichette per titolo, versione e logo
    		JLabel titleLabel = t.getTitle();
    		JLabel versionLabel = t.getVersion();
    		JLabel logo = getImage();
    	// JBUTTON
    		btnOK.addActionListener(
    			    new ActionListener() { 
    			        public void actionPerformed(ActionEvent e) {
    			        	if(chkFir.isSelected()) {
    			        	  Firefox fir = new Firefox();
    			            	  fir.download();
    			            	  fir.extract();
    			            	  fir.chmod();
    			            }
    			        	if(chkEcl.isSelected()) {
    			        	  [omiss....]
    			            }
    			        	if(chkUT4.isSelected()) {
    			        	  [omiss....]
    			            }
    			        	// CHIUDE TUTTO
    			        	System.exit(0);
    			        }
    			    }
    			);
    		
    		
    	// Colori JLabel
    		titleLabel.setFont(new Font("Serif", Font.BOLD, 16));
    		titleLabel.setForeground(Color.getHSBColor(12, 0.99f, 0.19f));
    		titleLabel.setBackground(bg);
    		versionLabel.setFont(new Font("Serif", Font.PLAIN, 12));
    		versionLabel.setForeground(Color.gray);
    		versionLabel.setBackground(bg);
    		logo.setBackground(bg);
    		
    	// Manage secondary component
    		// ------ NORTH
    			NPanel.setLayout(new BorderLayout());
    			NPanel.add(BorderLayout.NORTH, titleLabel);
    			NPanel.add(BorderLayout.SOUTH, versionLabel);
    			
    		// ------ CENTER
    			CPanel.setLayout(new BorderLayout());
    			CPanel.add(optionPanel());
    			
    		// ------ SOUTH
    			SPanel.add(btnOK);
    			
    			
    		// ------ Common
    			NPanel.setBackground(bg);
    			CPanel.setBackground(bg);
    			SPanel.setBackground(bg);
    		
    	// Setup secondary JFrame
    		secondaryWin.setLayout(new BorderLayout());
    		secondaryWin.add(BorderLayout.NORTH, NPanel);
    		secondaryWin.add(BorderLayout.CENTER, CPanel);
    		secondaryWin.add(BorderLayout.SOUTH, SPanel);
    		
    	// Setup primary JFrame
    		primaryWin.setLayout(new BorderLayout());
    		primaryWin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		primaryWin.getContentPane().add(logo, BorderLayout.WEST);
    		primaryWin.getContentPane().add(secondaryWin, BorderLayout.EAST);
    		primaryWin.pack();
    		
    		
    	// APRI FINESTRA
    		Dimension screenSize = Toolkit.getDefaultToolkit ().getScreenSize ();
    		Dimension frameSize = primaryWin.getSize ();
    		primaryWin.setLocation ((screenSize.width-frameSize.width)/2,(screenSize.height-frameSize.height)/2);
    		primaryWin.setVisible(true);
    		
    	}
    	
    	private static JLabel getImage() {
    		[omiss....]
    	}
    	
    	private static JCheckBox chkUT4 = new JCheckBox("Urban Terror 4.01");
    	private static JCheckBox chkFir = new JCheckBox("Firefox 6.02");
    	private static JCheckBox chkEcl = new JCheckBox("Eclipse EE");
    	private static JPanel optionPanel() {
    		[omiss....]
    	}
    }
    Edit: modifica titolo

  2. #2
    Aggiungo anche la classe Firefox.java che manca nel primo post:

    codice:
    package programmi;
    
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.net.URL;
    
    import javax.swing.JOptionPane;
    @SuppressWarnings({"static-access"})
    public class Firefox {
    
    	private static Tools t = new Tools();
    	private static String localFileName = "/var/tmp/Firefox.zip";
    	private static String localFinalFolder = "/var/tmp/Firefox";
    	
    	public Firefox() {
    		// TODO Auto-generated constructor stub
    	}
    	
    
    	public void download() {
    		URL url = t.getUrlFromString("http://mattiazago.altervista.org/download/Firefox.zip");
    		try {
    			t.download(url, localFileName);
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	public void extract() {
    		try {
    			t.unzip(localFileName);
    		} catch (FileNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	public void chmod() {
    		try {
    			t.chmod(localFinalFolder);
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    }

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    e qui mi chiedo: perché usi roba statica mischiata a roba dinamica?
    Inizia a togliere tutti gli static e vedi se si ripresenta l'errore, ho l'impressione che hai valori non correttamente settati.

    ps: un warning bisogna leggerlo con attenzione e capire quando magari ci dice una cosa corretta (come in questo caso).
    Tutte le tue variabili sono statiche e le usi in contesto dinamico, uniforma l'uso. Il fatto che ti dica il warning static-access ti segnala questo mix, ignorarlo in questo caso è sbagliato
    RTFM Read That F*** Manual!!!

  4. #4
    ok.. ho rimosso tutti gli static ma ora mi dice che non trova un metodo main per poter lanciare l'applicazione.... ho provato a creare un secondo metodo main con la clausola static ma questo mi impedisce di invocare i metodi non statici...

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    ecco, quanto sai di java?
    RTFM Read That F*** Manual!!!

  6. #6
    abbastanza perchè?

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da Jiraky90
    ok.. ho rimosso tutti gli static ma ora mi dice che non trova un metodo main per poter lanciare l'applicazione.... ho provato a creare un secondo metodo main con la clausola static ma questo mi impedisce di invocare i metodi non statici...
    definire tutti i simboli statici e questo che scrivi qui mi dice che di java non ne capisci molto.

    public static void main (String[] args )

    è il punto di ingresso di ogni programma, in un programma che rispecchia il paradigma di programmazione ad oggetti questo dovrebbe essere l'unico metodo statico (o uno dei pochi).
    Static indica appunto che è un metodo che risiede in memoria indipendentemente dal fatto che si è creata o meno una istanza della classe che lo contiene.

    Tutti gli altri metodi è bene non definirli statici, a meno che non ci sia un motivo ben chiaro per farlo. Il fatto che ti dia quell'errore, ti dice che da un contesto statico (che sicuramente è in memoria at compile time) non puoi riferire qualcosa di non statico (come un qualsiasi membro).

    banalmente potresti fare

    codice:
    public class Esempio(){
             private String membro1; 
             private JPanel pannello;     
             public Esempio(){
                     ;
    //fai quello che ti pare 
             }
            private void method(){}
            private void method1(){}
    
            public static void main(String args[]){
                  Esempio es = new Esempio(); 
                  es.method();
                  es.method1();
            }
    }
    senza problemi di static o altro.

    Questi sono errori che uno che ne conosce un po' di java non dovrebbe fare.
    Dai un'occhiata a static in java, cosa è, a cosa serve e come lo usi e probabilmente (non ne sono sicura) qualcuno dei tuoi problemi lo risolvi.
    Ho l'impressione che avendo definito le robe statiche, la seconda volta crei confusione, quindi proviamo a rimuoverli e poi si vede
    RTFM Read That F*** Manual!!!

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da Jiraky90
    ok.. ho rimosso tutti gli static ma ora mi dice che non trova un metodo main per poter lanciare l'applicazione.... ho provato a creare un secondo metodo main con la clausola static ma questo mi impedisce di invocare i metodi non statici...
    definire tutti i simboli statici e questo che scrivi qui mi dice che di java non ne capisci molto.

    public static void main (String[] args )

    è il punto di ingresso di ogni programma, in un programma che rispecchia il paradigma di programmazione ad oggetti questo dovrebbe essere l'unico metodo statico (o uno dei pochi).
    Static indica appunto che è un metodo che risiede in memoria indipendentemente dal fatto che si è creata o meno una istanza della classe che lo contiene.

    Tutti gli altri metodi è bene non definirli statici, a meno che non ci sia un motivo ben chiaro per farlo. Il fatto che ti dia quell'errore, ti dice che da un contesto statico (che sicuramente è in memoria at compile time) non puoi riferire qualcosa di non statico (come un qualsiasi membro).

    banalmente potresti fare

    codice:
    public class Esempio(){
             private String membro1; 
             private JPanel pannello;     
             public Esempio(){
                     ;
    //fai quello che ti pare 
             }
            private void method(){}
            private void method1(){}
    
            public static void main(String args[]){
                  Esempio es = new Esempio(); 
                  es.method();
                  es.method1();
            }
    }
    senza problemi di static o altro.

    Questi sono errori che uno che ne conosce un po' di java non dovrebbe fare.
    Dai un'occhiata a static in java, cosa è, a cosa serve e come lo usi e probabilmente (non ne sono sicura) qualcuno dei tuoi problemi lo risolvi.
    Ho l'impressione che avendo definito le robe statiche, la seconda volta crei confusione, quindi proviamo a rimuoverli e poi si vede
    RTFM Read That F*** Manual!!!

  9. #9
    scusa il ritardo.. ho provato ad eliminare gli static, ho creato il metodo main invocando la classe stessa, ora si esegue ma ho sempre il solito problema..

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    ok, prova a ripostare il codice e vediamo
    RTFM Read That F*** Manual!!!

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.