Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    33

    JSplitPane, con divider invisibile..!

    Sto utilizzando un JSplitPane che contiene due JPanel, che a loro volta ospitano un' immagine.
    Quel che ho fatto, per migliorare la qualità estetica, è stato di aggiungere il metodo
    propertyChange(PropertyChangeEvent e)

    in modo che, ogni volta che viene fatto un resize del JSplitPane, la schermata venga ridisegnata: in caso contrario ottengo che durante lo spostamento del divider del JSplitPane i due JPanel diventano grigi fino ad una nuova chiamata a paint().

    propertyChange(PropertyChangeEvent e)
    {
    repaint();
    }


    Il problema è che chiamando il repaint dal propertyChange il divider scompare; è come se fosse trasparente. Inoltre sembrano esserci degli errori grafici, come se uno dei due pannelli scrivesse sopra al divider.

    Aggiungo infine che ho impostato la grandezza del divider a 20 pixel.
    Qualche idea per questo strano fenomeno?

    Grazie mille

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Re: JSplitPane, con divider invisibile..!

    Originariamente inviato da mkd_
    Quel che ho fatto, per migliorare la qualità estetica, è stato di aggiungere il metodo
    propertyChange(PropertyChangeEvent e)

    in modo che, ogni volta che viene fatto un resize del JSplitPane, la schermata venga ridisegnata: in caso contrario ottengo che durante lo spostamento del divider del JSplitPane i due JPanel diventano grigi fino ad una nuova chiamata a paint().
    Qui non ho capito.
    Non ti era sufficiente creare il JSplitPane usando uno dei due costruttori che accettano un booleano per indicare il continuous-layout?

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    33
    Grazie per l' interessamento Lele
    In effetti ho provato prima quello: attualmente è impostato su true da costruttore, ma senza il PropertyChange il refresh non avviene

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Perdonami, ma forse non ho capito esattamente il problema.
    Questo codice si comporta esattamente come mi aspetto: ci sono i due pannelli che "dipingono" le immagini, uno a sinistra e uno a destra dello split-pane. Se io sposto il divider o ridimensiono la finestra, i due pannelli si ridisegnano in modo "continuo", come specificato dal costruttore di JSplitPane (ovvero, non attendono che io rilasci il mouse per effettuare il repaint).

    codice:
    import java.awt.*;
    import javax.swing.*;
    
    public class Finestra extends JFrame {
    
       private class MioPanel extends JPanel {
          private ImageIcon img;
          public MioPanel(ImageIcon img) {
             this.img = img;
          }
    
          @Override
          public void paintComponent(Graphics g) {
             super.paintComponent(g);
             g.drawImage(img.getImage(), 0, 0, null);
          }
       }
    
       public Finestra() {
          Container c = getContentPane();
          c.setLayout( new BorderLayout() );
    
          MioPanel mp1 = new MioPanel( new ImageIcon("img1.png") );
          MioPanel mp2 = new MioPanel( new ImageIcon("img2.png") );
          JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, mp1, mp2);
          split.setDividerLocation( 400 );
    
          c.add(split, BorderLayout.CENTER);
    
          setTitle("Finestra");
          setSize(800, 600);
          setDefaultCloseOperation( EXIT_ON_CLOSE );
          setLocationRelativeTo( null );
          setVisible( true );
       }
    
       public static void main(String[] args) {
          Finestra f = new Finestra();
       }
    }
    Se provi ad eseguire questo codice, noti lo stesso "difetto"?

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    33
    Funziona...

    Sottolineo che sto usando una JApplet.
    Questo è il metodo paint (lo incollo "nudo e crudo" poiché il tag non lo formatta, scusa ma sono nuovo)

    codice:
      public void paint(Graphics g)
      {
    
    	  
    	  
        Graphics2D schermo=(Graphics2D) g;
    	
        Image immagineGrafico=createImage(grafico.pannelloGrafico.getWidth()      
                                    ,grafico.pannelloGrafico.getHeight()); 
        Image immagineVolumi=createImage(grafico.pannelloVolumi.getWidth() 
                                  ,grafico.pannelloVolumi.getHeight());
    	Graphics2D imgGrafico=(Graphics2D)immagineGrafico.getGraphics();
    	Graphics2D imgVolumi=(Graphics2D)immagineVolumi.getGraphics();
    	
        grafico.draw(imgGrafico,imgVolumi,mouseX,mouseY);
    
       ((Graphics2D)grafico.pannelloGrafico.getGraphics()).drawImage(immagineGrafico,0,0,this);
        ((Graphics2D)grafico.pannelloVolumi.getGraphics()).drawImage(immagineVolumi,0,0,this);
    
        
        repaintComponents();  //ridisegna i componenti ECCETTO l' area del grafico
        
        
    
      }
    E questo è il costruttore JSplitPane

    codice:
    pannelloGraficoIntero=new JSplitPane(JSplitPane.VERTICAL_SPLIT,true,grafico.pannelloGrafico,grafico.pannelloVolumi);
    Ho provato ad effettuare il repaint() del componente JSplitPane nel repaintComponents() ma le immagini dei pannelli non sono visibili se non per pochissimo tempo (in compenso vedo il divider..!)

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Alcune considerazioni:

    1) All'interno di componenti Swing non si deve effettuare l'override del metodo paint(), che è di AWT e andrebbe lasciato stare. JApplet non è provvista di un metodo paintComponent() come gli altri componenti, ma non è un problema... bisognerebbe avere un pannello che fa il lavoro, non direttamente l'applet.

    2) Richiamare un repaintComponents() all'interno del metodo paint() è la cosa più sbagliata in assoluto. Tale metodo, infatti, si occupa di richiamare proprio il metodo paint()... creando un loop pauroso. Non farlo.

    Soluzione: crea una classe che estende JPanel (come ho fatto io); in tale classe sottoponi ad override il metodo paintComponent() (non il metodo paint()!) e fagli disegnare ciò che prima disegnavi direttamente sulla JApplet. Togli di mezzo la chiamata a repaintComponents() che non ti serve. Crea due istanze di tale pannello e inseriscile nel JSplitPane.

    PS: quando posti del codice, prima di incollarlo apri il tag CODE, poi incolla il codice, poi chiudi il tag CODE.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    33
    In effetti ho un utilizzo della CPU che non è assolutamente normale, anche quando lascio l' applet aperta senza far nulla.
    Ora provo a sistemare un po il codice, grazie mille per i consigli dati fin ora, sono un prezioso aiuto: con la grafica ho alcuni problemi, l' ultima volta che ci ho lavorato è stato 10 anni fa alle superiori :-) Mi sa che è proprio da li che ricordavo di ridefinire paint()!

    ho dimenticato di dirti che repaintComponents() è stato da me ridefinito.

    Quindi, per iniziare creo un JPanel che inserisco dentro l' applet (cosa che tra l' altro volevo fare, perché devo rendere disponibili diverse schermate!) e per il disegno faccio l' override di paintComponent()

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    33
    ----POST SOSPESO, ho riletto altre 2 volte e ho capito che forse sto sbagliando qualcosa; scusa ma ho bisogno di farmi un po di chiarezza :-)

    Rieccomi qui, dopo alcune ore di lavoro

    Ho eseguito i seguenti passaggi
    => creazione di una nuova classe che estende JPanel
    => spostamento di tutti gli elementi grafici, variabili e metodi necessari dalla classe originale alla nuova classe
    => aggiunta della nuova classe JPanel alla JApplet

    Quasi tutto è a posto: l' unico problema è che i due pannelli (i famosi JPanel del JSplitPane) sono vuoti. Potrebbe essere un problema grafico, ma vedo che inserendo un println di controllo all' interno di paintComponent non ricevo alcuna stampa

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    33
    Allora,
    mi correggo, il contenuto dei pannelli si vede, ma la loro grafica rimane bloccata, e il refresh dell' immagine avviene solo se muovo un po la finestra dell' applet. Inoltre, appena lancio l' applet, i due pannelli sono grigi (colore di sfondo). Provando a inserire un repaint() in mouseMoved si verifica uno sfarfallio tra le immagini dei due pannelli e il colore grigio citato sopra (appare l' immagine, ma scompare dopo una frazione di secondo)

    Puntualizzo che ho messo paintComponent nella nuova classe che estende JPanel (contiene tutte le istruzioni precedentemente comprese nel vecchio paint() della classe che estende JApplet), e che ho tolto tutti i repaint() presenti.

    Grazie ancora, se manca qualche informazione utile fammi sapere

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Ho trasformato il codice di prima in una JApplet:

    codice:
    import java.awt.*;
    import javax.swing.*;
    
    public class Finestra extends JApplet {
    
       private class MioPanel extends JPanel {
          private ImageIcon img;
          public MioPanel(ImageIcon img) {
             this.img = img;
          }
    
          @Override
          public void paintComponent(Graphics g) {
             super.paintComponent(g);
             g.drawImage(img.getImage(), 0, 0, null);
          }
       }
    
       @Override
       public void init() {
          Container c = getContentPane();
          c.setLayout( new BorderLayout() );
    
          MioPanel mp1 = new MioPanel( new ImageIcon(Finestra.class.getResource("img1.png")) );
          MioPanel mp2 = new MioPanel( new ImageIcon(Finestra.class.getResource("img2.png")) );
          JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, mp1, mp2);
          split.setDividerLocation( 400 );
    
          c.add(split, BorderLayout.CENTER);
       }
    
    }
    Sei sicuro di aver ridefinito correttamente il metodo paintComponent() di JPanel? Soprattutto, ti avevo detto di rimuovere le chiamate a repaintComponents(). Tutto ciò che ti serve è la ridefinizione di paintComponent() e basta. Vedi se l'esempio qui sopra ti può tornare utile.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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.