[Java]Rien ne s'affiche lors d'un clic

Bonjour,

j’ai écrit un programme qui devrait me permettre de dialoguer lorsque je clique sur une des cases de la colonne Mercredi.
Le problème c’est que je n’obtiens rien mais je n’arrive pas à trouver d’ou vient le problème.

bonsoir,
c’est plutôt bien écrit, mais ça manque de commentaire pour la tête que j’ai vide à cette heure ci … tu dois faire des erreurs de conception non ?
par exemple :

  • Pourquoi la classe EditeurBouton construit un bête JButon ni plus ni moins ?
  • À quel moment fais tu un rapport entre ce JButon et la classe EditeurBouton (autre que dans le constructeur) ?
  • Pourquoi tu instancies dés l’appel de la classe EditeurBouton un JButon (et oui, il te suffit d’appeler la classe par une de ces méthodes, style unobj.unemethode() pour recréer une instance de JButon qui ne te sert à rien …)
  • Pourquoi en plus elle implémente la méthode d’écoute d’événement sur le bouton dans son propre constructeur, du jamais vu ça … c’est un peu comme demander à un bébé de connaitre le sens de l’histoire et la date de la fin du monde …
  • Il faut qu’une de tes deux classes implémente ActionListener, c’est impératif, le problème est de savoir si l’une d’elle l’implémente déjà par héritage de la classe qu’elle étend, ou pas .(à vérifier dans l’api)… j’ai pas l’impression que ça compilerait si c’était le cas, donc amha, il faudrait implémenter void actionPerformed dans la classe MonModel et faire, juste aprés l’appel du constructeur EditeurBouton, un :
    bouton.addActionListener(this); this étant l’instance en cours de MonModel … ça peutêtre une solution, et tu reportes le code de l’événement dans MonModel (dans void actionPerformed …).

à vue de nez, parce que là, va falloir faire du débugage quand même …
ps: sois pas si avare en commentaires, on est pas des devins …

Quand tu auras creusé ça, je rechercherai mes vieux codes qui manie la JTable en t’affichant une femme à poil sur un click gauche et deux sur un click droit, dac ? :smiley: :smiley:

[quote=“usinagaz”]bonsoir,
c’est plutôt bien écrit, mais ça manque de commentaire pour la tête que j’ai vide à cette heure ci … tu dois faire des erreurs de conception non ?
par exemple :

  • Pourquoi la classe EditeurBouton construit un bête JButon ni plus ni moins ?
  • À quel moment fais tu un rapport entre ce JButon et la classe EditeurBouton (autre que dans le constructeur) ?
  • Pourquoi tu instancies dés l’appel de la classe EditeurBouton un JButon (et oui, il te suffit d’appeler la classe par une de ces méthodes, style unobj.unemethode() pour recréer une instance de JButon qui ne te sert à rien …)
  • Pourquoi en plus elle implémente la méthode d’écoute d’événement sur le bouton dans son propre constructeur, du jamais vu ça … c’est un peu comme demander à un bébé de connaitre le sens de l’histoire et la date de la fin du monde …
  • Il faut qu’une de tes deux classes implémente ActionListener, c’est impératif, le problème est de savoir si l’une d’elle l’implémente déjà par héritage de la classe qu’elle étend, ou pas .(à vérifier dans l’api)… j’ai pas l’impression que ça compilerait si c’était le cas, donc amha, il faudrait implémenter void actionPerformed dans la classe MonModel et faire, juste aprés l’appel du constructeur EditeurBouton, un :
    bouton.addActionListener(this); this étant l’instance en cours de MonModel … ça peutêtre une solution, et tu reportes le code de l’événement dans MonModel (dans void actionPerformed …).

à vue de nez, parce que là, va falloir faire du débugage quand même …
ps: sois pas si avare en commentaires, on est pas des devins …[/quote]
Je me suis inspiré d’un cours sur le net pour faire le code

bonjour
Ah okay … malheureusement je peux pas t’aider sans me replonger là dedans et je n’ai pas la possibilité en ce moment, donc à vue de nez, je dis des bêtises …
Ton code compile, j’ai essayé de le modifier, mais je vois pas ce qui cloche.
Ce que je te conseille, si le source fonctionne, c’est de recoller aux sources, et de modifier petit à petit, par étapes.
Tu ne dois pas avoir grand chose à modifier, c’est juste le traitement sur le click non ?
Par la même occasion, précises ce que tu veux faire exactement quand on click sur un bouton.

[quote=“usinagaz”]bonjour
Ah okay … malheureusement je peux pas t’aider sans me replonger là dedans et je n’ai pas la possibilité en ce moment, donc à vue de nez, je dis des bêtises …
Ton code compile, j’ai essayé de le modifier, mais je vois pas ce qui cloche.
Ce que je te conseille, si le source fonctionne, c’est de recoller aux sources, et de modifier petit à petit, par étapes.
Tu ne dois pas avoir grand chose à modifier, c’est juste le traitement sur le click non ?
Par la même occasion, précises ce que tu veux faire exactement quand on click sur un bouton.[/quote]
Lorsque je clique sur une case, si elle est vide, j’ai une boite de dialogue qui me demande ce que je veux écrire.
Si la case n’est pas vide, la boite de dialogue donne la possibilité d’éditer ou de supprimer la case

bonsoir,
Tiens j’ai repris le code de base, et je l’ai modifié pour aller dans ton sens. Ceci dit, il n’y a aucune mise en forme, aucun commentaire, je me suis contenté de faire un truc compilable sur lequel tu pourras te baser (en changeant les noms et le traitement du ActionPerformed).
Attention ça fonctionne bizarrement ton truc, de sorte qu’en clickant sur une cellule, ça inscrit le contenu du buffer dans la cellule, avant d’ouvrir la boite de dialog, à voir (sinon ça jette le classe EditeurCouleur du cours, bien le Chooser :wink::

import javax.swing.*; import javax.swing.table.TableColumn; import java.awt.*; public class test { JTable jTable1; Object[][] donnees; String[] titreColonnes; public test () { this.donnees = new Object [][]{ {"8:00", "", "", "", "", "", "", ""}, {"9:00", "", "", "", "", "", "", ""}, {"10:00", "", "", "", "", "", "", ""}, {"11:00", "", "", "", "", "", "", ""}, {"12:00", "", "", "", "", "", "", ""}, {"13:00", "", "", "", "", "", "", ""}, {"14:00", "", "", "", "", "", "", ""}, {"15:00", "", "", "", "", "", "", ""}, {"16:00", "", "", "", "", "", "", ""}, {"17:00", "", "", "", "", "", "", ""}, {"18:00", "", "", "", "", "", "", ""}, {"19:00", "", "", "", "", "", "", ""}, {"20:00", "", "", "", "", "", "", ""}, {"21:00", "", "", "", "", "", "", ""}, }; this.titreColonnes = new String[] {"", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"}; this.jTable1 = new JTable(donnees, titreColonnes); MonModele mm = new MonModele(donnees, titreColonnes); JTable jTable2 = new JTable(mm); TableColumn cC = jTable1.getColumnModel().getColumn(3); cC.setCellEditor(new EditeurCouleur()); jTable1.setPreferredScrollableViewportSize(new Dimension(500, 70)); JScrollPane scrollPane = new JScrollPane(jTable1); JFrame frame = new JFrame(); frame.add(scrollPane); frame.setTitle("Test"); frame.setSize(200,200); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String [] args){ new test(); } }

[code]import javax.swing.table.AbstractTableModel;
public class MonModele extends AbstractTableModel {

Object donnees[][];
String titres[];
public MonModele(Object donnees[][], String titres[]) {
this.donnees = donnees;
this.titres = titres;
}
public int getColumnCount() {
return donnees[0].length;
}
public Object getValueAt(int parm1, int parm2) {
return donnees[parm1][parm2];
}
public int getRowCount() {
return donnees.length;
}
public String getColumnName(int col){
return titres[col];
}
}[/code]

[code]import javax.swing.;
import java.awt.
;
import java.awt.event.*;
import javax.swing.event.CellEditorListener;
import java.util.EventObject;
import javax.swing.table.TableCellEditor;

public class EditeurCouleur implements TableCellEditor {

JColorChooser jcc = new JColorChooser();
// le bouton qui est le composant affiché pour l’édition de couleur
// il commence par afficher le dialogue choix de couleur
JButton b = new JButton();
// variables auxiliaires
JTable laTable; int i, j;
public EditeurCouleur() {
// méthode répondant au clic sur le bouton
b.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println(“test actionperformed”);
b_actionPerformed(e);
}
});
}
// la méthode qui renvoie le composant éditeur
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected,
int row, int col) {
laTable = table;
i = row; j = col;
if (value == “”) value=null;
System.out.println(“value : " + value);
b.setBackground((Color)value);
return b;
}
// méthode appelée quand le bouton est cliqué
void b_actionPerformed(ActionEvent e) {
System.out.println(“test actionperformed 22222222222”);
if (b.getText().length() == 0)
{
String reponse;
String message = “Entrez un mot ?”;
reponse = JOptionPane.showInputDialog(this, message);
b.setText(reponse);
}
else
{
String[] choix = {“modifier”, “supprimer”, “annuler”};
int reponse = JOptionPane.showOptionDialog(null,
“Que voulez-vous faire”,
”",
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
choix,
choix[2]);
if (reponse == JOptionPane.YES_OPTION)
{
String rep;
String mes = “Entrez un mot ?”;
rep = JOptionPane.showInputDialog(this, mes);
b.setText(rep);
}
else if (reponse == JOptionPane.NO_OPTION)
{
b.setText("");
}
else;
}
/* Color c = jcc.showDialog(b, “choix de couleur”,
b.getBackground() );
laTable.getModel().setValueAt(c, i, j);
b.setBackground©;
*/
}
public Object getCellEditorValue() {
return null ;
}
public boolean isCellEditable(EventObject anEvent) {
return true;
}
public boolean shouldSelectCell(EventObject anEvent) {
return true;
}
public boolean stopCellEditing() {
return true ; // pour ne pas pouvoir recommencer une édition
//return false ; // pour pouvoir recommencer une édition
}
public void cancelCellEditing() {
}
public void addCellEditorListener(CellEditorListener l) {
}
public void removeCellEditorListener(CellEditorListener l) {
}
}[/code]

[quote=“usinagaz”]bonsoir,
Tiens j’ai repris le code de base, et je l’ai modifié pour aller dans ton sens. Ceci dit, il n’y a aucune mise en forme, aucun commentaire, je me suis contenté de faire un truc compilable sur lequel tu pourras te baser (en changeant les noms et le traitement du ActionPerformed).
Attention ça fonctionne bizarrement ton truc, de sorte qu’en clickant sur une cellule, ça inscrit le contenu du buffer dans la cellule, avant d’ouvrir la boite de dialog, à voir (sinon ça jette le classe EditeurCouleur du cours, bien le Chooser :wink::
[/quote]
Merci. Je testerai demain.
Je voudrai sauvegarder tout ce qui aura été écrit dans les cases de la JTable.
Est-ce que tu pourrais m’indiquer comment on fait cela?

Merci

Oui c’est trés simple, tu écris l’objet “model de ta table” dans un fichier de données. Tu dois donc rechercher deux fonctions java qui te permettent:

  • d’écrire l’objet dans un fichier, je dis bien l’objet, et non l’objet.toString() dans un fichier texte. (donc l’objet sérialisé, normalement la classe TableModel ou un truc du genre implemente Serializable, sinon faut te le rajouter ).
  • de recupérer l’objet en lisant le fichier, ça donne un truc du style :
    TableModel tm = (TableModel) lire(fichier) ou lire(fichier) si lire renvoie un TableModel et non un simple objet …
    taTable.setTableModel™;

Un truc du genre, je n’ai pas les noms des classes et des méthodes exacte en tête.

merci

Tout est possible, mais je n’ai pas la solution et ça devient plus pointu.
Mais, tu peux tenté de faire ce genre de chose :
Un click sur la colonne récupère la colonne, et contruit un model de table à une colonne, la colonne choisie.
Il faut quand même garder l’autre model, l’original, vivant, ou l’enregistrer dans un fichier. Donc tu peux construire une nouvelle JTable avec ce model à une colonne, rendre l’autre table invisible ou pas, afficher la nouvelle table. Mais tu te compliques parce que modifier la table à une colonne, et répercuté les modifs dans l’ancien model, ça sera encore une prise de tête.
Regardes quand même s’il n’y a pas une méthode qui fait déjà ça, un sorte de setVisible(false) mais que pour certaines cellules, ou lignes, ou colonnes … ça serait beaucoup plus efficace.

[quote=“usinagaz”]Tout est possible, mais je n’ai pas la solution et ça devient plus pointu.
Mais, tu peux tenté de faire ce genre de chose :
Un click sur la colonne récupère la colonne, et contruit un model de table à une colonne, la colonne choisie.
Il faut quand même garder l’autre model, l’original, vivant, ou l’enregistrer dans un fichier. Donc tu peux construire une nouvelle JTable avec ce model à une colonne, rendre l’autre table invisible ou pas, afficher la nouvelle table. Mais tu te compliques parce que modifier la table à une colonne, et répercuté les modifs dans l’ancien model, ça sera encore une prise de tête.
Regardes quand même s’il n’y a pas une méthode qui fait déjà ça, un sorte de setVisible(false) mais que pour certaines cellules, ou lignes, ou colonnes … ça serait beaucoup plus efficace.[/quote]
Merci.
Concernant l’edition des cases, ça fonctionne maitenant chez moi.
Il reste un souci.
Lorsque j’écris dans une case, si je clique sur une autre case de cette même colonne, ce que j’ai écris vient se mettre à l’endroit du clic.
Je ne peux écrire que dans une seule case pour chaque colonne, ce qui est problématique.
Est-ce que tu saurais comment faire pour que je puisse écrire dans toutes les cases de chaque colonne et non dans une seule.

Remplace ta fonction par celle-ci, mais il te restera à trouver comment actualiser l’affichage des nouvelles valeurs sans avoir besoin de clicker sur une nouvelle case (et j’ai pas tester tous les cas possible que tu voulais traiter avec les if b.getText(), donc à voir ) :

[code]void b_actionPerformed(ActionEvent e) {

String reponse = "";
String message = "Entrez un mot ?";
int int_reponse;
if (b.getText().length() == 0) {
  reponse = JOptionPane.showInputDialog(null, message);
} else  {
  String[] choix = {"modifier", "supprimer", "annuler"};
  int_reponse = JOptionPane.showOptionDialog(null,
                    "Que voulez-vous faire",
                    "",
                    JOptionPane.YES_NO_CANCEL_OPTION,
                    JOptionPane.QUESTION_MESSAGE,
                    null,
                    choix,
                    choix[2]);
  if (int_reponse == JOptionPane.YES_OPTION)  {
     reponse = JOptionPane.showInputDialog(null, message);
  }
}
laTable.getModel().setValueAt(reponse, i, j);

}[/code]
Donc là, tu clickes sur une case de mercredi :
ouvre une boite, entre un texte
faire entrer (c’est là qu’il faut actualiser, je crois me souvenir qu’il y a du setviewport la dessous …)
clicke une autre case de mercredi
la valeur s’affiche dans la cellule précédente …

ce qui complique tout, c’est que tu passes par des JButton alors que ça n’est pas nécessaire je pense … un click sur la cellule peut trés bien lancé un test du contenu, avec boite de dialogue ou d’input, et modifier la valeur de la cellule par:
int r = table.getSelectedRow();
int c = table.getSelectedColumn();
if (ce que tu veux) table.getModel().setValueAt(value, r, c);
puis réaffecter le nouveau model à la table pour que ça s’affiche direct.
Ou l’inverse, car je crois qu’il y a une méthode pour changer le contenu d’une cellule sans changer le model de la table immédiatement …

De toute façon, à partir du moment où un ActionListener est ajouter à la table, un click n’importe où dans la table renvoie au code d’actionPerformed, à toi à gérer dans ce bloc :
x de la cellule sélectionnée
y de la cellule sélectionnée
valeur de la cellule suivant réponse utilisateur …
en fait , pas besoin de JButton ni de la classe EditeurBouton je crois.