Cellule scrollable dans une JTable

Thanos3 Messages postés 7 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 21 août 2004 - 19 août 2004 à 14:16
desastreux Messages postés 50 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 5 août 2009 - 23 juin 2005 à 02:14
Bonjour @ tous.

J'ai un gros pb.
J'ai cree une JTable avec des cellules qui implementes TableCellRenderer pour afficher dans la cellule une JList.

Cette JList contient plusieurs elements mais n'affiche qu'un seul element a la fois. Donc je l'ai placee dans un JScrolPane.

Qd je lance mon appli, tout appare normalement mais lorsque je veux faire defiler ma liste, rien ne se passe. J'ai beau cliquer sur ma scrollbar elle ne veux pas m'afficher le reste de la liste.

Merci de m'aider. (J'en peux plus !!!!)

7 réponses

cs_aishu Messages postés 17 Date d'inscription vendredi 7 mai 2004 Statut Membre Dernière intervention 24 août 2004
20 août 2004 à 08:04
Salut
Bon je ne suis po trop sure de ce que j'avance mais tu as peut-être ajouté ton JScrollPane au mauvais endroit...
Je crois que tu doit ajouter ta JList à la scroll (JScrollPane jc = new JScrollPane(JList);) puis ajouter ta scroll (jc) à la table... quelque chose comme ca... Désolée si g raconté n'imp mais je débute... :shy)

:big) Aishu :shy)
0
Thanos3 Messages postés 7 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 21 août 2004
20 août 2004 à 11:41
salut,

En faite c'est deja ce que je fais. Tiens voila le code qui correspond a ma classe de cellule :

public class GTableInfoCellRenderer implements TableCellRenderer {
    private GFontInfo font;
    private Color cBack;

    public GTableInfoCellRenderer(Color c) {
        super();
        this.cBack = c;
        font = new GFontInfo();
    }

    public Component getTableCellRendererComponent(
        JTable table,
        Object value,
        boolean isSelected,
        boolean hasFocus,
        int row,
        int column) {
        JLabel label = null;
        JComponent ret = null;

       if (value instanceof ArrayList) {
            ArrayList aList = (ArrayList) value;

            if (aList.size() > 0) {
                DefaultListModel modelList = new DefaultListModel();
                for (int i = 0; i < aList.size(); i++) {
                    UnElement e = (UnElement) aList.get(i);
                    modelList.addElement(e);
                }

                JList list = new JList(modelList);
                list.setVisibleRowCount(1);
                JScrollPane sp =
                    new JScrollPane(
                        list,
                        JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                        JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
                     list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
     DefaultListCellRenderer cell = new DefaultListCellRenderer();                cell.setHorizontalAlignment(DefaultListCellRenderer.CENTER);
                list.setCellRenderer(cell);
                ret = new JPanel();
                ret.add(sp);
}
return (ret);
}
}

Donc en faite ce sont les infos qui sont dans l'ArrayList que je veux mettre dans une JList.

Voila. @qui poura m'aider....
0
cs_Zart Messages postés 285 Date d'inscription jeudi 29 juillet 2004 Statut Membre Dernière intervention 27 juin 2006 1
21 août 2004 à 10:15
En fait je pense que tu t'y prend mal à ce niveau :
JScrollPane sp =
new JScrollPane(
list,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

Moi j'implémente de cette manière :
JScrollPane jsp = new JScrollPane();
...
Et ensuite je fais :
jsp.setViewPort(list);

En regardant dans l'api tu comprendras mieux pourquoi !?!
0
Thanos3 Messages postés 7 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 21 août 2004
21 août 2004 à 14:36
Salut Zart,
J'ai fait comme tu m'as dit.
D'abord : jsp.setViewPortView(list); car setViewPort prend une JView en parametre. Ca marche pas mieux. :sad)
Ensuite j'ai fait :
JViewport jvp = new JViewport();
jvp.setView(list);
jsp.setView(jvp);
Ca marche pas non plus. %-6

Je pense qu'il faut surcharger une methode pour que les info dans la cellule soit bien interpreté. Car pour l'instant l'affichage par la JTable bloque ma JList.

alors ....
0

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

Posez votre question
desastreux Messages postés 50 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 5 août 2009
23 juin 2005 à 01:12
Bonsoir les JTableux !
Je venais aux nouvelles car je fais face ( si on veux ) à un problème assez similaire : En effet, moi aussi JVoulu équiper la JCell d'une JTable avec un JScrollPane. Dans un premier temps, ma JCell permettait le renderer d'un JTextPane ( Histoire d'obtenir une JTable avec du texte plein de couleurs et de styles différents ) - Ce même JTextPane étant lui-même un peu spécial puisque disposant d'une image en Background. Bref, tout ça pour dire que le résultat était plutôt sympa, sauf que la totalité de mon texte n'apparaissait pas dans le JTextPane affiché, ce dernier étant tronqué en fonction de la taille de la cellule. Sachant qu'on peut changer la hauteur et la largeur des lignes aussi bien que des colonnes, j'ai penser faire en sorte que mes lignes s'adaptent à la plus grande dimension demandée ( Je ne vois pas comment changer la taille des lignes séparémment pour les adapter individuellement, ce qui n'aurait pas été si mal... ) Bon, pas de soucis, je décide de passer par un JScrollPäne, même si je sais qu'il va devenir de plus en plus difficile de récupérer le simple texte contenu dans ma CELL, puisque ce dernier devra être extrait d'un truc du genre :

JScrollPane cellScroller = (JScrollPane) (monDérivéDeAbstractTableModel.getValueAt( maJTable.getSelectedRow(),maJTable.getSelectedColumn));
JTP = (JTextPaneAvecFond) cellScroller.getComponent(0).getComponentAt(0,0);

( Puisque, comme vous le dites plus haut, le JViewPort est le JFriend du JScrollPane : Ici cellScroller.getComponent(0) ) Sans le moindre sarcasme, je n'ose même pas imaginer les Casting du Môssieur ci-dessus qui implémente avec JList... Bref, même problème que ce sympathique consort, je me retrouve avec des JScrollPane affichés dans mes CELL dont le JTextPane n'est pas complètement apparent, mais lors du clic dessus, il doit manquer un JTable.revalidate() quelque-part, car rien ne bouge...
Sur ce, j'y retourne moi aussi et je vous tiens au courant si j'ai du neuf.
0
desastreux Messages postés 50 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 5 août 2009
23 juin 2005 à 01:37
Ce n'est pas une histoire de rafraichissement des graphismes puisque avec une gestion du clic sur la JTable, on voit que :

void maJTable_mouseReleased(MouseEvent e)
{
JScrollPane cellScroller = (JScrollPane) (monDérivéDeAbastractTableModel.getValueAt(maJTable.getSelectedRow(),maJTable.getSelectedColumn()));
System.out.println(cellScroller.getViewport().getViewPosition());
}

...LE clic sur la JScrollBar donne alors systématiquement le résultat suivant :
java.awt.Point[x=0,y=0]
Ce qui signifie bien que le clic n'a pas été interprêté comme étant sur la JScrollBar...
Cela risque donc d'être bcp plus ennuyeux. J'y retourne.
0
desastreux Messages postés 50 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 5 août 2009
23 juin 2005 à 02:14
Autre observation qui abonde dans le même sens : Il devient impossible de récupérer la position du JScrollPane inséré dans une CELL ( Quel que soit celui sur lequel on clique , on obtient ainsi systématiquement les mêmes coordonnées négatives ( ? ). Dômmage, car on aurait pu alors vérifier s'il y avait clic sur les boutons d'une scrollBar et actualiser le viewPort manuellement en conséquence... On frôle l'impasse, là, non ?
0
Rejoignez-nous