Partage
  • Partager sur Facebook
  • Partager sur Twitter

Creation d'un planning

    20 janvier 2019 à 11:58:01

    Bonjour, je viens vers vous après avoir rechercher partout, voila j'ai pour but de créer un planning d'heures de disponibilité. Je veux que lorsque j'appuie sur un bouton celui ci me déclenche un nouvel etat afin que quand je clic sur mes cellules celle ci se colorent. Je suis bloquer je pense sur le changement d'etat de false a true.

    Voici mon code :

    public class TableHF extends JFrame implements ActionListener {
    	 
    	 
    	JButton btngreen;
    	JButton valid = new JButton("Confirmer");
    	ModeleStatique model = new ModeleStatique();
    	JTable table;
    	boolean test;
     
    	public static void main(String[] args) {
    		TableHF thf = new TableHF();
    	}
     
    	public TableHF() {
    		//setSize(400,400);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		JPanel panelHaut = new JPanel();
    		
    		valid.addActionListener(this);
    		panelHaut.add(btnCreate());
    		panelHaut.add(valid);
    		table = new JTable(model);
    		table.setDefaultRenderer(String.class, new ColorCellRenderer());
    		add(panelHaut);
    		add(new JScrollPane(table),BorderLayout.CENTER);
    		add(panelHaut,BorderLayout.NORTH);
    		pack();
    		setVisible(true);
    		
    	}
    	
    	
    	public JPanel btnCreate () {
    		
    		JPanel panel = new JPanel();
    		btngreen = new JButton("Activé");
    		panel.add(btngreen);
    		btngreen.addActionListener(this);
    		
    		return panel;
    	}
     
    	public void actionPerformed(ActionEvent e) {
    		
    		btngreen.addMouseListener(new MouseAdapter() {
    			
    			@Override
    			public void mousePressed(MouseEvent e) {
    				btngreen.setBackground(Color.green);
    				//JE VEUX QUE QUAND ON CLICK SUR LA CASE L'ETAT CHANGE EN TRUE ET DU COUP COLOR EN VERT
    				if(!e.getSource().equals(test)) {
    					e.getSource().equals(test=true);
    				}
    			table.repaint();	
    			}
    			
    		});
    	}
    	public class ModeleStatique extends AbstractTableModel {
     
    		private final Planning[] data;
     
    		private final String[] title = {null, "8h-9h", "9h-10h", "10h-11h"};
    		
     
    		public ModeleStatique() {
    			super();
     
    			data = new Planning[]{
    				new Planning("Lundi", false, false, false),
    				new Planning("Mardi", false, false, false),
    				new Planning("Mercredi", false, false, false),
    				new Planning("Jeudi", false, false, false),
    				new Planning("Vendredi",false, false, false),
    				new Planning("Samedi", false, false, false),
    				new Planning("Dimanche", false, false, false),
    				
    			};
    		}
    		
     
    		public int getRowCount() {
    			return data.length;
    		}
     
    		public int getColumnCount() {
    			return title.length;
    		}
     
    		public String getColumnName(int columnIndex) {
    			return title[columnIndex];
    		}
     
    		public Object getValueAt(int rowIndex, int columnIndex) {
    			switch(columnIndex){
    			    case 0:
    				return data[rowIndex].getJours();
    			    
    			    default:
    				return null;
    			}
    		}
    		public Class getColumnClass(int columnIndex){
    			return String.class;
    		}
    	}
     
    	public class Planning {
     
    		private String jours;
    		private boolean huit;
    		private boolean neuf;
    		private boolean dix;
     
    		public Planning(String jours, boolean huit, boolean neuf, boolean dix) {
    			this.jours=jours;
    			this.huit = huit;
    			this.neuf=neuf;
    			this.dix=dix;
    			
    		}
     
    		public String getJours() {
    			return jours;	
    		}
    		
    		public void setHuit(boolean huit) {
    			this.huit = huit;	
    		}
    		public boolean isHuit() {
    			return huit;	
    		}
    		public boolean isNeuf() {
    			return neuf;
    		}
    		public void setNeuf(boolean neuf) {
    			this.neuf = neuf;
    		}
    
    		public boolean isDix() {
    			return dix;
    		}
    
    		public void setDix(boolean dix) {
    			this.dix = dix;
    		}
    
    		public void setJours(String jours) {
    			this.jours = jours;
    		}	
    		
    	}
    	public class ColorCellRenderer extends DefaultTableCellRenderer {
     
    		public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    			super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
     
    			if (test=true && model.data[row].isHuit() || model.data[row].isNeuf() || model.data[row].isDix())
    				setBackground(Color.green);
    			else if	(test=false && !model.data[row].isHuit() || !model.data[row].isNeuf()|| model.data[row].isDix())
    				setBackground(Color.white);
    
    			return this;
    		}
    	}
    }

    Je vous remercie par avance.

    • Partager sur Facebook
    • Partager sur Twitter
      22 janvier 2019 à 10:51:55

      Bonjour,

      Regarde le code ci-dessous. Il doit faire ce que tu cherches à faire.

      import java.awt.BorderLayout;
      import java.awt.Color;
      import java.awt.Component;
      import java.awt.GridLayout;
      import java.awt.event.ActionEvent;
      import java.awt.event.ActionListener;
      import java.util.ArrayList;
      
      import javax.swing.AbstractCellEditor;
      import javax.swing.JButton;
      import javax.swing.JFrame;
      import javax.swing.JLabel;
      import javax.swing.JPanel;
      import javax.swing.JScrollPane;
      import javax.swing.JTable;
      import javax.swing.table.AbstractTableModel;
      import javax.swing.table.TableCellEditor;
      import javax.swing.table.TableCellRenderer;
      
      public class TableHF extends JFrame{
          
      	private static final long serialVersionUID = 1L;
      	private boolean isModifiable = false;
        
          /**
           * Constructeur de la fenêtre de saisie
           */
      	public TableHF() {
              setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              setLocationRelativeTo(null);
              setSize(300,160);
              setLayout(new BorderLayout());
              
              //Panneau Boutons
              JPanel pBouton = new JPanel();
              pBouton.setLayout(new GridLayout(1,2));
              
      	        //Bouton Activer
      	        JButton bActive = new JButton("Activer");
      	        bActive.setContentAreaFilled(true);
      	        bActive.addActionListener(e-> {
      	        	isModifiable = !isModifiable;
      	        	if(isModifiable) {
      	        		bActive.setBackground(Color.GREEN);
      	        	}else {
      	        		bActive.setBackground(null);		
      	        	}
      	        });
      	        pBouton.add(bActive);
      	        
      	        //Bouton Valider
      	        JButton bValider = new JButton("Valider");
      	        pBouton.add(bValider);
      	        
      	    getContentPane().add(pBouton, BorderLayout.NORTH);
              
              //Tableau
              JTable table = new JTable(new ModelTableau());
              table.setDefaultEditor(boolean.class, new BooleanEditor());
              table.setDefaultRenderer(boolean.class, new BooleanRenderer());
              getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
          }
          
          /**
           * Model de tableau
           */
      	private class ModelTableau extends AbstractTableModel{
      
      		private static final long serialVersionUID = 1L;
      		private ArrayList<Jour> listJour = new ArrayList<Jour>();
      		private String[] entete = {"","9h - 10h", "10h - 11h", "11h - 12h"};
      		public ModelTableau() {
      			
      			listJour.add(new Jour("Lundi"));
      			listJour.add(new Jour("Mardi"));
      			listJour.add(new Jour("Mercredi"));
      		}
      		
      		public String getColumnName(int columnIndex){
      			return entete[columnIndex];
      		}
      
      		public int getRowCount() {
      			return listJour.size();
      		}
      
      		public int getColumnCount() {
      			return entete.length;
      		}
      
      		public Object getValueAt(int rowIndex, int columnIndex) {
      			switch(columnIndex) {
      			case 0: return listJour.get(rowIndex).getNom();
      			case 1: return listJour.get(rowIndex).isNeuf();
      			case 2: return listJour.get(rowIndex).isDix();
      			case 3: return listJour.get(rowIndex).isOnze();
      			default: return null;
      			}
      		}
      		
      		public void setValueAt(Object value, int rowIndex, int columnIndex) {
      			if (isModifiable) {
      				switch (columnIndex) {
      				case 1:	listJour.get(rowIndex).setNeuf((boolean) value);break;
      				case 2:	listJour.get(rowIndex).setDix((boolean) value);	break;
      				case 3:	listJour.get(rowIndex).setOnze((boolean) value);break;
      				}
      				fireTableCellUpdated(rowIndex, columnIndex);
      			}
      		}
      		
      		public boolean isCellEditable(int rowIndex, int columnIndex){
      			return (columnIndex == 0) ? false : true;
      		}
      		
      		public Class<?> getColumnClass(int columnIndex){
      			return (columnIndex == 0) ? String.class : boolean.class; 
      		}
          }
          
          /**
           * Editeur de tableau
           */
      	private class BooleanEditor extends AbstractCellEditor implements TableCellEditor, ActionListener {
      
      		private static final long serialVersionUID = 1L;
      		private JButton bouton = new JButton();
      		private boolean isActive;
      
      		public BooleanEditor() {
      			bouton.addActionListener(this);
      		}
      		
      		public Object getCellEditorValue() {
      			return isActive;
      		}
      
      		public void actionPerformed(ActionEvent e) {
      			isActive = !isActive;
      			fireEditingStopped();
      		}
      
      		public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row,
      				int column) {
      			isActive = (boolean) value;
      			return bouton;
      		}
          }
          
          /**
           * Rendu du tableau
           */
      	private class BooleanRenderer extends JLabel implements TableCellRenderer{
      
      		private static final long serialVersionUID = 1L;
      
      		public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
      				int row, int column) {
      			
      			this.setOpaque(true);
      			if((boolean) value){
      				setBackground(Color.GREEN);
      			}else{
      				setBackground(Color.WHITE);
      			}
      			return this;
      		}
          }
      	
      	/**
      	 * Jour de la semaine
      	 */
      	public class Jour{
      		private String nom;
      		private boolean neuf;
      		private boolean dix;
      		private boolean onze;	
      		
      		public Jour(String nom) {
      			this.nom = nom;
      			neuf = dix = onze = false;
      		}
      		public String getNom() {
      			return nom;
      		}
      
      		public void setNom(String nom) {
      			this.nom = nom;
      		}
      
      		public boolean isNeuf() {
      			return neuf;
      		}
      
      		public void setNeuf(boolean neuf) {
      			this.neuf = neuf;
      		}
      
      		public boolean isDix() {
      			return dix;
      		}
      
      		public void setDix(boolean dix) {
      			this.dix = dix;
      		}
      
      		public boolean isOnze() {
      			return onze;
      		}
      
      		public void setOnze(boolean onze) {
      			this.onze = onze;
      		}
      	}
      }	



      • Partager sur Facebook
      • Partager sur Twitter
        22 janvier 2019 à 18:03:09

        Merci pour ce code même si j'avoue ne pas avoir tout saisi ! Surement pour ça que je n'y arrivais pas
        • Partager sur Facebook
        • Partager sur Twitter
          23 janvier 2019 à 9:42:13

          Bonjour,

          Je te conseille de reprendre ton code et de regarder ligne par ligne ce qui est différent par rapport à mon code.

          N'hésite pas à poser des questions au fur et à mesure pour être en mesure de tout saisir.

          Voici mes commentaires sur la première partie de ton code:

          public class TableHF extends JFrame implements ActionListener {
              
              
              JButton btngreen;									//Pourquoi instancier le bouton valid et non le bouton btngreen
              JButton valid = new JButton("Confirmer");			//Garde le même formalisme pour les noms de boutons : btnvalid
              ModeleStatique model = new ModeleStatique();		//Indique si les objets sont private, public ou protected
              JTable table;
              boolean test;
            
              public static void main(String[] args) {
                  TableHF thf = new TableHF();					//Pas besoin de nommer ta table si tu ne l'appelle plus par la suite
              }
            
              public TableHF() {
                  //setSize(400,400);
                  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                  JPanel panelHaut = new JPanel();
                   
                  valid.addActionListener(this);					//Perso, je préfère quand l'ActionListener n'est pas la page elle-même
                  panelHaut.add(btnCreate());						//car ainsi on évite les getsource() qui peuvent être source d'erreur
                  panelHaut.add(valid);
                  table = new JTable(model);
                  table.setDefaultRenderer(String.class, new ColorCellRenderer());
                  add(panelHaut);									//voir ligne 28 et il manque la contrainte
                  add(new JScrollPane(table),BorderLayout.CENTER);
                  add(panelHaut,BorderLayout.NORTH);
                  pack();
                  setVisible(true);
              }



          • Partager sur Facebook
          • Partager sur Twitter
            25 janvier 2019 à 20:25:11

            J'ai mis en commentaire ce que je n'arrive pas a comprendre merci

            JButton bActive = new JButton("Activer");
                        bActive.setContentAreaFilled(true); // PAS COMPRIS
                        bActive.addActionListener(e-> {
                            isModifiable = !isModifiable;
                            if(isModifiable) {
                                bActive.setBackground(Color.GREEN);
                            }else {
                                bActive.setBackground(null);       
                            }
                        });
                        pBouton.add(bActive);
                         
                        //Bouton Valider
                        JButton bValider = new JButton("Valider");
                        pBouton.add(bValider);
                         
                    getContentPane().add(pBouton, BorderLayout.NORTH);
                     
                    //Tableau
                    JTable table = new JTable(new ModelTableau());
                    table.setDefaultEditor(boolean.class, new BooleanEditor());
                    table.setDefaultRenderer
            (boolean.class, new BooleanRenderer()); // pourquoi boolean class et non pas booleanrennderer class ?
                    getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
                }
                 
                /**
                 * Model de tableau
                 */
                private class ModelTableau extends AbstractTableModel{
             
                    private static final long serialVersionUID = 1L;
                    private ArrayList<Jour> listJour = new ArrayList<Jour>();
                    private String[] entete = {"","9h - 10h", "10h - 11h", "11h - 12h"};
                    public ModelTableau() {
                         // Y a t il un moyen de mettre ces donnees en donnees fixe comme les heures ?
                        listJour.add(new Jour("Lundi"));
                        listJour.add(new Jour("Mardi"));
                        listJour.add(new Jour("Mercredi"));
                    }
                     
                    public String getColumnName(int columnIndex){
                        return entete[columnIndex];
                    }
             
                    public int getRowCount() {
                        return listJour.size();
                    }
             
                    public int getColumnCount() {
                        return entete.length;
                    }
             
                    public Object getValueAt(int rowIndex, int columnIndex) {
                        switch(columnIndex) {
                        case 0: return listJour.get(rowIndex).getNom();
                        case 1: return listJour.get(rowIndex).isNeuf();
                        case 2: return listJour.get(rowIndex).isDix();
                        case 3: return listJour.get(rowIndex).isOnze();
                        default: return null;
                        }
                    }
                     
                    public void setValueAt(Object value, int rowIndex, int columnIndex) {
                        if (isModifiable) {
                            switch (columnIndex) {
                            case 1: listJour.get(rowIndex).setNeuf((boolean) value);break;
            
                            case 2: listJour.get(rowIndex).setDix((boolean) value); break;
                            case 3: listJour.get(rowIndex).setOnze((boolean) value);break;
                            }
                            fireTableCellUpdated(rowIndex, columnIndex);
                        }
                    }
                     
                    public boolean isCellEditable(int rowIndex, int columnIndex){
                        return (columnIndex == 0) ? false : true;
                    } //ne comprend pas le return avec le ?
                     
                    public Class<?> getColumnClass(int columnIndex){
                        return (columnIndex == 0) ? String.class : boolean.class; //pas compris avec le ?
                    }
                }
                 
                /**
                 * Editeur de tableau
                 */
                private class BooleanEditor extends AbstractCellEditor implements TableCellEditor, ActionListener {
             
                    private static final long serialVersionUID = 1L;
                    private JButton bouton = new JButton();
                    private boolean isActive;
             
                    public BooleanEditor() {
                        bouton.addActionListener(this);
                    }
                     
                    public Object getCellEditorValue() {
                        return isActive;
                    }
             
                    public void actionPerformed(ActionEvent e) {
                        isActive = !isActive;
                        fireEditingStopped();
                    }
             
                    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row,
                            int column) {
                        isActive = (boolean) value;
                        return bouton;
                    }
                }

            -
            Edité par jprtt89 25 janvier 2019 à 20:28:42

            • Partager sur Facebook
            • Partager sur Twitter
              28 janvier 2019 à 10:24:25

              Bonjour,

              • bActive.setContentAreaFilled. Cette méthode permet de peindre l'intérieur du bouton. A priori, la valeur par défaut est true, donc il n'est pas nécessaire de préciser. Tu peux supprimer cette ligne sans que ça n'affecte le résultat.
              • table.setDefaultRenderer(). Le premier paramètre de cette méthode permet de préciser la classe des éléments sur lequelle s'applique le rendu par défaut. Dans notre cas, le  contenu des cellules qui nous intéresse est de type boolean on précise donc boolean.class. La première colonne dont les éléments sont de classe String ne sont donc pas concerné par ce rendu par défaut.
              • Y a t il un moyen de mettre ces donnees en donnees fixe: oui, tu peux en faire des données fixes. L'avantage  de la collection est de pouvoir ajouter des jours au planning de façon dynamique. Si ton idée est de n'avoir qu'une seule semaine dans ton planning (et donc de faire un nouveau planning chaque semaine), tu peux très bien en faire des données fixes
              • return(columnIndex == 0) ? false: true C'est une notation simplifiée du code suivant:
                if(columnIndex == 0) {
                			return false;
                		}else {
                			return true;
                		}
                La méthode isCellEditable() permet de préciser quelles cellules peuvent être changée. Dans notre cas, on bloque l'édition de la première colonne qui comporte le nom des jours. La méthode getColumnClass(), retourne la classe des éléments d'une colonne. Dans notre cas, les éléments de la première colonne sont des String, ceux des autres colonnes sont des boolean.

              -
              Edité par @rtur 28 janvier 2019 à 10:33:36

              • Partager sur Facebook
              • Partager sur Twitter
                28 janvier 2019 à 19:10:44

                Bonjour, merci vraiment pour tes explications tout est très clair désormais !!
                • Partager sur Facebook
                • Partager sur Twitter

                Creation d'un planning

                × 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