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] comment colorer une case


Sujet :

Composants Java

  1. #1
    Rédacteur
    Avatar de cladsam
    Profil pro
    Inscrit en
    Août 2003
    Messages
    1 785
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2003
    Messages : 1 785
    Points : 2 436
    Points
    2 436
    Par défaut [JTable] comment colorer une case
    Bonjour,

    j'essaie de réaliser le jeu de la vie en java. Je n'y connais rien en interface graphique java. Je n'ai pas trouvé de tutorial assez simple pour moi, et je suis a peine parvenu a creer un JTable contenu dans un Container. Mon but est le suivant: je voudrais qu'a chaque iteratiion d'une boucle fort certaines cellules passe du gris au rouge... ou le contraire.
    J'aimerais donc savoir comment faire pour changer la couleru d'une cellule selon ses coordonnées x y .
    Il y a bien un exemple dans la FAQ mais c'est trop compliqué pour moi et ca ne répond pas exactement a mon attente. Autre point de détail j'aimerais que l'utilisateur ne puisse pas décider de changer le contenu d'une case , qu'elle soit non editable quoi!
    Merci a uqi prendra le temps de répondre car parfois les tutos de sun ... ils oublient qu'avant d'être ingenieur ... il fuat bien débuter!


    [ Modéré par Bulbo ]
    Ajout d'un tag dans le titre
    Les Règles du Forum
    Chef de Projet SAP. Certifié Prince2 Practitioner
    ---------------------------------------------------
    Anakin Skywalker turned to the Dark Side after his failed attempt to upgrade R/2-D2 to R/3-D2.

  2. #2
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    Salut, je sais pas trop si ça va t'aider mais je sais quel certains composants graphiques comme les JLabel acceptent les tags html, donc si un JTable est composé de JLabel il ne devrait pas y avoir de problème. Mais je sais vraiment pas si c'est le cas..

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    194
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 194
    Points : 102
    Points
    102
    Par défaut
    Si tu n'y connais vraiment rien en interface graphique, je te déconseille vivement de commencer avec le composant JTable, c'est de loin le plus complexe à manipuler (mais aussi le plus puissant)

    Pour ton pb de colorer une cellule, en particulier, il faut que tu personalise le CellRenderer de ta table. C'est pas tres compliqué mais il vaut mieux avoir compris le principe de fonctionnement des Jtables (MVC).

  4. #4
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 35
    Points : 19
    Points
    19
    Par défaut
    Il faudrait que tu crée une autre classe ou tu pourra definir le Renderer de tes cellules, autrement dit la decoration

    Je te conseille vivement le tutorial de Sun qui reste assez abordable malgré tes réticences ...

    A la limite recupere les exemples du tutorial et adapte les a ton appli !

  5. #5
    Rédacteur
    Avatar de cladsam
    Profil pro
    Inscrit en
    Août 2003
    Messages
    1 785
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2003
    Messages : 1 785
    Points : 2 436
    Points
    2 436
    Par défaut une autre methode???
    Bon très sincérement je m'en sort pas avec ma JTable... c'est vraiment la misère a mon niveau!!!
    POurquoi j'ai choisi ce composant? parceque comme je l'ai dit avant je n'y connait rien en Java, donc j'ai pris le truc que j'ai trouvé dans la doc qui semblait pas mal pour creer un tableau ... vu qu'il m'affichait mon quadrillage en quelque lignes de codes.
    Existe t'il une autre façon de procéder? PAr exemple je vais peut etre dire une stupidité mais n'y a t'il pas moyen de dessiner le quadrillage a la main et de dire ensuite: je remplit en rouge entre telle et telle ligne... et a chaque generation de mon jeu de la vie je n'ai qu'a changer la couleur dans les cases ou ca a changé sans utiliser le JTable. Bref juste avec des technique a la paint : des rectangles , des traits , des remplissage couleur? Si c'ets faisable je suis preneur parceque je suis vraiment pas doué avec les swing et j'ai pas des années pour rendre mon boulot :-(
    Chef de Projet SAP. Certifié Prince2 Practitioner
    ---------------------------------------------------
    Anakin Skywalker turned to the Dark Side after his failed attempt to upgrade R/2-D2 to R/3-D2.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 95
    Points : 140
    Points
    140
    Par défaut
    Oui, tu peux faire ton propre JComponent très facilement. Regarde ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class Dessin extends JComponent {
      protected void paintComponent(Graphics graphics) {
        Graphics2D g = (Graphics2D) graphics;
        ...
      }
    }
    En faisant ceci, tu as ton JComponent, et tu dessines grâce à un java.awt.Graphics2D où tu as pleins de méthodes de dessins. Je pense que ça devrait faire ton bonheur !

  7. #7
    Membre habitué
    Inscrit en
    Septembre 2003
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 174
    Points : 194
    Points
    194
    Par défaut
    Salut,
    A mon avis, tu ne devrais pas te decourager face aux JTable ... ce n'est pas si complique que ca.
    Si tu veux j'ai un petit exemple sous la main dans lequel apres un click sur le bouton, les cellules changent de couleur aleatoirement a chaque iteration d'une boucle :
    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
    public class MyFrame extends JFrame {
    	private MyTable myTable = new MyTable();
    	private JButton button = new JButton("Change les couleurs");
     
    	public static void main(String[] args) {
    		MyFrame myFrame = new MyFrame();
    	}
     
    	public MyFrame() {
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		getContentPane().setLayout(new BorderLayout());
    		getContentPane().add(button, BorderLayout.NORTH);
    		getContentPane().add(new JScrollPane(myTable));
    		button.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent arg0) {
    				Thread t = new Thread() {
    					public void run() {
    						for(int i = 0; i <20;i++){
    							myTable.changeCellsColor();
    							try {
    								Thread.sleep(200);
    							} catch (InterruptedException e) {
    								e.printStackTrace();
    							}
    						}
    					}
    				};
    				t.start();
    			}
    		});
     
     
    		this.pack();
    		this.show();
    	}
     
    	class MyTable extends JTable {
    		private int[][] colorIndexes = new int[5][5];
    		public MyTable() {
    			super(5, 5);
    			initColorIndexes();
    			this.setDefaultRenderer(
    				Object.class,
    				new MyCellRenderer(colorIndexes));
    		}
     
    		private void initColorIndexes() {
    			Random random = new Random();
    			for (int i = 0; i < colorIndexes.length; i++) {
    				for (int j = 0; j < colorIndexes[i].length; j++) {
    					colorIndexes[i][j] = random.nextInt(2);
    				}
    			}
    		}
    		public void changeCellsColor() {
    			initColorIndexes();
    			this.setDefaultRenderer(
    				Object.class,
    				new MyCellRenderer(colorIndexes));
    			updateUI();
    		}
    	} //:-
     
    	class MyCellRenderer extends DefaultTableCellRenderer {
    		private int[][] colorIndexes;
    		public MyCellRenderer(int[][] colors) {
    			super();
    			this.colorIndexes = colors;
    		}
     
    		public Component getTableCellRendererComponent(
    			JTable table,
    			Object value,
    			boolean isSelected,
    			boolean hasFocus,
    			int row,
    			int column) {
    			Component c =
    				super.getTableCellRendererComponent(
    					table,
    					value,
    					isSelected,
    					hasFocus,
    					row,
    					column);
    			switch (colorIndexes[row][column]) {
    				case 0 :
    					c.setBackground(Color.GRAY);
    					break;
    				case 1 :
    					c.setBackground(Color.RED);
    					break;
    				default :
    					{
    						if (!isSelected)
    							c.setBackground(
    								UIManager.getLookAndFeelDefaults().getColor(c));
    					}
    			}
    			c.setForeground(Color.BLACK);
    			return c;
    		}
    	} //:-
     
    } ///:-
    Si tu as des questions, n'hesite pas ...

    sylvain_2020

  8. #8
    Rédacteur
    Avatar de cladsam
    Profil pro
    Inscrit en
    Août 2003
    Messages
    1 785
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2003
    Messages : 1 785
    Points : 2 436
    Points
    2 436
    Par défaut merci
    Merci beaucoup a tous,

    Sylvain, ton code est génial , déjà il me permet de comprendre un truc que j'avais mal apréhendé au préalable , le fait qu'il fallait redefinir le cellrenderer et surtout comment faire ca :-)
    J'ai une derniere petite question. Dans mon programe; lorsque je clique sur démarrer , le jeu affiche une a une les differentes etapes. J'ai un bouton STOP qui permet d'arreter avant la fin normale du thread a savoir "lorsqu'un etat stable (idem plus de changement) est trouvé".

    LE truc c'est que j'imaginais une methode genre monthread.stop(); associée a l'action du bouton.
    Mais la doc java dit que cette methode est Deprecated, sauriez-vosu me dire ce que je dois utiliser en remplacement?
    Chef de Projet SAP. Certifié Prince2 Practitioner
    ---------------------------------------------------
    Anakin Skywalker turned to the Dark Side after his failed attempt to upgrade R/2-D2 to R/3-D2.

  9. #9
    Membre habitué
    Inscrit en
    Septembre 2003
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 174
    Points : 194
    Points
    194
    Par défaut Re: merci
    Salut,
    Citation Envoyé par cladsam
    J'ai une derniere petite question. Dans mon programe; lorsque je clique sur démarrer , le jeu affiche une a une les differentes etapes. J'ai un bouton STOP qui permet d'arreter avant la fin normale du thread a savoir "lorsqu'un etat stable (idem plus de changement) est trouvé".

    LE truc c'est que j'imaginais une methode genre monthread.stop(); associée a l'action du bouton.
    Mais la doc java dit que cette methode est Deprecated, sauriez-vosu me dire ce que je dois utiliser en remplacement?
    La Javadoc te dit :
    stop()
    Deprecated. This method is inherently unsafe. Stopping a thread with Thread.stop causes it to unlock all of the monitors that it has locked (as a natural consequence of the unchecked ThreadDeath exception propagating up the stack). If any of the objects previously protected by these monitors were in an inconsistent state, the damaged objects become visible to other threads, potentially resulting in arbitrary behavior. Many uses of stop should be replaced by code that simply modifies some variable to indicate that the target thread should stop running. The target thread should check this variable regularly, and return from its run method in an orderly fashion if the variable indicates that it is to stop running. If the target thread waits for long periods (on a condition variable, for example), the interrupt method should be used to interrupt the wait. For more information, see Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?.
    Ca ne te suffit pas comme reponse ?

    sylvain_2020

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    Voila l'exemple d'un thread où il suffit d'appeler la méthode stopBis() pour l'arrêter :
    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
     
    class MonThread extends Thread {
     
        private boolean stopThread;
     
        public MonThread() {
            super();
            stopThread = false;
        }
     
        public void run() {
     
            boolean fin = false;
     
            while (!fin) {
     
                //traitement du thread
     
                synchronized (this) {
                    // lecture du boolean d'arret
                    fin = this.stopThread;
                }
            }
        }
     
        //méthode d'arret du thread
        public synchronized void stopBis() {
            this.stopThread = true;
        }
    }
    j'espère que cela te sera utile

  11. #11
    Rédacteur
    Avatar de cladsam
    Profil pro
    Inscrit en
    Août 2003
    Messages
    1 785
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2003
    Messages : 1 785
    Points : 2 436
    Points
    2 436
    Par défaut je dosi vraiment etre handicapé du java
    Voial vous allez dire que j'abuse et que je suis vraiment le gars qui n'y comprend rien au java... j'accepte cette critique fondée et je me permets encore une petite question qui va encore paraitre simpliste mais qui bien entendu ne l'est pas pour moi...
    partant de ce que me dit Saem je crée mon thread avec les variables pour pouvoir le stoper et une methode publique pour changer cette variable. Ouf ca marche mon bouton démarrer fonctionne lorsque je fais un t.start ( t étant de type Monthread) le bouton qui sert a stoper t avant la fin de ses iterations ..;fonctionne aussi venant de moi c'est un bon debut :-)
    Maintenant je clique de nouveau sur démarrer et paf( pas le chien) mon thread ne redémarre pas. EN admettant que start ne puisse etre utilisé qu'une fois par thread j'essaie avec run(). ET la ... effet mais pas le bon j'explique: mon thread doit appeler 30 fosi la methode maTable.etatSuivant(); (sauf s'il est interrompu avant)... lorsque j'utilise run() je ne vois s'afficher que la toute derniere des iterations et pas chacune l'une apres l'autre comme avec start... mais avec start une fois les 30 finies ou lorsqu'il y a eu interruption impossible de recommencer de nouveau 30 iterations en cliquant de nouveau sur démarrer , quelqu'un pourrait m'expliquer pourquoi et , plus difficile dans un langage que meme moi je puisse comprendre?
    merci :-)
    Chef de Projet SAP. Certifié Prince2 Practitioner
    ---------------------------------------------------
    Anakin Skywalker turned to the Dark Side after his failed attempt to upgrade R/2-D2 to R/3-D2.

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 95
    Points : 140
    Points
    140
    Par défaut
    En fait, tu veux plutôt pouvoir interrompre un thread, et lui faire reprendre son traitement ? Dans ce cas, il faut utiliser les méthodes wait() et nofity(). Parceque lorsque la méthode run() d'un thread s'arrête, il ne faut pas relancer le thread.

  13. #13
    Rédacteur
    Avatar de cladsam
    Profil pro
    Inscrit en
    Août 2003
    Messages
    1 785
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2003
    Messages : 1 785
    Points : 2 436
    Points
    2 436
    Par défaut alors la!
    Merci merci , sur le coup c'est précis et concis comme réponse merci beaucoup je peux mettre un résolu maintenant merci
    Chef de Projet SAP. Certifié Prince2 Practitioner
    ---------------------------------------------------
    Anakin Skywalker turned to the Dark Side after his failed attempt to upgrade R/2-D2 to R/3-D2.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. comment colorer une cellule dans un JTable sous NerBeans?
    Par khadi8 dans le forum Composants
    Réponses: 1
    Dernier message: 22/04/2012, 17h39
  2. Comment colorer une ligne d'un tableau avec une case à cocher ?
    Par Gdal dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 06/08/2011, 11h11
  3. comment colorer une case d'un tableau?
    Par zangaloni dans le forum Composants
    Réponses: 4
    Dernier message: 13/05/2009, 17h44
  4. Comment colorer une cellule de JTable
    Par bainf dans le forum Composants
    Réponses: 1
    Dernier message: 29/03/2009, 22h11
  5. Comment récupérer une case d'un dbGrid ?
    Par jeje.r dans le forum Composants VCL
    Réponses: 14
    Dernier message: 22/09/2005, 17h56

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