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][RadioButton]Afficher groupe de boutons dans JTable


Sujet :

Composants Java

  1. #1
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 253
    Points
    1 253
    Par défaut [JTable][RadioButton]Afficher groupe de boutons dans JTable
    Bonjour à tous.

    Je suis en train de réaliser une interace de saisie de données dans une base Access.
    Je représente donc mes données actuelle dans une JTable (nom de l'élément, différents attributs ainsi que sa valeur actuelle).

    Sur certains éléments, le choix de la valeur est numérique, l'utilisateur rentre donc directement un chiffre dans la table.
    Pour d'autres, le choix est restreint à trois possibilité : Présent, Incomplet et Validé.

    J'aimerai que dans le cas ou le choix est restreint, s'affiche trois radioButton que l'utilisteeur clique directement dans ma table, plutôt que lui demander une saisie.

    Comment puis-je obtenir ce résultat ?

    Voici le code que j'ai essayé :
    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
    				public Object getValueAt(int row, int col) { 
    					Object columnValue=null;
     
    					switch (col)
    					{...						case 8:
    							if(MySoftTypeInWindow.this.type.equals(Constants.PRACTICE)){
    								columnValue=null;
    							}else{	//This is the documentation type, so value should be -1, 0 or 1
    								JPanel logicalSelection=new JPanel(new FlowLayout());
     
    								ButtonGroup radioButtonGroup = new ButtonGroup();
     
    								JRadioButton absentButton = new JRadioButton(Constants.ABSENT, false);
    								JRadioButton insufficientButton = new JRadioButton(Constants.INSUFFICIENT, false);
    								JRadioButton validatedButton = new JRadioButton(Constants.VALIDATED, false);
     
    								radioButtonGroup.add(absentButton);
    								radioButtonGroup.add(insufficientButton);
    								radioButtonGroup.add(validatedButton);
     
    								logicalSelection.add(absentButton);
    								logicalSelection.add(insufficientButton);
    								logicalSelection.add(validatedButton);
     
    								columnValue=logicalSelection;
    							}
    ...
     
    					return columnValue; 
    }
    				public Class<?> getColumnClass(int col)
    				{
    					switch (col)
    					{
    ...
    						case 8:
    							if(MySoftTypeInWindow.this.type.equals(Constants.DOCUMENTATION))
    								return JPanel.class;
    							else
    								return String.class;
    ...
    }
    [ Sujet déplacé depuis le forum java par Viena ]
    Les Règles du Forum

  2. #2
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 253
    Points
    1 253
    Par défaut
    Hum...

    Je ne sais pas si j'ai été très clair !

    Ce que je veux en fait, c'est tout simpement afficher 3 boutons radio dans une cellule d'une JTable.

    Est-ce possible ?

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    si cela peux t'aider, moi dans une cellule j'avais mis une checkBox et un bouton, pour ca j'avais créer un cellEditor et un cellRenderer pour un classe donnée, mais toi ce n'est pas ce que tu veux apparement c seulement dans un cas... je vais te donner mon exemple cela te donnera peut etre des idée....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        table.setDefaultRenderer(Boolean.class, new MyRenderer());
        table.setDefaultEditor(Boolean.class, new MyCellEditor());
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class MyRendererimplements TableCellRenderer {
      private MyPanel myPanel;
     
      public MyRenderer() {
        myPanel= new MyPanel();
      }
     
      public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,boolean hasFocus, int row, int column) {
        Boolean b = (Boolean)value;
        myPanel.setBoolean(b);
        return myPanel;
      }
    }
    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
    public class MyCellEditor extends AbstractCellEditor implements TableCellEditor {
      private Boolean b;
      private MyPanel    myPanel;
     
      public MyCellEditor() {
        myPanel= new MyPanel();
      }
     
      public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected,
          int row, int column) {
        b = (Boolean) value;
        myPanel.setBoolean(b);
        return myPanel;
      }
     
      public Object getCellEditorValue() {
        return myPanel;
      }
    }
    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
     
    public class MyPanel extends JPanel {
      private Boolean     b;
      private JCheckBox myCheckBox = null;
      private JButton   myButton      = null;
     
      public void setBoolean(Boolean b) {
        this.b = b;
        refreshPanel();
      }
     
      public MyPanel() {
        super();
        initialize();
      }
    .................
    j'esper que cela d'aidera ...

  4. #4
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 253
    Points
    1 253
    Par défaut
    OK, je crois que je commence à comprendre...

    Je vais regarder du côté des CellRenderer et CellEditor.
    Et si je comprends bien, tu mets un JPanel dans ta cellule, alors que dans ce JPanel il y a une JCheckbox et un JButton.

    Si c'est le cas, je n'ai plus qu'à me débrouiller pour mettre 3 JRadioButton dans ce JPanel...

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    oui c'est ca. ya peut etre une autre solution, mais moi c ce que j'avais fais et ca marchait tres bien, donc voila...

  6. #6
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 253
    Points
    1 253
    Par défaut
    Et pourrais tu me montrer comment tu remplis ta JTable STP ?

    Car je viens d'adapter ton code pour mon problème, et je me retrouve avec ma colonne complètement grisée. Toutes les cases sont dessinées, mais vide et non sélectionnable. (Même quand je sélectionne la ligne elles ne sont pas sélectionnées...)

    Ce que moi je fais, c'est dans mon TableModel, sur la méthode getValueAt(), je crée un MyPanel().

    PS : Je sais que ce n'est pas l'idéal de le créer dans cette méthode qui est appelée très souvent, mais c'est juste pour le test...

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    moi j'utilisait un tableModel qui renvoyait pas un Boolean comme je t'ai mis dans l'exemple mais un autre Object, et c'est cette Object qui était utilisé dans le cellRenderer pour remplir ma table,
    ce qui me parait bizarre, c'est que tes lignes ne soit pas sélectionnable.
    tu as bien bien mis le isEditable ?
    et ton cellRenderer et cellEditor sont bien mis pour un type d'objet que ton model renvoi ?

  8. #8
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 253
    Points
    1 253
    Par défaut
    Je rentre dans le else du case 8: de mon switch. La valeur de ma cellule est donc bien un JPanel, et mon cellRenderer et mon cellEditor se basent bien sur un JPanel si je ne m'abuse. Je suis donc dans un cas normal de fonctionnement non ?
    MyTableModel
    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
    	public Object getValueAt(int row, int col) { 
    		Object columnValue=null;
     
    		switch (col){
             ...	
    			case 8:
    				if(mainFrame.getType().equals(Constants.PRACTICE)){
    					columnValue=dataValues[row];
    				}else{	//This is the documentation type, so value should be -1, 0 or 1
    					JPanel logicalSelection=new ButtonPanel();
    					columnValue=logicalSelection;				}
     
    			default:
    				break;
    		}
     
    		return columnValue; 
    	}
     
    	public boolean isCellEditable(int line, int col){
    		if(col==Constants.NB_COLUMN-1)	//Only the last column (values) is editable => NB_COLUMN == 9
    			return true;
    		else
    			return false;
    	}
    Programme éxécutant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    			indicatorsTable.getColumnModel().getColumn(8).setCellEditor(new MyCellEditor());
    			indicatorsTable.getColumnModel().getColumn(8).setCellRenderer(new MyCellRenderer());
    MyCellEditor
    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
    public class MyCellEditor extends AbstractCellEditor implements TableCellEditor{
    	/** Usefull for serialization */
    	private static final long serialVersionUID = -2773276631569845338L;
     
    //	private Boolean b; 
    	private ButtonPanel buttonPanel; 
     
    	public MyCellEditor() { 
    		buttonPanel= new ButtonPanel(); 
    	} 
     
    	public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, 
    			int row, int column) {
    		return buttonPanel; 
    	} 
     
    	public Object getCellEditorValue() { 
    		return buttonPanel; 
    	} 
    }
    MyCellRenderer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class MyCellRenderer implements TableCellRenderer
    {
    	private ButtonPanel buttonPanel; 
     
    	public MyCellRenderer() { 
    		buttonPanel= new ButtonPanel(); 
    	} 
     
    	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,boolean hasFocus, int row, int column) { 
    		return buttonPanel; 
    	} 
    }
    MyPanel
    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
    public class ButtonPanel extends JPanel
    {
    	/** Usefull for serialization */
    	private static final long serialVersionUID = -6134473148883037198L;
    	private JRadioButton absent=null, insufficient=null, validated=null;
     
    	public ButtonPanel() { 
    		super();
     
    		absent=new JRadioButton(Constants.ABSENT,false);
    		insufficient=new JRadioButton(Constants.INSUFFICIENT,false);
    		validated=new JRadioButton(Constants.VALIDATED,false);
    	}	
     
    	public void setSelected(int button){ 
    		switch (button)
    		{
    			case Constants.ID_ABSENT:
    				absent.setSelected(!absent.isSelected());
    				insufficient.setSelected(false);
    				validated.setSelected(false);
    				break;
     
    			case Constants.ID_INSUFFICIENT:
    				absent.setSelected(false);
    				insufficient.setSelected(!insufficient.isSelected());
    				validated.setSelected(false);
    				break;
     
    			case Constants.ID_VALIDATED:
    				absent.setSelected(false);
    				insufficient.setSelected(false);
    				validated.setSelected(!validated.isSelected());
    				break;
     
    			default:
    				break;
    		}
    	} 
    }

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    tu as bien surcharger la méthode :
    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
     
      public Class getColumnClass(int columnIndex) {
        Class class1 = null;
        switch (columnIndex) {
        case 8: 
                if(mainFrame.getType().equals(Constants.PRACTICE)){ 
                   class1 =dataValues[row].class; 
                }else{   //This is the documentation type, so value should be -1, 0 or 1 
                   class1  = JPanel.class;
                } 
          break;
        case 9: 
          break;
    .....
        }
        return class1;
      }
    tu ne la pas mis dans ton post, donc je ne sais pas si tu l'as mis. (en fait je viens de voir que tu utilise le cellRenderer sur la colonne direct, donc ce que je viens de dire ne sert a rien.)
    euh juste une remarque met plutot des constant staitique pour tes colonnes dans le switch, comme ca si tu dois insérer une colonne se sera plus simple...
    mais pour ton erreur je ne sais pas,
    est ce que tu rentre dans tes méhodes getTableCellRendererComponent... et vérifie que tu rentre aussi dans isCellEditable = true, on ne sait jamais.
    autrement je ne sais pas...

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    une derniere question, ton Jpanel n'a besoin d'aucune donnée du tableau ?
    car si c'est le car, je ne sais pas mais tu pourrais renvoyer un objet que tu n'utilise nullpart d'autre dans ta table, comme un Integer, ou un truc comme ca, et refaire mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    table.setDefaultRenderer(Integer.class, new MyRenderer()); 
        table.setDefaultEditor(Integer.class, new MyCellEditor());
    ca je sais que cela marche, car la ce qui est bizarre c que sur une condition soit tu renvoi un JPanel soit un String, et pourtant l'affichage de ta colonne 8 passera forcément par ton cellRenderer, et cellEditor que tu as définis, et pourtant euh si tu as un String, il ne sait pas koi faire...
    enfin je ne sais pas trop mais ta condition, ca me fait bizarre, en meme temps je suis pa pro...

  11. #11
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 253
    Points
    1 253
    Par défaut
    C'est normal que mon JPanel ne soit pas affiché, dans la hate, je n'ai pas recopié (car je l'avais déjà codé en local sans en faire une classe) une partie du code, que voici :
    MyPanel
    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
    	/** Usefull for serialization */
    	private static final long serialVersionUID = -6134473148883037198L;
    	private JRadioButton absentButton=null, insufficientButton=null, validatedButton=null;
    	private ButtonGroup radioButtonGroup=null;
     
    	public ButtonPanel() { 
    		super();
     
    		radioButtonGroup = new ButtonGroup();
     
    		absentButton=new JRadioButton(Constants.ABSENT,false);
    		insufficientButton=new JRadioButton(Constants.INSUFFICIENT,false);
    		validatedButton=new JRadioButton(Constants.VALIDATED,false);
     
    		radioButtonGroup.add(absentButton);
    		radioButtonGroup.add(insufficientButton);
    		radioButtonGroup.add(validatedButton);
     
    		this.add(absentButton);
    		this.add(insufficientButton);
    		this.add(validatedButton);
     
    		this.setVisible(true);
    	}
    Conclusion 1 : Quand on dit à un Jpanel de s'afficher... il s'affiche !
    Conclusion 2 : C'est exactement de ton code que j'avais besoin lilou77

    Citation Envoyé par lilou77
    juste une remarque met plutot des constant staitique pour tes colonnes dans le switch, comme ca si tu dois insérer une colonne se sera plus simple
    Remarque on ne peux plus pertinente. J'y vais de ce pas... (en même temps je sais pas pourquoi je l'ai fait pour les autres et j'ai omis celle-ci...)

    Merci beaucoup.

  12. #12
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 253
    Points
    1 253
    Par défaut
    Au passage, juste une petite chose, car je viens d'améliorer mon code.
    Penser à mettre à jour les colonnes avec les "bonnes valeurs" dans les CellRender et CellEditor. En gros, dans mon cas, il me fallait une référence vers le modèle de données de ma table pour pouvoir retourner comme renderer celui correspondant au RadioButton sélectionné...

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

Discussions similaires

  1. Afficher la table Postresql dans JTable Java
    Par faniette dans le forum Composants
    Réponses: 6
    Dernier message: 19/04/2010, 20h27
  2. Afficher la table Postresql dans JTable Java
    Par faniette dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 06/04/2010, 18h00
  3. [JTable] ajout d'un bouton dans une colonne
    Par Blast dans le forum Composants
    Réponses: 7
    Dernier message: 15/03/2007, 17h33
  4. Afficher / Masquer un bouton dans un formulaire
    Par Alpha31 dans le forum IHM
    Réponses: 10
    Dernier message: 30/05/2006, 12h08
  5. Comment afficher un Set(COLLECTION) DANS UNE jTABLE
    Par taf dans le forum Composants
    Réponses: 3
    Dernier message: 05/04/2006, 11h53

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