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 :

Problème de sélection de ligne après suppression


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut Problème de sélection de ligne après suppression
    Bonjour,

    je rencontre un petit soucis avec une JTable (aaahhh, quelle source d'ennui ces JTable ^^').
    Voici la situation :
    Ma JTable contient 3 colones. La 1ère est un bouton et les 2 autres sont du texte.
    Pour afficher un bouton dans la 1ère colone j'ai créé une classe ButtonEditors qui extends AbstractCellEditor et une classe ButtonRenderers qui extends DefaultTableCellRenderer.
    Jusque là tout se passe bien.

    Quand on clique sur le bouton, je veux que ça supprime la ligne en question.
    Pour cela j'ai passé la référence de la table à mon ButtonEditors, je choppe le model de la table et je fais un remove sur l'indice correspondant (*).

    Quand on le fait une fois, ça marche, mais à la 2ème ça ne fonctionne plus.
    La méthode table.getSelectedRow() renvoie -1, car le clique sur le bouton ne sélectionne pas la ligne.

    Pour remédier à ce problème j'ai ajouté la ligne suivante, juste après la suppression : table.getSelectionModel().setSelectionInterval(row, row);

    Du coup après avoir supprimé la ligne sélectionnée, ça resélectionne la même ligne. Ok, d'ailleurs si je clique sur le bouton Supprimer de la lignes sélectionnée, ça supprime bien. Mais si je clique sur le bouton d'une autre ligne, ça sélectionne cette nouvelle ligne, sans supprimer. Je suis obligé de cliquer 2x :-\

    Et c'est là que ça coince, je ne trouve pas comment contourner ce problème.
    Pouvez-vous m'aider à passer outre ce comportement, svp ?

    Merci d'avance

    Pumbaa

    P.S. Si vous avez des conseils autres qu'une réponse directe (comme par exemple changer l'architecture de mon programme au niveau de (*), je suis preneur aussi ;-))

    Voici mon code

    ButtonEditors
    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
     
     
    import java.awt.Component;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.AbstractCellEditor;
    import javax.swing.JButton;
    import javax.swing.JTable;
    import javax.swing.table.TableCellEditor;
     
     
    public class ButtonEditors extends AbstractCellEditor implements TableCellEditor, ActionListener
    {
    	public ButtonEditors(JTable table)
    	{
    		this.button = new JButton();
    		this.button.addActionListener(this);
    		this.table = table;
    		super.cancelCellEditing();
    	}
     
    	/**
             * Handles events from the editor button and from
             * the dialog's OK button.
             */
    	public void actionPerformed(ActionEvent e) // TODO ne marche pas très bien quand on supprime plusieurs questions de suite.
    	{
    		QuestionModels model = (QuestionModels)this.table.getModel();
    		int row = this.table.getSelectedRow();
    		if(row == -1)
    			return;
    		model.removeRow(row);
     
    		this.table.getSelectionModel().setAnchorSelectionIndex(row);
    		this.table.getSelectionModel().setLeadSelectionIndex(row);
    		this.table.getSelectionModel().setSelectionInterval(row, row);
    	}
     
    	public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
    	{
    		return this.button;
    	}
     
    	@Override public Object getCellEditorValue()
    	{
    		return "";
    	}
     
    	private JButton button;
    	private JTable table;
    	private static final long serialVersionUID = 2738468144252049166L;
    }
    ButtonRenderers
    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
     
     
    import java.awt.Component;
     
    import javax.swing.JButton;
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableCellRenderer;
    import javax.swing.table.TableCellRenderer;
     
     
    public class ButtonRenderers extends DefaultTableCellRenderer implements TableCellRenderer
    {
    	public ButtonRenderers()
    	{
    		this.button = new JButton();
    	}
     
    	@Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    	{
    		super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    		return this.button;
    	}
     
    	private JButton button;
    	private static final long serialVersionUID = -4745357073221895808L;
    }
    Main
    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
     
     
    import java.awt.BorderLayout;
    import java.awt.Container;
     
    import javax.swing.JFrame;
    import javax.swing.JTable;
     
    public class Main extends JFrame
    {
    	public Main()
    	{
    		QuestionModels model = new QuestionModels();
    		for(int i = 0; i < 10; i++)
    			model.addRow(new Questions("question "+i, "réponse "+i));
    		JTable table = new JTable(model);
     
    		table.getColumnModel().getColumn(0).setCellRenderer(new ButtonRenderers());
    		table.getColumnModel().getColumn(0).setCellEditor(new ButtonEditors(table));
     
    		Container panel = super.getContentPane();
    		panel.setLayout(new BorderLayout());
    		panel.add(table, BorderLayout.CENTER);
     
    		super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		super.setVisible(true);
    		super.pack();
    	}
     
    	public static void main(String[] args)
    	{
    		new Main();
    	}
     
    }
    QuestionModels
    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
     
     
    import java.util.ArrayList;
     
    import javax.swing.JButton;
    import javax.swing.table.AbstractTableModel;
     
    public class QuestionModels extends AbstractTableModel
    {
    	/* ------------------------------------------------------------ *\
    	|* 		  				Constructeur							*|
    	\* ------------------------------------------------------------ */
    	public QuestionModels()
    	{
    		this.listQuestions = new ArrayList<Questions>(10);
    	}
     
    	/* ------------------------------------------------------------ *\
    	|* 		  				Méthodes publiques						*|
    	\* ------------------------------------------------------------ */
    	public void addRow(Questions question)
    	{
    		this.insertRow(this.listQuestions.size(), question);
    	}
     
    	public void insertRow(int row, Questions question)
    	{
    		this.listQuestions.add(row, question);
    		super.fireTableRowsInserted(row, row);
    	}
     
    	public void removeRow(int index)
    	{
    		this.listQuestions.remove(index);
    		super.fireTableRowsDeleted(index, index);
    	}
     
    	public void removeRow(Questions question)
    	{
    		int index = this.listQuestions.indexOf(question);
    		if(index < 0)
    			return;
    		this.removeRow(index);
    		super.fireTableRowsDeleted(index, index);
    	}
     
    	public void clear()
    	{
    		int nbLines = this.listQuestions.size();
    		this.listQuestions.clear();
    		super.fireTableRowsDeleted(0, nbLines);
    	}
     
    	/* ----------------------------- *\
    	|* 				Get 			 *|
    	\* ----------------------------- */
    	@Override public int getColumnCount()
    	{
    		return columnNames.length;
    	}
     
    	@Override public int getRowCount()
    	{
    		return this.listQuestions.size();
    	}
     
    	@Override public String getColumnName(int column)
    	{
    		return columnNames[column];
    	}
     
    	@Override public Class<?> getColumnClass(int column)
    	{
    		switch(column)
    		{
    			case 0 : return JButton.class;
    			default : return String.class;
    		}
    	}
     
    	@Override public Object getValueAt(int row, int column)
    	{
    		Questions question = this.listQuestions.get(row);
    		switch(column)
    		{
    			case 0:
    				return row+1;
    			case 1:
    				return question.getQuestion();
    			case 2:
    				return question.getAnswer();
    			default:
    				return null;
    		}
    	}
     
    	@Override public boolean isCellEditable(int row, int colum)
    	{
    		return true;
    	}
     
    	/* ------------------------------------------------------------ *\
    	|* 		  				Attributs privés						*|
    	\* ------------------------------------------------------------ */
    	private ArrayList<Questions> listQuestions;
     
    	/* ------------------------------------- *\
    	|* 				Statiques	 			 *|
    	\* ------------------------------------- */
    	private static final String[] columnNames = { "#", "Question", "Réponse" };
    	private static final long serialVersionUID = 5906888538680435549L;
    }
    Questions
    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
     
     
    import java.util.ArrayList;
     
     
    public class Questions
    {
    	public Questions(String question, String answer)
    	{
    		this.question = question;
    		this.answer = answer;
    	}
     
    	public Questions(Questions questionnaire)
    	{
    		this(questionnaire.getQuestion(), questionnaire.getAnswer());
    	}
     
    	public String getQuestion()
    	{
    		return this.question;
    	}
     
    	public void setQuestion(String question)
    	{
    		this.question = question;
    	}
     
    	public String getAnswer()
    	{
    		return this.answer;
    	}
     
    	public void setAnswer(String answer)
    	{
    		this.answer = answer;
    	}
     
    	@Override public String toString()
    	{
    		return QUESTION_DELIMITER+this.question+ANSWER_DELIMITER+this.answer;
    	}
     
    	@Override public boolean equals(Object questionnaire)
    	{
    		if(questionnaire == null)
    			return false;
    		if(questionnaire instanceof Questions)
    		{
    			Questions q = (Questions)questionnaire;
    			return this.question.equals(q.getQuestion()) && this.answer.equals(q.getAnswer());
    		}
    		return false;
    	}
     
    	/**
             * Check if 'this' is contained in an array of Question
             * @param questions The array
             * @return
             */
    	public boolean isContained(ArrayList<Questions> questions)
    	{
    		for(Questions question:questions)
    			if(question.equals(this))
    				return true;
    		return false;
    	}
     
    	private String question;
    	private String answer;
     
    	public static final String TEXT_QUESTION = "Entrez la question";
    	public static final String TEXT_ANSWER = "Entrez la réponse associée";
    	public static final String QUESTION_DELIMITER = "|Q|";
    	public static final String QUESTION_DELIMITER_REGEX = Questions.QUESTION_DELIMITER.replaceAll("\\|", "\\\\|");
    	public static final String ANSWER_DELIMITER = "|R|";
    	public static final String ANSWER_DELIMITER_REGEX = Questions.ANSWER_DELIMITER.replaceAll("\\|", "\\\\|");
    }
    Fichiers attachés Fichiers attachés

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut
    Et bien, je n'ai pas beaucoup de succès avec ma question ^^'
    Je vais tenter de donner 2 petites précisions, basées sur mes analyses :

    On dirait qu'une sélection de ligne par un setSelectionInterval(int, int) fais quelque chose de moins (ou de plus ?) qu'un véritable clique, qu'est-ce que ça pourrait être ?
    En fait je ne vois même pas comment savoir ça.

    Pour reproduire le bug :
    Lancez le programme
    Cliquez sur le 1er bouton --> ça supprime la ligne --> ça sélectionne la nouvelle 1ère ligne ==> OK
    Cliquez à nouveau sur le 1er bouton --> ça supprime la ligne --> ça sélectionne la nouvelle 1ère ligne ==> OK
    Cliquez sur le 2ème bouton --> ça sélectionne la ligne et c'est tout ==> KO
    Cliquez sur le 2ème bouton --> ça supprime ==> OK
    Cliquez sur le 3ème bouton --> ça sélectionne la ligne et c'est tout ==> KO
    Cliquez sur le 4ème bouton --> ça supprime O_o ==> OK

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut
    OMG, j'ai enfin trouvé !
    Il fallait ajouter la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.table.editingCanceled(new ChangeEvent(e));
    dans le actionPerformed

    Apparemment un clique sur le bouton lançait l'édition de la cellule, donc il fallait faire un clique pour sortir du mode d'édition.

    Je passe en résolu.

    Je post juste le bout de code qui a changé :

    ButtonEditor.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	public void actionPerformed(ActionEvent e)
    	{
    		QuestionModel model = (QuestionModel)this.table.getModel();
    		int row = this.table.getSelectedRow();
    		if(row == -1)
    			return;
    		model.removeRow(row);
    		this.table.editingCanceled(new ChangeEvent(e));
    	}

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

Discussions similaires

  1. [AC-2013] Problème de sélection de ligne dans une combobox
    Par appadawan dans le forum VBA Access
    Réponses: 1
    Dernier message: 03/07/2015, 15h39
  2. Sélection de lignes après FILTRE
    Par ptitbow dans le forum Excel
    Réponses: 3
    Dernier message: 24/02/2015, 14h40
  3. problème accès en mode open après suppression des tablespaces
    Par djo_jojo dans le forum Administration
    Réponses: 1
    Dernier message: 02/04/2010, 09h19
  4. [DOM] Problème de suppression sauts de lignes après modification XML
    Par chabada dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 15/06/2005, 13h46
  5. [JTable] problème après suppression d'une ligne
    Par fredo3500 dans le forum Composants
    Réponses: 7
    Dernier message: 17/03/2005, 10h01

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