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 :

JTable contenant des JComboBox contenant des Images


Sujet :

Composants Java

  1. #1
    En attente de confirmation mail
    Inscrit en
    Février 2007
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 162
    Points : 72
    Points
    72
    Par défaut JTable contenant des JComboBox contenant des Images
    Bonjour,

    j'ais un problème assez complexe que je n'arrive pas à résoudre, je vais essayer de l'expliquer le plus clairement possible.

    Mon problème est dans l'affichage d'une liste déroulante contenant des images (Jcombobox) dans ma Jtable. Sachant que les Jcombobox dans ma Jtable sont différentes !

    Alors voici comment je met des jcombobox différentes dans ma jtable :

    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
     
    ...
     
    private EachRowEditor myRowEditor=new EachRowEditor ();
     
    ...
     
    public void addNewCombobox(int row,String File1, String File2, String text1, String text2){
     
     
    myImages = new ImageIcon[2];
    myList= new String[2];
     
    myImages[0]= new ImageIcon(File1);
    myImages[1]= new ImageIcon(File2);
    myList[0]= text1;
    myList[1]= text2;
     
    //On génére le renderer qui affiche les images
    ComboBoxRenderer renderer= new ComboBoxRenderer(myImages,myList);
     
    renderer.setPreferredSize(new Dimension(200, 130));
     
    //On change le renderer de myCombo pour qu'il affiche une liste d'images
    myCombo[row].setRenderer(renderer);
     
    myCombo[row].setMaximumRowCount(3);
     
    //On change l'editor à la ligne row
    myRowEditor.setEditorAt(row, new DefaultCellEditor(myCombo[row]));
     
    //On ajoute met a jour le celleditor de la Jtable
    myTable.getColumn(5).setCellEditor(myRowEditor);
     
    }
     
    ...

    Voici la classe EachRowEditor qui fonctionne :

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    public class EachRowEditor implements TableCellEditor {
      protected Hashtable editors;
      protected TableCellEditor editor, defaultEditor;
      JTable table;
     
      public EachRowEditor(JTable table) {
        this.table = table;
        editors = new Hashtable();
        defaultEditor = new DefaultCellEditor(new JTextField());
      }
     
      /**
       * @param row    table row
       * @param editor table cell editor
       */
      public void setEditorAt(int row, TableCellEditor editor) {
        editors.put(new Integer(row),editor);
      }
     
      public Component getTableCellEditorComponent(JTable table,
          Object value, boolean isSelected, int row, int column) {
        //editor = (TableCellEditor)editors.get(new Integer(row));
        //if (editor == null) {
        //  editor = defaultEditor;
        //}
        return editor.getTableCellEditorComponent(table,
                 value, isSelected, row, column);
      }
     
      public Object getCellEditorValue() {
        return editor.getCellEditorValue();
      }
      public boolean stopCellEditing() {
        return editor.stopCellEditing();
      }
      public void cancelCellEditing() {
        editor.cancelCellEditing();
      }
      public boolean isCellEditable(EventObject anEvent) {
        selectEditor((MouseEvent)anEvent);
        return editor.isCellEditable(anEvent);
      }
      public void addCellEditorListener(CellEditorListener l) {
        editor.addCellEditorListener(l);
      }
      public void removeCellEditorListener(CellEditorListener l) {
        editor.removeCellEditorListener(l);
      }
      public boolean shouldSelectCell(EventObject anEvent) {
        selectEditor((MouseEvent)anEvent);
        return editor.shouldSelectCell(anEvent);
      }
     
      protected void selectEditor(MouseEvent e) {
        int row;
        if (e == null) {
          row = table.getSelectionModel().getAnchorSelectionIndex();
        } else {
          row = table.rowAtPoint(e.getPoint());
        }
        editor = (TableCellEditor)editors.get(new Integer(row));
        if (editor == null) {
          editor = defaultEditor;
        }
      }
    }
    Et voici celui qui est sensé changer le renderer de mes jcombobox mais qui bug
    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
    58
    59
    60
    61
    62
     
    public class ComboBoxRenderer extends JLabel implements ListCellRenderer {
            private Font uhOhFont;
     
            public ComboBoxRenderer(ImageIcon[] myImages, String[] myList) {
                setOpaque(true);
                setHorizontalAlignment(CENTER);
                setVerticalAlignment(CENTER);
                this.Images=myImages;
                this.List=myList;
     
            }
     
            /*
             * This method finds the image and text corresponding
             * to the selected value and returns the label, set up
             * to display the text and image.
             */
            public Component getListCellRendererComponent(
                                               JList list,
                                               Object value,
                                               int index,
                                               boolean isSelected,
                                               boolean cellHasFocus) {
                //Get the selected index. (The index param isn't
                //always valid, so just use the value.)
                int selectedIndex = ((Integer)value).intValue();
     
                if (isSelected) {
                    setBackground(list.getSelectionBackground());
                    setForeground(list.getSelectionForeground());
                } else {
                    setBackground(list.getBackground());
                    setForeground(list.getForeground());
                }
     
                //Set the icon and text.  If icon was null, say so.
                ImageIcon icon = Images[selectedIndex];
                String pet = List[selectedIndex];
                setIcon(icon);
                if (icon != null) {
                    setText(pet);
                    setFont(list.getFont());
                } else {
                    setUhOhText(pet + " (no image available)",
                                list.getFont());
                }
     
                return this;
            }
     
            //Set the font and text when no image was found.
            protected void setUhOhText(String uhOhText, Font normalFont) {
                if (uhOhFont == null) { //lazily create this font
                    uhOhFont = normalFont.deriveFont(Font.ITALIC);
                }
                setFont(uhOhFont);
                setText(uhOhText);
            }
            private ImageIcon[] Images;
            private String[] List;
        }

    Le problème actuel, c'est que lorsque je clique sur ma cellule de ma jtable qui est sensé affiché une liste déroulante , j'ai l'erreure suivante :
    "Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException"
    qui pointe sur la ligne de code suivante :
    "int selectedIndex = ((Integer)value).intValue();" de ma classe ComboBoxRenderer


    Je vous remerci d'avance pour toutes les réponses que vous pourrez m'apporter



    PS : je ne change pas le renderer de ma Jtable c'est voulu.

  2. #2
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 108
    Points : 3 203
    Points
    3 203
    Par défaut
    "int selectedIndex = ((Integer)value).intValue();" de ma classe ComboBoxRenderer
    le probleme doit venir du modele de ta table qui renvoit une valeur nulle comme contenu de la cellule.

    public class ComboBoxRenderer extends JLabel implements ListCellRenderer {
    pourquoi ListCellRenderer? ce n'est pas une liste c'est une table. utilise un tablecellrenderer

  3. #3
    En attente de confirmation mail
    Inscrit en
    Février 2007
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 162
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par eclesia
    le probleme doit venir du modele de ta table qui renvoit une valeur nulle comme contenu de la cellule.



    pourquoi ListCellRenderer? ce n'est pas une liste c'est une table. utilise un tablecellrenderer
    Pour ce qui est de la mon table model, il contient bien une valeur dans chaque cellule donc ce n'est pas ça le pb...

    Pour ce qui est du ListCellRenderer c'est parceque c'est une liste déroulante et pas une table déroulante je suppose....

    PS : voila ou j'ais trouvé le code du comboboxrenderer :
    http://java.sun.com/docs/books/tutor....html#renderer
    (leur lien vers la classe CustomComboBoxDemo.java n'est pas à jour, j'ais envoyé un mail au webmaster, mais il ne l'as pas corrigée...j'ai retrouvé cette classe ici )

  4. #4
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 108
    Points : 3 203
    Points
    3 203
    Par défaut
    Pour ce qui est de la mon table model, il contient bien une valeur dans chaque cellule donc ce n'est pas ça le pb...
    je fais avec les infos qu'on me donne. je dis que ta valeur dans la cellule est a nulle (et le compilateur le dit) :

    "Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException"
    et il n'y a qu'une seule variable qui peut retourner cette erreur dans la ligne :
    int selectedIndex = ((Integer)value).intValue();
    par ailleur tu ne devrais pas utiliser cette article car on ne place pas un combobox comme ca dans une jtable.

    prends exemple ici : http://www.iam.ubc.ca/guides/javatut...nts/table.html

  5. #5
    En attente de confirmation mail
    Inscrit en
    Février 2007
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 162
    Points : 72
    Points
    72
    Par défaut
    Merci pour le lien !

    Par contre je persiste à dire que toutes mes cellules ont un string dedans
    Et c'est là le problème je ne comprends pas d'ou ça peux venir !

Discussions similaires

  1. Remplacer des JTextField Par des JComboBox
    Par Floriang33 dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 16/11/2009, 10h37
  2. Réponses: 3
    Dernier message: 14/01/2009, 10h38
  3. Réponses: 4
    Dernier message: 02/04/2008, 17h51
  4. Réponses: 3
    Dernier message: 13/09/2007, 18h11
  5. Réponses: 3
    Dernier message: 23/01/2007, 08h14

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