Bonjour,

J'ai beau faire plein d'essais, je n'arrive pas à obtenir ce que je souhaite :
Je suis en train de créer un jeu de Morpion (léger). Pour cela j'ai défini sous forme de JTable une grille 9x9. En cliquant sur une case, je la remplis alternativement soit avec un X soit avec un O. Cela marche bien.

Par contre ce que je souhaite c'est que lorsque j'ai 3 X ou 3 O (pour l'instant pas forcement contigus) je veux les colorier en rouge ou vert selon le caractère. Pour cela j'ai défini 2 vecteurs (rouge et bleu) dans lesquels je place les coordonnées de la case sous forme de clef ("10*ligne + colonne" car le nombre de cases est <10).

J'ai donc défini une classe renderer :
jt.setDefaultRenderer(Object.class, new MyRenderer());

Le problème que j'ai avec cette classe c'est que je n'arrive pas à colorier uniquement les cases dont les clefs sont copiées dans les vecteurs rouge ou bleu.

En réalité, la couleur des caractères devient complètement anarchique (tout en rouge ou tout en vert selon les cas).

Il est probable que je n'ai pas bien compris comment je devais faire pour ne colorier qu'une seule case, aussi si vous pouviez m'aider à comprendre comment tout cela fonctionne ce serait super sympa. Merci d'avance

Gégé

PS: Pour l'instant le code ci-dessous n'est pas très optimisé ni très propre car je suis en test et j'en suis conscient.

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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
 
package test;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.util.Vector;
 
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.border.Border;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
 
	public class TestMorpion  extends JFrame implements java.awt.event.ActionListener, ListSelectionListener
	{
	        int currentLigne =0;
	        int currentColonne =0;
	        int cells 	= 9 ;    // nombre de cases par ligne  ou colonnes 
	        protected String[][] valeur 	= new String[cells][cells];
 
	        protected String c = "";
	        protected JPanel JFrameContentPane = new JPanel();
	        protected JPanel panel = null;
	        protected JLabel monLabel, message;
	        protected DefaultTableModel dtm ;
	        protected JButton Terminer ; 
	        private JTable jt = null;
	        protected ListSelectionModel lsm = null;
	        Vector rouge = null;
	        Vector bleu = null;
	        int jeu = 0;
 
	        boolean  toggle=true,
	                 inProcess=false;
 
	        public TestMorpion() 
	        {
	            super("Jeux de pions");
	            panel = new JPanel();
	            JFrameContentPane.setLayout(null);
	            setSize(309, 344);
	    		setContentPane(JFrameContentPane);
	            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	            definirGrille();
	            definirBoutons();
	            this.setLocationRelativeTo(null);
	            this.setVisible(true);
	        }
 
	        void definirBoutons()
	        {
 
	             Terminer = new JButton();
	             Terminer.setBounds(170, 230, 86, 25);
	             Terminer.setText("Quitter");
	             JFrameContentPane.add(Terminer);
	             Terminer.addActionListener(this);
	        }
 
	        void definirGrille()
	        {
	        	panel = new javax.swing.JPanel();
	    		panel.setName("monPaneau");
	    		panel.setLayout(new java.awt.GridLayout());
	    		panel.setBounds(10, 44, 272, 151);
	    		panel.setBackground(Color.white);
	    		// on défini la grille 
	    		dtm = new DefaultTableModel(cells,cells);
 
		        jt = new JTable(dtm);
		        jt.setDefaultRenderer(Object.class, new MyRenderer()); 
		    	panel.add(jt);
		    	jt.setCellSelectionEnabled(true);
		    	jt.setGridColor( Color.BLACK) ;  
		    	JFrameContentPane.add(panel);
 
		    	Border raisedbevel, loweredbevel, compound;
		    	raisedbevel = BorderFactory.createRaisedBevelBorder();
		    	loweredbevel = BorderFactory.createLoweredBevelBorder();
		    	compound = BorderFactory.createCompoundBorder(raisedbevel, loweredbevel);
	            panel.setBorder(compound);
 
	            lsm = jt.getSelectionModel(); 
	            lsm.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
	            clearGrille();
	            lsm.addListSelectionListener(this); 
 
	        }
 
	        @Override
	        public void actionPerformed(ActionEvent e) 
	        {
	          if (e.getSource() == Terminer) 	{ System.exit(0);}
	        }
 
	        void clearGrille()
	        {
	        	lsm.removeListSelectionListener(this);
	        	rouge = new Vector();
	            bleu = new Vector();
	        	for (int i=0; i<cells;i++)
	        		for (int j=0;j<cells;j++) jt.setValueAt(" ", i, j);
	        	lsm.addListSelectionListener(this);
	        }
 
	        public void valueChanged(ListSelectionEvent listSelectionEvent)
	        {
	                int ligne =  jt.getSelectedRow();
	                if (ligne<0)return; // ligne invalide
	                int colonne = jt.getSelectedColumn();
	                if (colonne<0) return; // ligne invalide
	               	executerMorpion(ligne, colonne); 
	        }
 
	        private void executerMorpion(int i,int j) 
	        {
	        	String wk = "",   old;
	        	old = ((String) jt.getValueAt(i, j));
	        	if (old==null) old="";
	        	old=old.trim();
	            if (!old.equals("")) 
	            	return;  // case déjà occupée.
	            if (rouge.size()>=3) rouge.clear(); 
	        	if (bleu.size()>=3)  bleu.clear(); 
	        	if (toggle) 
	        	{	
	        		wk ="X";
	        		toggle=false;
	        		rouge.add(rouge.size(),""+(10*i +j));
	        	}
	        	else   
	        	{
	        		wk ="O";
	        		toggle=true;
	        		bleu.add(bleu.size(),""+(10*i +j));
	        	}
	        	currentLigne=i;
	        	currentColonne=j;
	        	valeur[i][j] = wk;
	        	jt.setValueAt("  "+ wk, i, j);
	        }
 
 
			public static void main(String args[]) 
			{
	             new TestMorpion();
	        }
 
			public class MyRenderer extends  javax.swing.table.DefaultTableCellRenderer 
			{
				private static final long serialVersionUID = 1L;
 
				@Override
				public  Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col)  
				{
				      Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
				    // ON retourne immédiatement si certaine conditions ne sont pas remplies 
				      if ( row < 0 || col < 0) return c;
				      String old = valeur[row][col];
				      if (old==null ) return c;
				      if ( old.trim().equals("")) return c;
				      if (rouge == null) return c ;
					  if (bleu == null) return c;
				      Vector vb = bleu;  // on recopie les vecteur pour raisons de test
				      Vector vr = rouge;
				      if (vr.size()<3 && vb.size()< 3 ) return c;   // aucun vecteur n'a 3 entrées
				    // fin des conditions pour retour immédiat
 
				      String clef =  String.valueOf(10*row+col); // on calcule la clef de cette case  pour raison de performance
				      if (vr.indexOf(clef)< 0 & vr.indexOf(clef)< 0) return c; // trouvé dans aucun vecteur donc pas de changement de couleur. 
 
				      String car="";
				      if (vr.size()>=3)
				      {	  
				    	  for (int i=0; i< vr.size(); i++)
				    	  {	  
				    		 car = (String) vr.elementAt(i);
				    		  if (car.equals(clef) && old.equals("X")) 
				    		  {	  
				    			  c.setForeground(Color.RED);
				    			  return c;
				    		  }	  
				    	  } 
				      }	  
				      if (vb.size()>=3)
					  {	  
				    	  for (int i=0; i< vb.size(); i++)
				    	  {	  
				    		  car = (String) vr.elementAt(i);
				    		  if (car.equals(clef) &&  old.equals("O"))  
				    		  {	  
				    			  c.setForeground(Color.GREEN);  
				    			  return c;
				    		  }	  
				    	  } 
					  }
 
				 	c.setForeground(Color.BLACK);
		    	    return c;    
				   }
				}
				private static final long serialVersionUID = 1L;
 
				static String afficherMenu(String morpion) {
		            throw new UnsupportedOperationException("Not yet implemented");
		        }	
	    }