IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

Problème JScrollPane pour scroller ma page


Sujet :

Composants Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Points : 15
    Points
    15
    Par défaut Problème JScrollPane pour scroller ma page
    Bonsoir,

    Non ceci n'est pas un énième sujet pour savoir comment marche un JScrollPane, j'ai déjà épluché une bonne partie de documentation dessus, mais plutôt comment l'intégrer dans mon code

    Donc je fais un gestionnaire de mot de passe, j'ai une "page" qui affiche les mots de passes (ces derniers sont stockés à la suite dans un fichier texte sous cette forme: pseudo|motdepasse|description|dated'expiration) j'affiche ces mot de passes dans des textField sous forme de grille (4 colonnes et un nombre de ligne qui varie en fonction du nombre de mot de passe enregistrés) ce qui nous donne visuellement ca:
    https://i.gyazo.com/70135c91589ed454...2ccb4917b8.png

    Hors le souci c'est que si j'écris beaucoup de mot de passe la fenêtre ne se scroll pas (vous pouvez voir la barre a droite qui ne marche pas), et je n'arrive pas à faire marcher la scrollbar parce que mon code est un peu "compliqué".

    Il est réparti en plusieurs fenêtres (une de connexion, une pour rajouter un mot de passe ...), la fenêtre que vous voyez est la fenêtre principale, voici à quoi elel ressemble:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    public class FenetreGraphique extends JFrame implements ActionListener,Serializable
    {
    	private static final long serialVersionUID = 1L;
    	Hashtable<String, String> listeUtilisateur = new Hashtable<String, String>();
    	JPasswordField txtPassword = new JPasswordField("password",20);
    	JTextField nomUti;
    	private String utilisateurActuel,mdpActuel;
    	static Boolean afficheSuite=false;
    	Vector <String> tabUti = new Vector <String>();
    	utilisateur uti;
    	JTextField [] textField;
    	zoneAffichage pan;
     
    	public FenetreGraphique(String fen) throws Exception
    	{
    		super(fen);
    		setResizable(false);
    		setLayout(null);
    		Init();
    		setLocationRelativeTo(null);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		getContentPane( ).setLayout(new java.awt.FlowLayout( ));
    		initUtilisateur(listeUtilisateur);
    		File file = new File("utilisateurActuel.dat");
    		file.delete();
    		setVisible(true);
    	}
    la fonction Init() permer d'afficher les mots de passes si l'utilisateur s'est logué:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    	public void Init() throws Exception
    	{
    		File MyFile = new File("utilisateurActuel.dat");
    		MyFile.delete();
    		if(afficheSuite) // fenetre pour affichage mdp
    		{
    			setSize(1000,600);
    			pan = new zoneAffichage();
     
    			//initialisation du vector contenant les infos de l'utilisateur actuel
    			tabUti=utiActuel();
    			this.setUtilisateurActuel(tabUti.elementAt(0));
    			this.setMdpActuel(tabUti.elementAt(1));
     
    			pan.setSize(900,600);
     
    			JMenuBar menuBar = new JMenuBar();
     
    			JMenu menuGestion = new JMenu("Menu de gestion");
     
    			JMenuItem ajoutPW =new JMenuItem("Ajouter un mot de passe");
     
    			setJMenuBar(menuBar);
    			menuBar.add(menuGestion);
     
    			menuGestion.add(ajoutPW); //Gere l'ajout du mot de passe
    			ajoutPW.setActionCommand("ajoutPW");
    			ajoutPW.addActionListener(this);
     
     
    			uti=new utilisateur(getUtilisateurActuel(),getMdpActuel());
     
    			zoneAffichage.nom=uti.getNom();
    			zoneAffichage.mdp=uti.getMdp();
     
    			JButton refresh = new JButton("Raffraichir"); //Permet de rafraichir la liste quand on entre un mot de passe
    			refresh.setActionCommand("refresh");
    			refresh.addActionListener(this);
     
    			JScrollPane scrollPane = new JScrollPane(pan);
    			scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
     
    			add(refresh);
    			add(scrollPane);
     
    		//	add(pan);
                   // la suite du code est en rapport avec la connexion d'un utilisateur, pas utile dans le cas la
    comme vous pouvez le voir "pan" à la 8ème ligne fais appel à zoneAffichage()
    voici zoneAffichage:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    public class zoneAffichage extends JPanel implements Serializable
    {
    	static String nom,mdp;
    	utilisateur utilisa;
    	private static final long serialVersionUID = 1L;
    	Vector <String> tabUti = new Vector <String>();
     
    	public zoneAffichage()
    	{
    		tabUti=utiActuel();
    		nom=tabUti.elementAt(0);
    		mdp=tabUti.elementAt(1);
     
    		utilisa=new utilisateur(nom,mdp);
    		utilisa.ouverture();
     
    		int nbLigne= (utilisa.tabInfoMdp.size()/4);
    		System.out.println("nbLigne " + nbLigne);
    		GridLayout gl = new GridLayout();
    		gl.setColumns(4);
    		gl.setRows(nbLigne+1);
    		this.setLayout(gl);
    		JLabel labelPseudo = new JLabel("Pseudo");
    		JLabel labelMdp = new JLabel("Mot de passe");
    		JLabel labelDescr = new JLabel("Description");
    		JLabel labelDate = new JLabel("Date d'expiration");
    		this.add(labelPseudo);
    		this.add(labelMdp);
    		this.add(labelDescr);
    		this.add(labelDate);
    		System.out.println(nom+" "+mdp);
    		System.out.println(utilisa.getNom()+" "+utilisa.getMdp());
     
    		JTextField [] textField = new JTextField[(utilisa.tabInfoMdp).size()];
     
    		for(int i = 0; i<((utilisa.tabInfoMdp).size()); ++i)
    		{
    			try
    			{
    				textField[i]=new JTextField(password.decrypt(utilisa.getMdp(), (utilisa.tabInfoMdp).elementAt(i)));
    				textField[i].setColumns(15);
    				this.add(textField[i]);
    			}
    			catch(Exception e)
    			{
    				e.printStackTrace();
    			}
    		}
     
    		this.revalidate();
    	}
    Donc mon souci c'est que je voudrais pouvoir scroller "pan" qui contient les textField comme on voit sur le screen, mais j'ai essayé beaucoup de "méthodes" différentes en applicant un JScrollPane sur d'autres éléments (le pan, la fenetre graphique, l'instance courante, les textFields) mais sans succès, auriez-vous une solution ?

    Merci et passez de bonnes fêtes

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Les automatismes de Swing sont fondés sur l'usage des layouts managers. Supprimer les layouts managers, forcer les tailles des composants, ou mélanger des composants sans layout manager et composant avec layout manager inadéquat ne peut pas donner un résultat où tout fonctionne automatiquement. Pour un JScrollPane, il faudra adapter la taille du viewport toi-même (en calculant la hauteur que prend ton panel), et lui affecter.

    Le plus simple étant d'utiliser les layouts managers, et les layouts adéquats.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    import java.awt.FlowLayout;
    import java.awt.GridLayout;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextField;
     
    public class DemoGridLayout extends JPanel {
     
    	public DemoGridLayout(int nb) {
    		super(new GridLayout(0,3));
    		for(int ligne=0; ligne<nb; ligne++) {
    			add( new JLabel("Label "+(ligne+1)) );
    			add( new JTextField() );
    			add( new JButton("Button truc"));
    		}
    	}
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		DemoGridLayout demo = new DemoGridLayout(50);
     
    		JScrollPane scrollpane = new JScrollPane(demo);
     
    		//frame.getContentPane().setLayout(new FlowLayout()); // remplace le BorderLayout par défaut par un FlowLayout inadéquat
    		frame.getContentPane().add(scrollpane);
     
    		frame.setSize(400, 600);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    }

    Tu verras que ce code fait exactement ce que tu cherches à faire. Si tu décommentes la ligne où je force le layout par un FlowLayout, ça ne fonctionnera plus (il n'y aura plus d'ascenseur vertical).

    D'ailleurs, au lieu d'un gridlayout, j'utiliserais un GridBagLayout, pour avoir plus d'harmonie dans l'agencement :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    import java.awt.FlowLayout;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.Insets;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextField;
     
    public class DemoGridBagLayout extends JPanel {
     
    	public DemoGridBagLayout(int nb) {
    		super(new GridBagLayout());
    		GridBagConstraints gbc = new GridBagConstraints();
    		gbc.insets = new Insets(1, 1, 1, 1);
    		gbc.gridwidth=gbc.gridheight=1;
    		for(int ligne=0; ligne<nb; ligne++) {
    			gbc.gridy=ligne;
    			gbc.gridx=0;
    			gbc.weightx=0;
    			gbc.fill=GridBagConstraints.NONE;
    			gbc.anchor=GridBagConstraints.BASELINE_TRAILING;
    			add( new JLabel("Label "+(ligne+1)), gbc );
    			gbc.gridx=1;
    			gbc.weightx=1;
    			gbc.fill=GridBagConstraints.BOTH;
    			gbc.anchor=GridBagConstraints.CENTER;
    			add( new JTextField(), gbc );
    			gbc.gridx=2;
    			gbc.weightx=0;
    			gbc.fill=GridBagConstraints.NONE;
    			add( new JButton("Button truc"), gbc);
    		}
    	}
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		DemoGridBagLayout demo = new DemoGridBagLayout(50);
     
    		JScrollPane scrollpane = new JScrollPane(demo);
     
    		//frame.getContentPane().setLayout(new FlowLayout()); // remplace le BorderLayout par défaut par un FlowLayout inadéquat
    		frame.getContentPane().add(scrollpane);
     
    		frame.setSize(400, 600);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Points : 15
    Points
    15
    Par défaut
    Merci j'ai ajouté un viewport, ca marche niquel

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Tableaux] problème pour mise en page alternée
    Par tondeuz dans le forum Langage
    Réponses: 6
    Dernier message: 13/06/2007, 16h14
  2. problème de script php pour revenir à la page précédente
    Par mandyben dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 14/09/2006, 10h12
  3. [POO] Problème pour Parser une page XML
    Par Death83 dans le forum Langage
    Réponses: 18
    Dernier message: 29/08/2006, 10h15
  4. Erreur 404 - problème pour tester la page jsp
    Par zuzuu dans le forum Tomcat et TomEE
    Réponses: 10
    Dernier message: 05/07/2006, 16h55
  5. Problème pour visionner une page HTTPS
    Par ahage4x4 dans le forum Autres Logiciels
    Réponses: 5
    Dernier message: 07/02/2006, 18h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo