Pb d'evt de clic de souris:execute 4 fois l'evt au lieu d'une

kobee12 Messages postés 153 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 31 octobre 2006 - 25 mars 2004 à 17:51
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 - 29 mars 2004 à 19:37
Salut

j'ai cree un evt de clic de souris sur une table qui est static
Quand j'execute cet evenement, il passe deux fois dedans.
Le pb c'est que j'ai cree un test pour voir s'il s'agit d'un double clic et dans ce cas il ouvre un dialog. Quand je double clique il entre 4 fois dans ma methode, si bien qu'il m'ouvre deux fois mon dialog!!

Voici ma fonction :

public void jTableSem_mouseClicked(MouseEvent e) {
String textCell = "";
System.out.println("tbSem:"+ligneSelect+ " "+colonneSelect);

if(e.getClickCount()==2 && ligneSelect!=-1 && colonneSelect!=-1)
{
textCell = jTableSem.getValueAt(ligneSelect,colonneSelect).toString();

RDVFrame rdvFrame = new RDVFrame(pere);
rdvFrame.jLabelTitre.setText("Ajouter un rendez-vous");
Dimension frmRdvSize = rdvFrame.getPreferredSize();
Dimension frmSize = pere.getSize();
Point loc = pere.getLocation();
rdvFrame.setLocation((frmSize.width - frmRdvSize.width) / 2 + loc.x, (frmSize.height - frmRdvSize.height) / 2 + loc.y);
rdvFrame.setModal(true);
rdvFrame.show();
}
}

voici la declaration de ma table :
public static JTable jTableSem = new JTable();

J'espere que kelkun pourra m'aider
Merci d'avance.
kobee12
:big)

9 réponses

cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 11
25 mars 2004 à 18:18
GodConan :clown)

verifie ke ta pas abonner plusieur foi la meme class au listener de la table...

ensuite si tu veu etre sur que ta boite de dialogue ne soit instancier qu une foi : tu garde une reference dessu et tu test si != null ben tu fai rien ;o) comme sa t en aura qu une ;o)

++
0
cs_tds Messages postés 351 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 9 décembre 2004
26 mars 2004 à 07:48
ELLE A L'AIR CORRECTE ALORS,
BIZARRE CETTE METHODE DOIT ETRE LANCEE DEUX FOIS...
(AS GODCONAN)

B@ron {EU.BELGIUM}
0
kobee12 Messages postés 153 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 31 octobre 2006 1
26 mars 2004 à 15:52
Je vois tjrs pas ou ca cloche.
Je vais mettre tout le code de ma classe. C'est un peu long mais si kelkun peu m'expliquer pourquoi ca marche pas ca servira a kelke chose.

Apparemment, j'ai remarque que ca viendrait du fait que ma table est static, car quand j'enleve static il execute bien la methode qu'une seule fois.

J'ai rajoute un boolean pour eviter qu'il fasse deux fois la methode.
J'ai mis en gras la declaration de ma table, la methode de la souris et sa declaration.

package Semainier;

import agendaoffice.*;
import calendrier.*;
import Semainier.*;
import database.*;
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.sql.*;

public class TableSemainier extends JFrame{

MainFrame pere;
Calendrier calend; public static JTable jTableSem <gras>new JTable(); DefaultTableModel df</gras> new DefaultTableModel(){
public boolean isCellEditable( int row, int col ){
return false; } };
public static int ligneSelect = -1;
public static int colonneSelect = -1;
Object[][] donnees = null;
public InfosJournee infos;

Color foreColor = new Color( 0, 0, 50 );
Hashtable couleur = new Hashtable( 10 );
// Couleur par defaut du font des en-têtes
Color defoBack = new Color( 194, 194, 194);

public TableSemainier(MainFrame pere, Calendrier calend) {

this.pere = pere;
this.calend = calend;
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}

/**Initialiser le composant*/
private void jbInit() throws Exception {
// Couleur par defaut de fond de la table
jTableSem.setSelectionBackground(new java.awt.Color(204,204,255)); // bleu clair
// Couleur par defaut dd devant de la table
jTableSem.setSelectionForeground(java.awt.Color.black);
// Couleur de la grille de la table
jTableSem.setGridColor(new java.awt.Color(153,153,153)); //gris
pere.jScrollPane1.getViewport().add(jTableSem);
jTableSem.setBounds(0,0,400,400);
jTableSem.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(MouseEvent e) {
jTableSem_mouseClicked(e);
}
});

infos = new InfosJournee(calend, df, jTableSem);//, colDate);
creerTable();
for(int numJour=0; numJour<7;numJour++)
{
donnees = infos.getInfoBD(numJour);
for(int i=0;icouleur par defaut
lbl.setBackground( (back==null)?defoBack:back );
//Couleur du texte des en-têtes
lbl.setForeground( foreColor );
Font font = table.getFont();
lbl.setOpaque( true );
font = new Font( font.getName(), Font.BOLD, font.getSize() );
lbl.setFont( font );
lbl.setBorder(UIManager.getBorder("TableHeader.cellBorder"));
lbl.setText( (String)value );
return lbl;
}
};
label.setHorizontalAlignment(JLabel.CENTER);
return label;
}

// dessine une colonne comme un header
class DemoCellRenderer extends JLabel
implements TableCellRenderer
{
boolean isBordered = true;
Color selectedForeground = null;
Color selectedBackground = null;
Color unselectedForegroundAlt = new Color( 255, 255, 255 );
Color unselectedBackgroundAlt = new Color( 100, 100, 200 );
Color unselectedForeground = null;
Color unselectedBackground = null;

public DemoCellRenderer()
{
super();
setOpaque(true); //pour ke le background soi fai( mai bon sa ser a rien ;o) ).
}

public Component getTableCellRendererComponent(
JTable table, Object val,
boolean isSelected, boolean hasFocus,
int row, int column)
{
setAlignmentX( CENTER_ALIGNMENT );

// s'assure du style de la font
Font f = getFont();

ligneSelect = table.getSelectedRow();
colonneSelect = table.getSelectedColumn();

setFont( new Font( f.getName(), Font.PLAIN, f.getSize() ) );

super.setForeground( ( unselectedForeground != null) ? unselectedForeground : table.getForeground() );
super.setBackground( ( unselectedBackground != null) ? unselectedBackground : table.getBackground() );
super.setBorder(BorderFactory.createEmptyBorder());

// On met dans une autre font la cellule selectionnee
if( isSelected && column==table.getSelectedColumn() )
{
setFont( new Font( f.getName(), Font.PLAIN|Font.BOLD|Font.ITALIC, f.getSize() ) );
// gestion des couleur de selection
super.setForeground( ( selectedForeground != null) ? selectedForeground : table.getSelectionForeground() );
super.setBackground( new java.awt.Color(100,190,240) ); // bleu-vert
super.setBorder(BorderFactory.createLineBorder(new java.awt.Color(200,50,50)));
}
setText( val.toString() );
return this;
}
}

static boolean dblclic=false; // Sinon pb --> ouvre 2 fois la fenetre : bug non resolu
public void jTableSem_mouseClicked(MouseEvent e) {
String textCell = "";

if(e.getClickCount()==2 && ligneSelect!=-1 && colonneSelect!=-1 && dblclic==false)
{
dblclic=true;
textCell = jTableSem.getValueAt(ligneSelect,colonneSelect).toString();

RDVFrame rdvFrame = new RDVFrame(pere);
rdvFrame.jLabelTitre.setText("Ajouter un rendez-vous");
Dimension frmRdvSize = rdvFrame.getPreferredSize();
Dimension frmSize = pere.getSize();
Point loc = pere.getLocation();
rdvFrame.setLocation((frmSize.width - frmRdvSize.width) / 2 + loc.x, (frmSize.height - frmRdvSize.height) / 2 + loc.y);
rdvFrame.setModal(true);
rdvFrame.show();
}
else dblclic =false;
}
}

Voila @ +
kobee12
:big)
0
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 11
26 mars 2004 à 17:28
GodConan :clown)

et dailleur pourquoi est elle static ta table?!!!!

avec une table staic dc si tu a plusieur instance de ta class TableSemainier c normale car a chac foi tu abonne un nouveau listener sur la MEME table .... et dc plus tu crera de new TableSemainier plus tora de clic ;o) ....

++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kobee12 Messages postés 153 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 31 octobre 2006 1
27 mars 2004 à 13:42
Je l'ai mis en static parce que j'utilise cette classe dans une autre classe, et quand je ne met pas static il ne m'execute rien. En effet je fais un test pour voir si ma variable textCell correpond a une chaine vide, et bizarrement testCell est tout le tps vide alors que ce n'est pas le cas.
En mettant static pour ma table il voit bien que textCell n'est pas vide. D'ailleurs, j'avais le meme pb avec ligneSelect et colonneSelect que j'ai mis en static. C'est peut etre pas bien de faire ca mais je sais comment il faut que je fasse.

Je met en dessous la declaration de ma classe TableSemainier et de la fonction qui utilise ces variables
dans ma classe MainFrame :

semainier = new TableSemainier(this,calend.cal);

void jMenuAjoutRDV_actionPerformed(ActionEvent e) {
String textCell = "";
if (semainier.ligneSelect!=-1 && semainier.colonneSelect!=-1){
textCell = semainier.jTableSem.getValueAt(semainier.ligneSelect,semainier.colonneSelect).toString();
}
if(textCell.compareTo("")! =0)
{
RDVFrame rdvFrame = new RDVFrame(this);
rdvFrame.jLabelTitre.setText("Ajouter un rendez-vous");
Dimension frmRdvSize = rdvFrame.getPreferredSize();
Dimension frmSize = this.getSize();
Point loc = this.getLocation();
rdvFrame.setLocation((frmSize.width - frmRdvSize.width) / 2 + loc.x, (frmSize.height - frmRdvSize.height) / 2 + loc.y);
rdvFrame.setModal(true);
rdvFrame.show();
}

@ + kobee12
:big)
0
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 11
27 mars 2004 à 14:10
GodConan :clown)

c pas mal fouilli tous sa ;o); regarde les quelque exemple de JTable du site :) et compare avec le tien
ds mes sources je croi je montre quelque exemple qui peuvent t aider ...

les var Static ont une utilité bien particuliere et tu n en fai pas une bonne utilisation la ;o)..

gl

++
0
cs_tds Messages postés 351 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 9 décembre 2004
29 mars 2004 à 07:41
Un peu d'analyse s'il vous plait avant la fin du monde informatique...

SECONDCLASS -------> CLASSUSETABLEFROMOTHERCLASS

garde un lien entre tes deux classes et ajoute une méthode get et set sur la table, tu pourras alors éviter de la mettre en static...

NB: tout objet usé dans un méthode statique doit être static (cas particulier...)

B@ron {EU.BELGIUM}
0
kobee12 Messages postés 153 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 31 octobre 2006 1
29 mars 2004 à 19:30
ca y est ca marche!!
j'ai enleve les satics qui n'etait evidemment pas une bonne idee. Par contre appremment je devais lancer mon application une premiere fois et je ne la fermais pas. La deuxieme fois c'est la que ca plantouillait. Il devait y avoir en memoire plusieurs instance de la meme classe vu que je ne fermais pas l'application et c'est pour ca qu'il y avait un pb. En tout cas maintenant ca marche.
Merci pour votre aide et desole de vous faire perdre votre temps pour des conneries pareilles.
kobee12
:big)
0
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 11
29 mars 2004 à 19:37
GodConan :clown)

c rien ;o) sa arrive a tous ;o)

g galerer tou l apremidi sur un test poser a l enver ;o) ...
a ce tirer les cheveu ...
0
Rejoignez-nous