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

    Problema con aggiornamento JScrollPane...

    Rieccomi qui per l'ennesimo problema, fiducioso nel vostro aiuto
    Allora, ho creato un semplice programma che legge un'immagine e la visualizza su un JPanel con paintComponent. Quando l'immagine è più grande delle dimensioni del JFrame, automaticamente vengono aggiunti le scrollbar per visualizzare tutta l'immagine, e fin qui tutto ok. Se provo a scegliere un'altra immagine, continua a visualizzarla correttamente, e automaticamente continua ad impostare le dimensioni delle scrollbar in modo corretto. Ho poi aggiunto un tasto per zoomare l'immagine, cioè ingrandirla. Se lo premo, l'immagine viene ingrandita correttamente ma... le scrollbar rimangono le stesse a meno che non ingrandisco/ridimensiono la finestra col mouse, eppure è strano, perchè se si preme questo tasto dopo vengono eseguite le stesse operazioni di quando si sceglie una nuova immagine... spero che qualcuno mi aiuti

    Questo il frammento di codice interessato:

    codice:
    if (event.getSource() == pic)
    {
    	JFileChooser fileChooser = new JFileChooser();
    	fileChooser.setAcceptAllFileFilterUsed (false);
    	fileChooser.addChoosableFileFilter (new FileNameExtensionFilter ("File immagine", "png", "gif", "jpg", "jpeg", "bmp"));
    	
    	int result = fileChooser.showOpenDialog (null);
    	
    	if (result == JFileChooser.APPROVE_OPTION)
    	{
    		File file = fileChooser.getSelectedFile();
    		
    		if (file != null)
    		{
    			try { image = ImageIO.read (file); }
    			catch (Exception exception) { JOptionPane.showMessageDialog (Zoom.this,
    			"Errore durante il caricamento dell'immagine", "Errore", JOptionPane.ERROR_MESSAGE);
    			System.exit (1); };
    			
    			setPreferredSize (new Dimension (image.getWidth (Zoom.this), image.getHeight (Zoom.this)));
    			flag = true;
    		}
    	}
    }
    else if (event.getSource() == moreZoom)
    {
    	newWidth = image.getWidth (Zoom.this) + (image.getWidth (Zoom.this) * 50 / 100);
    	newHeight = image.getHeight (Zoom.this) + (image.getHeight (Zoom.this) * 50 / 100);
    	setPreferredSize (new Dimension (newWidth, newHeight));
    	flag = false;
    }			
    
    scroll.updateUI();
    repaint();

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Problema con aggiornamento JScrollPane...

    Originariamente inviato da Dreamer89
    Allora, ho creato un semplice programma che legge un'immagine e la visualizza su un JPanel con paintComponent. Quando l'immagine è più grande delle dimensioni del JFrame, automaticamente vengono aggiunti le scrollbar per visualizzare tutta l'immagine, e fin qui tutto ok. Se provo a scegliere un'altra immagine, continua a visualizzarla correttamente, e automaticamente continua ad impostare le dimensioni delle scrollbar in modo corretto. Ho poi aggiunto un tasto per zoomare l'immagine, cioè ingrandirla. Se lo premo, l'immagine viene ingrandita correttamente ma... le scrollbar rimangono le stesse
    Sul JPanel fai questa sequenza di operazioni: prima un setPreferredSize(), poi un revalidate(), infine un repaint().

    Sul JScrollPane non devi invocare nulla.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3

    Re: Re: Problema con aggiornamento JScrollPane...

    Originariamente inviato da andbin
    Sul JPanel fai questa sequenza di operazioni: prima un setPreferredSize(), poi un revalidate(), infine un repaint().

    Sul JScrollPane non devi invocare nulla.
    Grazie milleeeeeee! Ma quindi questo revalidate aggiorna tutti i componenti che si trovano sul JPanel? updateUI dello scroll è inutile quindi, se uso questo?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Re: Re: Problema con aggiornamento JScrollPane...

    Originariamente inviato da Dreamer89
    Ma quindi questo revalidate aggiorna tutti i componenti che si trovano sul JPanel?
    Lo spiega bene la documentazione di isValidateRoot() di JScrollPane:

    Overridden to return true so that any calls to revalidate on any descendants of this JScrollPane will cause the entire tree beginning with this JScrollPane to be validated.

    Quindi se invochi revalidate() sul tuo JPanel che è un dentro lo JScrollPane, l'intero albero di componenti partendo da JScrollPane viene validato.

    Originariamente inviato da Dreamer89
    updateUI dello scroll è inutile quindi, se uso questo?
    updateUI() ha a che fare con delle questioni legate al look & feel. Quindi non ti serve.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.