Utilisation d'un JScollPane

Résolu
kersu - 22 févr. 2013 à 13:33
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 - 1 mars 2013 à 08:39
Bonjour,
Je n'arrive pas à rendre opérationnel ma barre de défilement verticale.
Lorsque je dispose 3 affiches de cinéma dans ma fenêtre, comme la hauteur de ma fenêtre est dépassée, je souhaiterais qu'il y est une barre de défilement qui se mette en place.


Mon code :

import javax.swing.* ;
import java.awt.* ;

public class TestMenu
{ 
public static void main (String args[])
{ 
JFrame fen = new JFrame ("IMAGES");
fen.setSize(600,800);
JPanel pan = new JPanel();

JScrollPane scrollF = new JScrollPane(pan);
scrollF.setPreferredSize(new Dimension(580,780));

pan.setLayout(new GridLayout(3,1));
    
    
    pan.add(new Panneau("C:/Users/Patrick/workspace/Biblio/src/affichage/4 minutes.jpg")) ;
    pan.add(new Panneau("C:/Users/Patrick/workspace/Biblio/src/affichage/7 vies.jpg")) ;
    pan.add(new Panneau("C:/Users/Patrick/workspace/Biblio/src/affichage/7h58 ce samedi la.jpg")) ;
    
    fen.add(pan);
    fen.setVisible(true);

}
}


class Panneau extends JPanel
{ 
private Image photo = null;

public Panneau(String adresse)
{ 	
photo = getToolkit().getImage(adresse);
photo = photo.getScaledInstance(300, 400, 1);

}

public void paintComponent(Graphics g)
{
super.paintComponent(g) ;
if(photo != null) {g.drawImage (photo, 0, 0, this);}
}

}


Merci pour votre aide. Ça fait 2 jours que j essaie. :)))))))





11 réponses

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 366
1 mars 2013 à 08:39
Salut,

Tu peux accepter les réponses qui t'on aidé stp pour clore le sujet.
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 366
22 févr. 2013 à 13:41
Salut,

Dans ce cas là, c'est le JScrollPane qu'il faut afficher et non pas le panel :

  pan.add(new Panneau("C:/Users/Patrick/workspace/Biblio/src/affichage/4 minutes.jpg")) ;
    pan.add(new Panneau("C:/Users/Patrick/workspace/Biblio/src/affichage/7 vies.jpg")) ;
    pan.add(new Panneau("C:/Users/Patrick/workspace/Biblio/src/affichage/7h58 ce samedi la.jpg")) ;
    
    fen.add(scrollF );
    fen.setVisible(true);
0
Bonjour Julien39,
Merci pour ta réponse, mais cela ne marche quand même pas.
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 366
22 févr. 2013 à 15:34
Il faut que tu ajoutes les éléments dans le panel avant de mettre celui ci dans le scrollpane
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
J'ai bien mes trois affiches qui sont affichées mais elles sont toujours réduites pour rentrer dans la fenêtre et non pas affichées normalement avec une barre de défilement.

Mon code :

import javax.swing.* ;
import java.awt.* ;

public class TestMenu
{ 
public static void main (String args[])
{ 
JFrame fen = new JFrame ("IMAGES");
fen.setSize(600,800);
JPanel pan = new JPanel();

pan.setLayout(new GridLayout(3,1));
    pan.add(new Panneau("C:/Users/Patrick/workspace/Biblio/src/affichage/4 minutes.jpg")) ;
    pan.add(new Panneau("C:/Users/Patrick/workspace/Biblio/src/affichage/7 vies.jpg")) ;
    pan.add(new Panneau("C:/Users/Patrick/workspace/Biblio/src/affichage/7h58 ce samedi la.jpg")) ;
    
    
    JScrollPane scrollF = new JScrollPane();
    scrollF.setPreferredSize(new Dimension(580,780));
     
    fen.add(scrollF.add(pan));
    fen.setVisible(true);
 }
}


class Panneau extends JPanel
{ 
private Image photo = null;

public Panneau(String adresse)
{ 	
photo = getToolkit().getImage(adresse);
photo = photo.getScaledInstance(300, 400, 1);

}

public void paintComponent(Graphics g)
{
super.paintComponent(g) ;
if(photo != null) {g.drawImage (photo, 0, 0, this);}
}

}



Le résultat :
0
Le résultat :
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 366
22 févr. 2013 à 19:39
ET quand tu réduis la taille de la fenêtre, ca ne marche pas non plus ?
0
Non mais j ai l impression que JScrollPane ne fonctionne pas avec un JPanel.

J'ai trouvé un codesoù cela marche bien avec un jtable. J'essaie de m'en inspirer.

le tuto : http://baptiste-wicht.developpez.com/tutoriels/java/swing/jtable/
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 366
23 févr. 2013 à 08:14
Si le JScrollPane fonctionne avec JPAnel.

Essayes de faire un setPreferedSize() sur tes panels qui affichent l'image.
et après, setSize(getPreferedSize()); setMinimumSize(getPreferedSize());

Et là, ca devrait fonctionner
0
Merci Julien39, j'essaie.
0
J'ai réussi, je mets le code si cela peut inspirer d'autres personnes. Merci Julien pour ton aide.


public class film 
{
private String titre;
private int annee;
private String genre;
private String lien;
private ImageIcon affiche;

public film (String titre,int annee,String genre,String lien,ImageIcon affiche)
{
this.titre = titre;
this.annee = annee;
this.genre = genre;
this.lien = lien;
this.affiche = affiche;
}

public String gettitre(){return titre;}
public void settitre(String titre){this.titre = titre;}

public int getannee(){return annee;}
public void setannee(int annee){this.annee = annee;}

public String getgenre(){return genre;}
public void setgenre(String genre){this.genre = titre;}

public String getlien(){return lien;}
public void setlien(String lien){this.lien = titre;}

public ImageIcon getaffiche(){return affiche;}
public void setaffiche(ImageIcon affiche){this.affiche = affiche;}
}


//Fenetre personnalisée
public class filmotheque extends JFrame 
{
    private tableauPerso modele = new tableauPerso(); 
    private JTable monTableau;

public filmotheque() 
{
        super(); //constructeur de JFrame
 
        setTitle("Filmothèque");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            
        monTableau = new JTable(modele); //monTableau est un tableau personnalisé de type tableauPerso
        monTableau.setDefaultRenderer(ImageIcon.class, new affiche()); //modification du rendu de la colonne affiche en appliquant la classe affiche()
        monTableau.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
        setPreferredSize(new Dimension(1000, 800)); //Taille initiale de la fenetre de l'application
                
        getContentPane().add(new JScrollPane(monTableau), BorderLayout.CENTER); //rajour d'un Scroll sur la partie centrale du tableau
 
        System.out.print(monTableau.getColumnName(1)); 
        
        pack();
    }

//programme principal
public static void main(String[] args) 
{ 
new filmotheque().setVisible(true);
}
 }

public class tableauPerso extends AbstractTableModel 
{
private final List<film> films = new ArrayList<film>();
private final String[] entetes = {"TITRE", "ANNEE", "GENRE", "LIEN", "AFFICHE"};
 
    public tableauPerso() 
    {
        super();
        
        final String path = "Vidéothèque/Films/";
        final String path2 = "C:/Users/Patrick/workspace/Biblio/src/affichage/";
 
        films.add(new film ("A la croisée des mondes 1 - La boussole d'or", 2007,"Fantastique",path + "A la croisée des mondes 1 - La boussole d'or.avi", new ImageIcon(path2 + "4 minutes.jpg")));
        films.add(new film ("American gangster",2007,"Drame",path + "American gangster.avi", new ImageIcon(path2 + "7 vies.jpg")));
        films.add(new film ("American Party",2001,"Comédie",path + "American Party.avi", new ImageIcon(path2 + "7h58 ce samedi la.jpg")));
        films.add(new film ("Star wars 1 - la menace fantôme",1999,"Science fiction",path + "Star wars 1 - la menace fantôme.avi", new ImageIcon(path2 + "10,000 BC.jpg")));
        films.add(new film ("Bienvenue à bord",2011,"Comédie",path + "Bienvenue à bord.avi", new ImageIcon(path2 + "11e heure.jpg")));
    }
 
    public int getRowCount() //retourne le nombre de film
    {
        return films.size();
    }
 
    public int getColumnCount() //retourne le nombre de colonne
    {
        return entetes.length;
    }
 
    public String getColumnName(int columnIndex) //retourne les titres des colonnes
    {
        return entetes[columnIndex];
    }
 
    public Object getValueAt(int rowIndex, int columnIndex) //remplis le tableau
    {
    	switch(columnIndex)
    	{
        	case 0:
        		return films.get(rowIndex).gettitre();
        	case 1:
        		return films.get(rowIndex).getannee();
        	case 2:
        		return films.get(rowIndex).getgenre();
        	case 3:
        		return films.get(rowIndex).getlien();
        	case 4:
        		return films.get(rowIndex).getaffiche();
        	default:
        		return null; //Ne devrait jamais arriver
    	}
    }
   
    @Override
    public Class getColumnClass(int columnIndex)
    {
    	switch(columnIndex)
    	{
    		case 4:
    			return ImageIcon.class; //Personnalisation de l'affichage des affiches (rendu)
    		default:
    			return Object.class;
    	}
    }
  }


public class affiche extends DefaultTableCellRenderer //Personnalisation de l'affichage des affiches (rendu)
{
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
 {
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
 
        ImageIcon affiche = (ImageIcon) value; //récupération de la valeur de l'affichage
        
        table.setRowHeight(400); //hauteur de toutes les lignes de la table a 400 pixels (hauteur de l'affiche)                

        TableColumn col = table.getColumnModel().getColumn(4);//selectionne la 4eme colonne
        col.setPreferredWidth(300); //largeur de la colonne des affiches a 300 pixels   
        	             
        setIcon(affiche); //affiche à l'écran l'affiche de cinéma
        
        table.addMouseListener(new MouseListener()
        {
@Override
public void mouseClicked(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) 
{
System.out.print("dés que la souris va sur la table");

}
@Override
public void mouseExited(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {} 
@Override
public void mouseReleased(MouseEvent e) {}
});
        return this;
 }
}








0