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 JTextArea Validation acte 2


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 472
    Par défaut JTable JTextArea Validation acte 2
    Comme indiqué lors d'une précédente discussion, l'appui sur Shift Entrée permet de valider une modification de données via un JTextArea.
    Cependant je dispose d'un menu enregistrer et si l'utilisateur a oublié de valider, la donnée sauvegardée est l'ancienne. existe-t-il une méthode à invoquer pour imposer la validation de la cellule en cours de modification. Un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public void enregistrer
    {
          if (table en cours de modification)
          {
                cellule = table.getCelluleEncoursDeModification;
                validerModification;
           }
    .../...
    }
    .

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 472
    Par défaut La solution
    Encore une fois j'ai réussi à résoudre mon problème par moi-même. Pourtant j'ai travaillé dessus pendant 24 heures avant de poster ma question.

    Donc toutes mes colonnes n'utilisent le même éditeur. Trois d'entre elles admettent du texte multiligne. J'ai donc opté pour celles-ci pour un JTextArea comme éditeur. le problème c'est que la touche entrée ne peut plus servir comme touche de validation (contrairement par exemple à un JTextField). C'est la combinaison de touches SHIFT et ENTREE qui permet cela. Malheureusement la plupart des utilisateurs oublient de valider. Tant qu'ils cliquent dans une autre cellule c'est pas grave car cela a le même effet que SHIFT + ENTREE et valide la donnée. Par contre s'ils utilisent autre chose (clic sur un bouton en dehors de la table, sur un menu ...) la validation n'est pas transmise aux données car il manque l'appel à la méthode getCellEditorValue().

    Voici comment j'ai réglé mon problème.
    J'ai une fenêtre avec un tableau et un menu. Ce tableau utilise un éditeur à bas de JTextArea
    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
     
    public class Tableau extends JTable implements ComponentListener
    {
    	private MultiLigneCellEditor editeur;
            .../...
            //le constructeur
    	public Tableau(Modele modele)
    	{
    		super(modele);
    		this.modele = modele;
    .../...                
    		//les éditeurs en fonction de la colonne
    		//colonnes 0, 2, 5, 6, 8 date
    		setDefaultEditor(Date.class, new DateCellEditor());
    		//colonne 1 = demandeur, un éditeur via un JComboBox
    		jcb = new JComboBox(demandeurs.toArray());
    		modeleColonne.getColumn(1).setCellEditor(new DefaultCellEditor(jcb));
    		//colonnes 3, 9, 10 Label multilignes
    		editeur = MultiLigneCellEditor.getInstance(this);
    		modeleColonne.getColumn(3).setCellEditor(editeur);
    		modeleColonne.getColumn(9).setCellEditor(editeur);
    		modeleColonne.getColumn(10).setCellEditor(editeur);
    .../...
    	}
     
    .../...
    	public void hasModificationEnCours() 
    	{
    		if (editeur.isEnCours()) editeur.stopCellEditing();
    	}
    }
    La méthode hasModificationEnCours permet de mettre fin à l'édition.
    Il n'y a qu'une instance de MultiLigneCellEditor
    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
     
    public class MultiLigneCellEditor extends AbstractCellEditor implements TableCellEditor
    {
    	private  boolean enCours = false;
    	private static MultiLigneCellEditor editeur;
    	JTextArea textArea;
    	JTable table;
    	private int hauteurLigne = 0;
    	private int hauteurLigneAutresColonnes = 0;
    	int ligne, colonne;
     
    	private MultiLigneCellEditor(JTable ta) 
    	{
    		super();
    		table = ta;
     
    		textArea = new JTextArea();
    		textArea.setLineWrap(true);
    		textArea.setWrapStyleWord(true);
     
    		textArea.addKeyListener(new KeyAdapter() 
    		{
    			public void keyTyped(KeyEvent e) 
    			{
    				traiterKey();
    			}
    		});
    	}
     
    	public synchronized static MultiLigneCellEditor getInstance(Tableau t)
    	{
            if (editeur == null)
            {
                    editeur = new MultiLigneCellEditor(t) ;
             }
            return editeur ;
    	}
     
    	public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected,
    			int row, int column) 
    	{
    		enCours = true;
    		String texte = ((String)value).replace("<br>", "\n");
    		textArea.setText(texte);
    		hauteurLigne = table.getRowHeight(row);
    		ligne = row;
    		colonne = column;
    		hauteurLigneAutresColonnes = hauteurLigneAutresColonnes();
    		return textArea;
    	}
     
    	private int hauteurLigneAutresColonnes() 
    	{
    		int h = 0;
    		for(int j=0 ; j<table.getColumnCount() ; j++) 
    		{
    			if (j != colonne)
    			{
    				TableCellRenderer cellRenderer = table.getCellRenderer(ligne, j);
    				Object o = table.getValueAt(ligne, j);
    				JLabel label = (JLabel) cellRenderer.getTableCellRendererComponent(table, o, false, false, ligne, j);
    				if (label.getPreferredSize().height > h) h = label.getPreferredSize().height;
    			}
    		}
    		return h;
    	}
     
    	protected void traiterKey() 
    	{
    		int h = (int) textArea.getPreferredSize().getHeight();
     
    		if (h > hauteurLigne ) 
    		{
    			hauteurLigne = h;
    			table.setRowHeight(ligne, hauteurLigne);
    		}
    		else if (h < hauteurLigne) 
    		{
    			hauteurLigne = (h < hauteurLigneAutresColonnes ? hauteurLigneAutresColonnes : h);
    			table.setRowHeight(ligne, hauteurLigne);
    		}
    	}
     
    	public Object getCellEditorValue() 
    	{
    		enCours = false;
    		String texte = textArea.getText().replace("\n","<br>");
    		return texte;
    	}
     
    	public boolean isEnCours() 
    	{
    		return enCours;
    	}
    }
    Une variable booléenne enCours est placée à true lors du démarrage de l'édition par la méthode getTableCellEditorComponent et repasse à false avec la méthode getCellEditorValue qui termine l'édition.
    Dans la fenêtre, par exemple lors de la fermeture via la croix de fermeture on trouve ce code.
    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
     
    public class Fenetre extends JFrame
    {
    .../...
    	private Tableau tableau;
            private Modele modele = new Modele();
     
    	/**
             * constructeur
             */
    	public Fenetre()
    	{
    		//le titre
    		super("Exemple de cellules multilignes");
    		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    		setExtendedState (JFrame.MAXIMIZED_BOTH);
    		addWindowListener(new WindowAdapter()
    		{
    			public void windowClosing(WindowEvent e) 
    			{
    				tableau.hasModificationEnCours();
    				enregistrerDonnees();
    				System.exit(0);
    			}
    		});
    		//le tableau
    		tableau = new Tableau(modele);
    .../...
    	}
    }

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
    ne fonctionnait pas ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 472
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
    ne fonctionnait pas ?
    Tout bêtement je connaissais pas ...
    Je vais tester.
    Merci.

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 472
    Par défaut
    Citation Envoyé par Patrice Henrio Voir le message
    Tout bêtement je connaissais pas ...
    Je vais tester.
    Merci.
    OK ça marche nickel.
    Dans JAVA il y a tout, il suffit de savoir que ça existe.

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

Discussions similaires

  1. JTable TexteArea Validation
    Par Patrice Henrio dans le forum Composants
    Réponses: 1
    Dernier message: 04/03/2014, 00h13
  2. JTextArea : validation automatique sur nouvelle ligne
    Par boboss123 dans le forum Composants
    Réponses: 0
    Dernier message: 25/05/2010, 15h22
  3. JTable repaint validate
    Par grospatapouf dans le forum Composants
    Réponses: 7
    Dernier message: 11/10/2009, 11h39
  4. [JTable] Valider une saisie
    Par dam21 dans le forum Composants
    Réponses: 3
    Dernier message: 25/03/2005, 16h29
  5. [JTable] Validation de saisie
    Par kekesilo dans le forum Composants
    Réponses: 10
    Dernier message: 18/10/2004, 13h21

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