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 + JRadioButton


Sujet :

Composants Java

  1. #1
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut JTable + JRadioButton
    bonjour,
    j ai un problème (sinon je posterai pas :p), je voudrai dans une colonne de ma JTable mettre un JRadioButton, et c'est la que ca coince... Quand je clique sur ma colone ca marche, enfin, il m'affiche un bouton, mais la ligne du dessous m'affiche "javax.swing.JRadioButton"... j'ai un CellRenderer perso et un TableCellEditor, mais y a un truc qui va pas...
    voila mon cellEditor
    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
     
    public class TableCellRadioEditor extends AbstractCellEditor implements TableCellEditor {
     
    	private static final long serialVersionUID = 1L;
    	private Boolean b;
    	private JRadioButton radio = null;
     
    	public TableCellRadioEditor() {
    		radio = new JRadioButton();
    	}
     
    	public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected,
    			int row, int column) {
     
    		System.out.println( value.getClass() );
     
    		if( value instanceof Boolean ) {
    			b = (Boolean) value;
    			radio.setSelected(b);
    		}
     
    		return radio;
    	}
     
    	public Object getCellEditorValue() {
    		return radio;
    	}
    }
    le cellRenderer
    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 TableCellRadioRender implements TableCellRenderer {
     
    	JRadioButton radio = null;
     
    	public TableCellRadioRender(){
    		radio = new JRadioButton();
    	}
     
    	public Component getTableCellRendererComponent(JTable table, Object value, 
    boolean isSelected,boolean hasFocus, int row, int column) {
    		Boolean b = (Boolean)value;
    	    radio.setSelected( b );
    	    return radio;
    	}
     
    	public Object getCellEditorValue() {
    		return radio;
    	}
    }
    et je les passe comme ca a ma Table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    TableModel jTable1Model = new DefaultTableModel(
    		new Object[][] { { "ligne1", new JRadioButton()  },
    					{ "ligne2", new JRadioButton() } },
    new String[] { "Machine Cible", "Connexion par défaut" });
    jTable1 = new JTable();
    jTable1.getTableHeader().setReorderingAllowed(false);
    jScrollPane1.setViewportView(jTable1);
    jTable1.setModel(jTable1Model);
     
    TableColumn col = jTable1.getColumnModel().getColumn(1);
    col.setCellEditor( new TableCellRadioEditor() );
    jTable1.setDefaultRenderer(Boolean.class, new TableCellRadioRender() );
    il me manque quoi ?

  2. #2
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Moi j'ai une JTable qui possède un JTree en renderer. Et au lieu de faire comme toi, je fais ça (c'est relativement équivalent, mais bon on ne sait jamais):

    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
     
    	public class TreeTableCellRenderer extends JTree implements TableCellRenderer {
    		/** Last table/tree row asked to renderer. */
    		protected int visibleRow;
     
     
    		public TreeTableCellRenderer(TreeModel model) {
    			super(model);
    		}
     
    		/**
                     * updateUI is overridden to set the colors of the Tree's renderer to
                     * match that of the table.
                     */
    		public void updateUI() {
    			super.updateUI();
    			// Make the tree's cell renderer use the table's cell selection
    			// colors.
    			TreeCellRenderer tcr = getCellRenderer();
    			if (tcr instanceof DefaultTreeCellRenderer) {
    				DefaultTreeCellRenderer dtcr = ((DefaultTreeCellRenderer) tcr);
     
    				// For 1.1 uncomment this, 1.2 has a bug that will cause an
    				// exception to be thrown if the border selection color is
    				// null.
    				// dtcr.setBorderSelectionColor(null);
    				dtcr.setTextSelectionColor(UIManager.getColor("Table.selectionForeground")); //$NON-NLS-1$
    				dtcr.setBackgroundSelectionColor(UIManager.getColor("Table.selectionBackground")); //$NON-NLS-1$
    			}
    		}
     
    		/**
                     * Sets the row height of the tree, and forwards the row height to the
                     * table.
                     */
    		public void setRowHeight(int rowHeight) {
    			...
    		}
     
    		/**
                     * This is overridden to set the height to match that of the JTable.
                     */
    		public void setBounds(int x, int y, int w, int h) {
    			...
    		}
     
    		/**
                     * Sublcassed to translate the graphics such that the last visible row
                     * will be drawn at 0,0.
                     */
    		public void paint(Graphics g) {
    			g.translate(0, -visibleRow * getRowHeight());
    			super.paint(g);
    		}
     
    		/**
                     * TreeCellRenderer method. Overridden to update the visible row.
                     */
    		public Component getTableCellRendererComponent(JTable table,
    				Object value, boolean isSelected, boolean hasFocus, int row,
    				int column) {
    			if (isSelected)
    				setBackground(table.getSelectionBackground());
    			else
    				setBackground(table.getBackground());
     
    			visibleRow = row;
     
    			return this;
    		}
     
    		public ArrayList removeNode(DefectNode node) {
    			...
    		}
    	}
    Si tu trouves un bout de solution, sers-toi!

  3. #3
    Membre émérite
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Par défaut
    le moyen le plus rapide
    mais c'est pas le plus propre.

    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
     
    import java.awt.Component;
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
     
    import javax.swing.DefaultCellEditor;
    import javax.swing.JCheckBox;
    import javax.swing.JRadioButton;
    import javax.swing.JTable;
     
    /**
     * Created by IntelliJ IDEA.
     * User: bebe
     * Date: 12-Jun-2006
     * Time: 22:39:58
     * To change this template use File | Settings | File Templates.
     */
    public class RadioButtonCellEditor extends DefaultCellEditor implements ItemListener {
        private JRadioButton button;
     
        public RadioButtonCellEditor() {
            // un radio button et un checkbox c'est plus ou moins la meme chose.
            // un JCheckBox a 2 etat par defaut (ou 3 si on demande)
            // et un JRadioButton toujours 2
            // on peux alors utiliser DefaultCellEditor.
            super(new JCheckBox());
        }
     
        @Override
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
            if (value == null) {
                return null;
            }
     
            button = (JRadioButton) value;
            button.addItemListener(this);
            return (Component) value;
        }
     
        @Override
        /**
         * Description copied from class: DefaultCellEditor
         * Forwards the message from the CellEditor to the delegate.
         */
        public Object getCellEditorValue() {
            button.removeItemListener(this);
            return button;
        }
     
        /* Implemented method -> ItemListener */
        public void itemStateChanged(ItemEvent e) {
            super.fireEditingStopped();
        }
    }

    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
     
    import java.awt.Component;
     
    import javax.swing.JTable;
    import javax.swing.table.TableCellRenderer;
     
    /**
     * Created by IntelliJ IDEA.
     * User: bebe
     * Date: 12-Jun-2006
     * Time: 22:40:31
     * To change this template use File | Settings | File Templates.
     */
    public class RadioButtonCellRenderer implements TableCellRenderer {
     
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            if (value == null) {
                return null;
            }
            return (Component) value;
        }
    }
    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
     
    import javax.swing.ButtonGroup;
    import javax.swing.JFrame;
    import javax.swing.JRadioButton;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.event.TableModelEvent;
    import javax.swing.table.DefaultTableModel;
     
    /**
     * Created by IntelliJ IDEA.
     * User: bebe
     * Date: 12-Jun-2006
     * Time: 22:39:30
     * To change this template use File | Settings | File Templates.
     */
    public class RadioButtonCellTest extends JFrame {
        public RadioButtonCellTest() {
            super("JRadioButtonTable Example");
     
            DefaultTableModel myTableModel = new DefaultTableModel();
            myTableModel.setDataVector(
                    new Object[][]{
                            {"ligne 1", new JRadioButton()},
                            {"ligne 2", new JRadioButton()},
                            {"ligne 3", new JRadioButton()},
                            {"ligne 4", new JRadioButton()},
                            {"ligne 5", new JRadioButton()}},
                    new Object[]{"Machine cible",
                            "connection par defaut"}
            );
     
            JTable myTable = new JTable() {
                public void tableChanged(TableModelEvent e) {
                    super.tableChanged(e);
                    repaint(); // faux efacer le precedant radiobutton
                }
            };
     
            myTable.setModel(myTableModel);
            myTable.getColumn(myTable.getColumnName(1)).setCellRenderer(new RadioButtonCellRenderer());
            myTable.getColumn(myTable.getColumnName(1)).setCellEditor(new RadioButtonCellEditor());
     
     
            /* apres tu peut en selectionner q'un seul par colonne? */
            ButtonGroup myGroup = new ButtonGroup();
            myGroup.add((JRadioButton) myTableModel.getValueAt(0, 1));
            myGroup.add((JRadioButton) myTableModel.getValueAt(1, 1));
            myGroup.add((JRadioButton) myTableModel.getValueAt(2, 1));
            // ...
     
            add(new JScrollPane(myTable));
        }
     
        public static void main(String[] args) {
            RadioButtonCellTest myFrame = new RadioButtonCellTest();
            myFrame.setSize(400, 300);
            myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            myFrame.setLocationRelativeTo(null);
            myFrame.setVisible(true);
        }
    }
    ca te va comme ca?

  4. #4
    Membre éclairé
    Inscrit en
    Mars 2006
    Messages
    220
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 220
    Par défaut
    bonjour , je cherche à faire la meme chose mais je ne sais pas a l'avance le nombre de checkbox que j'aurais a mettre et donc je dois faire une boucle

    mais comment faire une boucle alors que l'on doit mettre notre checkbox dans un objet comme dans l'exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    new Object[][] { { "ligne1", new JRadioButton()  },
    					{ "ligne2", new JRadioButton() } },
    new String[] { "Machine Cible", "Connexion par défaut" });
    merci de votre réponse

  5. #5
    Membre émérite
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Par défaut
    attention l'exemple ici est un peu special :-))

    c'est un JTable avec plusieur row avec des JRadioButton et que tu peut selectionner juste un de ces JRadioButton dans toute la table.
    toi tu veut faire un truc beaucoup plus simple :-))

    si tu as un model et tu defini la classe de ta colonne ou tu veux un check box comme Boolean.class alors automatiqument tu aura un editeur et renderer qui sera un checkbox :-)

  6. #6
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    MEEERRRRRCCCCIIIIIIIIII !!!!!!!!!!!!!!


    désolé pour la latence, mais j'avais abandonné
    Ca marche impecable

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

Discussions similaires

  1. Plusieurs groupes de JRadioButtons en cellules de JTable
    Par Chavadam dans le forum Composants
    Réponses: 0
    Dernier message: 04/12/2014, 20h58
  2. Problème de rafraichissement de JRadioButton dans une JTable
    Par domas_24 dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 18/05/2012, 15h35
  3. JRadioButton (un seul sélectionné) dans une JTable
    Par Noizet dans le forum Composants
    Réponses: 2
    Dernier message: 03/10/2008, 07h27
  4. [JTable] JRadioButton dans les cellules
    Par Takis dans le forum Composants
    Réponses: 4
    Dernier message: 14/04/2008, 13h54
  5. Réponses: 9
    Dernier message: 12/08/2002, 07h38

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