Partage
  • Partager sur Facebook
  • Partager sur Twitter

[JAVA] table

TableCellRenderer problème

    4 septembre 2006 à 22:47:18

    Bonjour, j'ai un problème pour la création d'un tableau.
    J'aimerais afficher des objects.
    La première colonne serait le nom d'une personnet et la seconde la liste de ces numéro.
    Le problème, j'arrive a afficher le combo box mais je ne peux pas le dérouler.

    import java.awt.Color;
    import java.awt.Component;
    import java.util.ArrayList;

    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.table.TableCellRenderer;
    import javax.swing.table.TableModel;

    public class main {

            public static void main(String args[]) {
                    JFrame frame = new TableCellRenderFrame();
                    frame.setVisible(true);
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            }

    }

    class TableCellRenderFrame extends JFrame {
            public TableCellRenderFrame() {
                    setTitle("Test");
                    setSize(400, 400);

                    p.add(new Personne("Pierre"));
                   
                    TableModel model = new PlanetTableModel(p);
                    JTable table = new JTable(model);
                    table.setRowSelectionAllowed(false);
                   
                    table.setDefaultRenderer(ArrayList.class, new ColorTableCellRenderer());

                    add(new JScrollPane(table));

            }
           
            private ArrayList<Personne> p = new ArrayList<Personne>();
           
    }

    class PlanetTableModel extends AbstractTableModel {

            public PlanetTableModel(ArrayList<Personne> per) {
                    p = per ;
            }
           
            public String getColumnName(int c) {
                    return columnNames[c];
            }

            public Class getColumnClass(int c) {
                    if (c == 0)
                            return p.get(0).nom().getClass();
                    return p.get(0).numero().getClass();
            }

            public int getColumnCount() {
                    return 2;
            }

            public int getRowCount() {
                    return p.size();
            }

            public Object getValueAt(int r, int c) {
                    if (c == 0)
                            return p.get(r).nom();
                    return p.get(r).numero();
            }

            public void setValueAt(Object obj, int r, int c) {
                    if (c == 0)
                            p.get(r).setNom(obj);
                    p.get(r).setNum(obj);
            }

            private String[] columnNames = { "Nom", "Numéro" };

            private ArrayList<Personne> p = new ArrayList<Personne>();

    }

    class ColorTableCellRenderer extends JPanel implements TableCellRenderer {
            public Component getTableCellRendererComponent(JTable table, Object value,
                            boolean isSelected, boolean hasFocus, int row, int column) {

                    ArrayList<String> p = (ArrayList<String>)value;

                    JComboBox combo = new JComboBox();
                           
                    for(int i=0;i<p.size();i++)
                            combo.addItem(p.get(i));
                   
                   
                    return combo;
            }
    }

    class Personne {
           

           
            public Personne(String n) {
                    nom = n;
                    for (int i = 0; i < 10; i++)
                            num.add(n + i);
            }

            public String nom() {
                    return nom;
            }

            public ArrayList<String> numero() {
                    return num;
            }

            public void setNom(Object n) {
                    nom = (String) n;
            }

            public void setNum(Object n) {
                    num = (ArrayList<String>) n;
            }

            private String nom;

            private ArrayList<String> num = new ArrayList<String>();

    }


    Voilà le code.
    Pouvez vous m'aider ?
    merci
    • Partager sur Facebook
    • Partager sur Twitter
      25 septembre 2006 à 22:16:50

      Pourquoi tu mets tes membres a la fin ?
      • Partager sur Facebook
      • Partager sur Twitter
        18 octobre 2006 à 7:49:40

        Si c'est le problème auquel je pense ça vient du faire que la classe JTable ne retransmet pas les event a ses fils , il faudrait que tu te créé ta propre class qui redirige les event souris au fils du tableau. Pour un de mes progs j'avais fait ça pour que quand on click sur un bouton qui est dans un tableau ça gère bien le click :
        /*
         * MouseListener.java
         *
         * Created on 10 octobre 2006, 05:02
         *
         * To change this template, choose Tools | Template Manager
         * and open the template in the editor.
         */


        package javaapplication2;
        import java.awt.event.*;
        import java.awt.*;
        import javax.swing.*;
        import javax.swing.table.*;
        /**
         *
         * @author Administrateur
         */

        public class MousedListener implements MouseListener {
        private JTable __table;
          private void __forwardEventToButton(MouseEvent e) {
            TableColumnModel columnModel = __table.getColumnModel();
            int column = columnModel.getColumnIndexAtX(e.getX());
            int row    = e.getY() / __table.getRowHeight();
            Object value;
            JButton button;
            MouseEvent buttonEvent;

            if(row >= __table.getRowCount() || row < 0 ||
               column >= __table.getColumnCount() || column < 0)
              return;

            value = __table.getValueAt(row, column);

            if(!(value instanceof JButton))
            {
                __table.repaint();
                return;
            }

            button = (JButton)value;

            buttonEvent =
              (MouseEvent)SwingUtilities.convertMouseEvent(__table, e, button);
            button.dispatchEvent(buttonEvent);

            __table.repaint();
          }

          public MousedListener(JTable table) {
            __table = table;
          }

          public void mouseClicked(MouseEvent e) {
            __forwardEventToButton(e);
          }

          public void mouseEntered(MouseEvent e) {
            __forwardEventToButton(e);
          }

          public void mouseExited(MouseEvent e) {
            __forwardEventToButton(e);
          }

          public void mousePressed(MouseEvent e) {
            __forwardEventToButton(e);
          }

          public void mouseReleased(MouseEvent e) {
            __forwardEventToButton(e);
          }
        }


        J'espère que ça corrigera le problème ensuite il suffit juste de rajouter ce listener a ta JTable.
        • Partager sur Facebook
        • Partager sur Twitter

        [JAVA] table

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown