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 :
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
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; } } }
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.
Partager