Griser une JList en dessous des éléments sélectionnables

Résolu/Fermé
killdragon Messages postés 33 Date d'inscription lundi 17 décembre 2012 Statut Membre Dernière intervention 1 janvier 2013 - 20 déc. 2012 à 18:32
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 21 déc. 2012 à 00:04
Bonjour,

Aujourd'hui après avoir pérégriné et accompli moultes choses qui me surprennent encore, je tombe sur un détail assez gênant : J'ai donc une JList a laquelle j'ai collé un JScroll qui donne ce rendu : http://hpics.li/0e2bf8f

Mon soucis est que je voudrais que dans cette JList les éléments soient toujours sélectionnables (comme c'est le cas actuellement), mais que si il y a peu d'éléments comme c'est le cas dans l'image que je montre, le reste de la liste soit grisée, donc je souhaiterais voir mes éléments, et en dessous du dernier avoir le restant de la liste grisée, comment suis-je censé faire svp? Je n'ai trouvé pour ma part que le moyen de rendre les éléments non sélectionnables ce qui ne m'intéresse pas, c'est pourquoi je fais appel a vous :)

Merci a ceux qui m'aideront !


4 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
20 déc. 2012 à 18:58
Le plus simple serait peut-être d'avoir ton code, on pourrait le modifier pour faire ce que tu veux. Mais je pense que ton problème est d'avoir plus de lignes dans ta liste que tu n'as d'éléments à y afficher.

Normalement pour le programme dont tu montres l'image tu as 3 valeurs donc tu devrais avoir maJlist.getModel().getSize()==3, et à mon avis tu as beaucoup plus que ça, il faudrait donc regarder à bien utiliser ton ListModel pour ne pas mettre plus de lignes que tu n'en as besoin...
0
killdragon Messages postés 33 Date d'inscription lundi 17 décembre 2012 Statut Membre Dernière intervention 1 janvier 2013
20 déc. 2012 à 20:25
Non, si je ne vois que 3 fichiers c'est tout a fait normal, le programme recense les fichiers PDF présents dans la racine du programme et les affiche, or je n'en avais que 3.

Pour le code ça donne ça :

public class ArboIHM extends JFrame {

	private JPanel panel = new JPanel();
	private JPanel boutons = new JPanel();
	private JButton triNom = new JButton("Arborescence triée par nom");
	private JButton triTaille = new JButton("Arborescence triée par taille");
	//private JButton TriDate = new JButton("Arborescence triée par date");
	private File test = new File(".");
	private ArboTrieeParNom a1 = new ArboTrieeParNom(test);
	private JList laListe = new JList(a1.getListe().toArray());
	private JLabel nomLabel = new JLabel("Nom : ");
	private JLabel tailleLabel = new JLabel("Taille : ");
	private JLabel dateLabel = new JLabel("Date : ");
	private JPanel nom = new JPanel();
	private JPanel taille = new JPanel();
	private JPanel date = new JPanel();
	private JTextField nomTexte = new JTextField(20);
	private JTextField tailleTexte = new JTextField(20);
	private JTextField dateTexte = new JTextField(20);
    private JScrollPane scrollPane = new JScrollPane(laListe);

	public ArboIHM() {
		init();
	}
	
	public void init(){
		setTitle("Test");
		pack();
		setSize(700,400);
		this.setLocationRelativeTo(null);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setVisible(true);
		GridBagConstraints gbc = new GridBagConstraints();
		add(panel);
		nom.add(nomLabel);
		nom.add(nomTexte);
		date.add(dateLabel);
		date.add(dateTexte);
		taille.add(tailleLabel);
		taille.add(tailleTexte);
		boutons.add(triNom);
		boutons.add(triTaille);

		panel.setLayout(new GridBagLayout());
	    gbc.gridx = 0;
	    gbc.gridy = 1;
	    //panel.add(laListe, gbc);        

        laListe.setPreferredSize(new Dimension(200, 2000));
        scrollPane.setViewportView(laListe);
        getContentPane().add(scrollPane, java.awt.BorderLayout.WEST);
        
        
        

	    

	    
	    gbc.gridwidth = GridBagConstraints.REMAINDER;
	    gbc.gridx = 1;
	    gbc.gridy=0;
	    panel.add(triNom,gbc);
	    
	    gbc.gridwidth = GridBagConstraints.REMAINDER;
	    gbc.gridx = 1;
	    gbc.gridy=1;
	    panel.add(triTaille,gbc);
	    
	    gbc.gridx = 3;
	    gbc.gridy = 2;
	    panel.add(nom, gbc);
	    
	    gbc.gridx = 3;
	    gbc.gridy = 3;
	    panel.add(date, gbc);
	    
	    gbc.gridx = 3;
	    gbc.gridy = 4;
	    panel.add(taille, gbc);
	   
	    
	}

	public static void main(String... args) {
		new ArboIHM();
	}
}


En fait ce qui pose problème c'est mon Scroll, puisque si tu ajoutes la ligne en commentaire dans le code et que tu passes en commentaire celles la :

laListe.setPreferredSize(new Dimension(200, 2000));
scrollPane.setViewportView(laListe);
getContentPane().add(scrollPane, java.awt.BorderLayout.WEST);

Tu retombes ainsi sur ce que j'avais fait avant, a savoir une liste des fichiers présents sans rien de plus, mais mon scroll m'a vraiment modifié cela, a cause du borderlayout puisque je n'ai pas réussi a le relier avec le gridbaglayout...
Du coup je pense qu'en effet si j'avais un scroll "normal" de ma liste ça résoudrait le soucis :)
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
20 déc. 2012 à 21:36
Si je comprends bien ce que tu veux, pour avoir un "scroll normal" tu pourrais remplacer :

laListe.setPreferredSize(new Dimension(200, 2000));
Par :

Dimension dim = laListe.getPreferredSize();
dim.width = 200;
laListe.setPreferredSize(dim);

Comme ça la hauteur préférée, reste par défaut, tu ne changes que la largeur, et le scroll suit.

Par contre pour la couleur, ça ne se change pas par une méthode, soit tu change tout le fond en gris (avec setBackground) soit tout reste en blanc. Le reste est géré par le LnF et aller trifouiller là dedans ce sera sans moi ^^ (voir Modifying the Look and Feel)
0
killdragon Messages postés 33 Date d'inscription lundi 17 décembre 2012 Statut Membre Dernière intervention 1 janvier 2013
Modifié par killdragon le 20/12/2012 à 22:17
C'est exactement ça, merci :)

Je pourrais savoir au bout de combien de temps de pratique de java (je parle bien du nombre d'heure, pas d'années scolaires d'apprentissage) tu as mis pour atteindre un niveau assez bon en java? a savoir pouvoir programmer un petit logiciel de visualisation d'images qui comporte des tris et des recherches restreintes, ou quelque chose d'équivalent ?

Je désespère assez de ne pas y arriver un jour ><


EDIT : Sinon j'ai remarqué une chose étrange, lorsque j'exécute mon programme la fenêtre s'ouvre en petit (ce qui est normal) avec un scroll vertical seulement, alors que certains fichiers mériteraient un scroll horizontal pour être lus correctement, et je dois ainsi agrandir (puis réduire a nouveau) pour obtenir le scroll horizontal qui de surcroit n'est pas suffisant pour lire le nom complet du fichier....

Disons pour faire simple que j'ai un nom de fichier a rallonge et lorsque je lance le programme je n'en vois qu'une partie (par exemple .src\projet\nomdefichierarallongebeauco), lorsque j'effectue la manipulation dont je te parle (agrandir puis réduire), je vois toujours le nom de fichier toujours incomplet, sous cette forme : .src\projet\nomdefichierarallongebeauco... avec seulement des points de suspension, alors que j'aimerais voir son nom complet avec le scroll donc : .src\projet\nomdefichierarallongebeaucouptroplong

C'est assez dur a expliquer, ainsi je vais prendre un screen de chaque situation et les poster pour que tu me comprennes...
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
20 déc. 2012 à 22:18
Le Swing je l'ai appris sur le tas en aidant les autres sur le forum, je n'ai jamais eu de cours dessus, et je n'en ai quasiment jamais eu besoin pour des projets personnels... Mais il suffit de mettre le nez dans la documentation, elle est très riche... Par exemple : How to Use Lists, A Visual Guide to Layout Managers...
0
killdragon Messages postés 33 Date d'inscription lundi 17 décembre 2012 Statut Membre Dernière intervention 1 janvier 2013
20 déc. 2012 à 22:19
En fin de compte avec un petit panel.updateUI(); ça résout pas mal le soucis, mais justement j'aurais aimé avoir un scroll horizontal aussi, la il est seulement vertical, tu as une idée de ce qui cloche?
0
killdragon Messages postés 33 Date d'inscription lundi 17 décembre 2012 Statut Membre Dernière intervention 1 janvier 2013
20 déc. 2012 à 22:44
En fait non, au final cela ne donne pas ce que je veux, je voulais comme expliqué pour le cas ou j'ai peu de fichiers que la liste des fichiers se résume a ce nombre de fichiers, et si il y en a une grande quantité avoir un scroll, si tu ne vois pas ce que je veux dire je te montre en images, dans quelques minutes
0
killdragon Messages postés 33 Date d'inscription lundi 17 décembre 2012 Statut Membre Dernière intervention 1 janvier 2013
20 déc. 2012 à 22:55
Voila, quand il n'y a pas beaucoup de fichiers je voudrais que la liste des fichiers ne ressemble pas a ça : http://www.hostingpics.net/viewer.php?id=159041Arbopasbonne.jpg mais au contraire je voudrais que cela ressemble a ça : http://www.hostingpics.net/viewer.php?id=769457Arbobonnemaisbug.jpg

Tu vois mieux ce que je veux dire ?

Si peu de fichiers j'aimerais donc que cela me fasse cela : http://www.hostingpics.net/viewer.php?id=769457Arbobonnemaisbug.jpg MAIS sans bug (car si tu regardes bien les boutons sont complètement espacés) en mettant donc la liste sur un borderlayout cela devrait résoudre le soucis, sinon si il y a suffisamment de fichiers pour faire apparaitre un scroll je voudrais donc voir le code que tu m'as donné plus tot...
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié par KX le 20/12/2012 à 23:04
Je ne t'ais pas encore répondu parce que je n'ai pas encore trouvé...

Pour l'instant j'ai ça, mais ça ne suffit pas :
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
0
killdragon Messages postés 33 Date d'inscription lundi 17 décembre 2012 Statut Membre Dernière intervention 1 janvier 2013
Modifié par killdragon le 20/12/2012 à 23:29
En gros je veux garder le code modifié par tes soins pour voir apparaitre un scroll si nécessaire quand on a beaucoup de fichiers, sinon faire ce qui est sur cette photo : http://www.hostingpics.net/viewer.php?id=774691Cequejeveux.jpg

A savoir si peu de fichiers, arrêter la liste en blanc avant le carré noir (donc arrêter la liste lorsque l'on trouve le dernier fichier), et du coup avoir un carré noir "remplit" de la même façon que ce que j'ai entouré en rouge, a savoir un fond gris/bleu basique.

EDIT : Oui, je rajoutais des messages pour t'aider a mieux voir ce que je veux dire en fait :)


EDIT2 : A la limite, ça rend moins esthétique ce que je veux, donc oublie ce que je viens de dire a propos de tous mes précédents posts, je voudrais juste un scroll horizontal qui fonctionne, merci :)
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
21 déc. 2012 à 00:04
J'ai un début de mieux :

1) Les Scroll fonctionnent comme tu le veux (chez moi en tout cas)

MAIS :

2) J'ai du reprendre tout ton code parce que j'avais du mal à m'y retrouver :(

3) Soit on a toujours la liste sur toute la hauteur, soit on a toujours la liste sur seulement la moitié de la hauteur, ça ne dépend pas de la taille de la liste.

Remarque : j'ai laissé quelques commentaires dans le code...

public class ArboIHM extends JFrame 
{
    private static final long serialVersionUID = 1L;
    
    private File test = new File(".");
    private ArboTrieeParNom a1 = new ArboTrieeParNom(test);
    
    // Je te conseilles de mettre un minimum d'attributs graphiques ici
    // En fait il ne devrait y avoir que ce qui possède des valeurs (JList, JTextField, etc.) tout le reste ne sert à rien une fois la fenêtre affichée (JPanel, JLabel, etc.)
    // De plus il est déconseillé d'initialiser les attributs ailleurs que dans un constructeur (à cause de la sérialisation)
    
    private final JList<?> laListe;
    
    private final JTextField nomTexte; 
    private final JTextField tailleTexte;
    private final JTextField dateTexte;

    public ArboIHM() 
    {
        // Remarque : je mets plein d'accolades qui ne servent à rien, mais le code est plus lisible comme ça
        
        JPanel panel = new JPanel(new GridBagLayout());
        {
            GridBagConstraints gbc = new GridBagConstraints();
                    
            JButton triNom = new JButton("Arborescence triée par nom");
            {
                gbc.gridwidth = GridBagConstraints.REMAINDER;
                gbc.gridx = 1;
                gbc.gridy=0;
            }
            panel.add(triNom,gbc);
                        
            JButton triTaille = new JButton("Arborescence triée par taille");
            {
                gbc.gridwidth = GridBagConstraints.REMAINDER;
                gbc.gridx = 1;
                gbc.gridy=1;
            }
            panel.add(triTaille,gbc);
            
            JPanel nom = new JPanel();
            {
                nom.add(new JLabel("Nom : "));
                nomTexte = new JTextField(20);
                nom.add(nomTexte);
                
                gbc.gridx = 3;
                gbc.gridy = 2;
            }
            panel.add(nom, gbc);
            
            JPanel date = new JPanel();
            {
                date.add(new JLabel("Date : "));
                dateTexte = new JTextField(20);        
                date.add(dateTexte);
            
                gbc.gridx = 3;
                gbc.gridy = 3;
                
                panel.add(date, gbc);
            }
    
            JPanel taille = new JPanel();
            {
                taille.add(new JLabel("Taille : "));
                tailleTexte = new JTextField(20);
                taille.add(tailleTexte);
                
                gbc.gridx = 3;
                gbc.gridy = 4;
            }
            panel.add(taille, gbc);
        }
        add(panel, BorderLayout.CENTER);
        
        // OPTION 1 : toute la hauteur tout le temps
        //*
        laListe = new JList(a1.getListe().toArray());
        JScrollPane scroll = new JScrollPane(laListe);
        {

            Dimension dim = scroll.getPreferredSize();
            dim.width=200;
            scroll.setPreferredSize(dim);
            add(scroll, BorderLayout.WEST);
        }
        //*/
        
        // OPTION 2 : la moitié de la hauteur tout le temps
        /*
        laListe = new JList(a1.getListe().toArray());
        JScrollPane scroll = new JScrollPane(laListe);
        {
            Dimension dim = scroll.getPreferredSize();
            dim.width=200;
            scroll.setPreferredSize(dim);
            
            JPanel west = new JPanel();
            west.add(scroll,BorderLayout.NORTH);
            add(west, BorderLayout.WEST);
        }
        //*/
        
        setTitle("Test");
        setSize(700,400);
        setLocationRelativeTo(null);        
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        // Les deux instructions qui suivent doivent toujours se mettre à la fin, sinon ça ne prend pas en compte les changements ! 
        
        //pack(); // il faut choisir, soit tu définis la taille manuellement avec setSize, soit automatiquement avec pack() mais l'un des deux est en trop !
        setVisible(true);
    }

    public static void main(String...args) 
    {
        new ArboIHM();
    }
}
0