Partage
  • Partager sur Facebook
  • Partager sur Twitter

Calendar JTable

Sujet résolu
    19 mars 2019 à 16:19:10

    Bonjour, me voici depuis quelques semaines en galere. 

    Je realise un planning dans un JTable avec en entete les journées du calendar qui changent chaque semaine.

    Le probleme etant que deja je n'arrive pas a obtenir les jours (lundi,mardi ..) correctement, puis les semaines et les jours ne correspondent pas du tout au vrai calendrier je ne comprend pas pourquoi.

    Puis par ailleurs j'essaie de récuperer ces entetes dans mysql et il se trouve que du coup la date ne me retourne rien. Si vous pouviez m'aider ce serait gentil. Merci

    private String[] entete = {"",getDayName(Calendar.SUNDAY), getDayName(Calendar.MONDAY), getDayName(Calendar.TUESDAY),
    	        		getDayName(Calendar.WEDNESDAY), getDayName(Calendar.THURSDAY), getDayName(Calendar.FRIDAY), getDayName(Calendar.SATURDAY)};
    	        
    
    public ModelTableau(Calendar calendar) {
    	             
    	            listJour.add(new Jour("8h-9h"));
    	            listJour.add(new Jour("9h-10h"));
    	            listJour.add(new Jour("10h-11h"));
    	            listJour.add(new Jour("11h-12h"));
    	            listJour.add(new Jour("12h-13h"));
    	            listJour.add(new Jour("13h-14h"));
    	            listJour.add(new Jour("14h-15h"));
    	            listJour.add(new Jour("15h-16h"));
    	            listJour.add(new Jour("16h-17h"));
    	            listJour.add(new Jour("17h-18h"));
    	            listJour.add(new Jour("18h-19h"));
    	            listJour.add(new Jour("19h-20h"));
    	            listJour.add(new Jour("Soirée"));
    	            
    	        }
    	       
    	        protected String getDayName(int day) {
    	        	Calendar calendarDay = Calendar.getInstance();
    	        	calendarDay.setTime(calendar.getTime());
    	    		calendarDay.add(Calendar.DATE, day);
    	    		return calendar.getDisplayName(Calendar.DAY_OF_WEEK_IN_MONTH, Calendar.LONG_FORMAT, Locale.getDefault())+" "+calendarDay.get(Calendar.DATE);
    	    }
    private String getWeekLabel() {
    	    	 
    	    	Calendar calendar = Calendar.getInstance(); 
    	    	calendar.setTime(this.calendar.getTime()); // on recopie dedans la date actuellement mise dans le calendar qui ser pour savoir quelle semaine on affiche
    	 
    	    	int week = calendar.get(Calendar.WEEK_OF_YEAR); // RECUPERE LE NUMERO DE LA SEMAINE
    	 
    	            // le premier jour de cette semaine
    	    	Date premierJour = calendar.getTime();
    	    	int monthPremierJour = calendar.get(Calendar.WEEK_OF_MONTH);
    	 
    	        // le dernier jour de cette semaine
    		calendar.add(Calendar.WEEK_OF_YEAR, 1);
    		calendar.add(Calendar.DAY_OF_WEEK, -1);
    		Date dernierJour = calendar.getTime();
    	 
    		int monthDernierJour = calendar.get(Calendar.WEEK_OF_MONTH);
    		int annee = calendar.get(Calendar.YEAR);
    	 
    		return getWeekLabel(week, premierJour, dernierJour, monthPremierJour, monthDernierJour, annee); 



    • Partager sur Facebook
    • Partager sur Twitter
      21 mars 2019 à 9:53:21

      Personne pour m'aider ? Svp
      • Partager sur Facebook
      • Partager sur Twitter
        21 mars 2019 à 15:13:28

        Bonjour jprtt89,

        Pourrais tu s'il te plait nous donner un visuel de ce que tu souhaites faire?

        • Partager sur Facebook
        • Partager sur Twitter
          21 mars 2019 à 16:27:16

          Oui bien sur cela va etre long si je met tout.

          Voila le getWeekLabel en haut ne correspond pas à la vrai semaine en cours, les entetes me sortent null et non les jours de la semaine correspondant,

          lorsque je clique sur la semaine suivante je n'arrive pas à rafraichir le panel, il me met de suite en erreur normal et du coup par le bouton valider je souhaite récupéré mes données rentrer selon le jour qui a été cliquer. Tout plein d'erreur qui me bloque depuis des semaines 

          Code : 

          public class CalendarWeekTableModel extends JFrame{
          	
          	JLabel monthLabel;
          	JPanel panel_1;
          	JTable table;
          	JButton bActive;
          	private Calendar calendar;
          	DateFormat dateFormatter;
          	JButton prevButton;
          	JButton nextButton;
          	ModelTableau tableModel;
          	private boolean isModifiable = false;
          	
          	public CalendarWeekTableModel() {
          		
          		this.setTitle("Table");
          		this.setSize(600, 600);
          		panel_1 = (JPanel) this.getContentPane();
          		this.setLocationRelativeTo(null);
          		
          		
          		calendar = Calendar.getInstance();
          	 	 
                  calendar.set(Calendar.WEEK_OF_MONTH,calendar.getMinimum(Calendar.DAY_OF_WEEK_IN_MONTH)); // ON SE POSITIONNE SUR LA SEMAINE EN COURS
                          calendar.set(Calendar.DAY_OF_WEEK,calendar.getMinimum(Calendar.DAY_OF_WEEK_IN_MONTH)); // ON SE POSITIONNE SUR LE PREMIER JOUR DE LA SEMAINE
                          
          	
                          JPanel panel_2 = new JPanel();
              	        monthLabel = new JLabel(getWeekLabel());
              	        panel_2.add(monthLabel);
              	        panel_1.add(panel_2, BorderLayout.NORTH);
          		
          
          		JPanel panel_3 = new JPanel();
          		panel_1.add(panel_3, BorderLayout.CENTER);
          		table = new JTable(new ModelTableau(calendar));
          		table.setMaximumSize(new Dimension(300,115));
          table.setDefaultEditor(boolean.class, new BooleanEditor());
          table.setDefaultRenderer(boolean.class, new BooleanRenderer());
          panel_3.setLayout(new BorderLayout(0, 0));
          panel_3.add(new JScrollPane(table));
          
          
          
          JPanel panel_4 = new JPanel();
          panel_1.add(panel_4, BorderLayout.SOUTH);
          
          prevButton = new JButton("<<");
          prevButton.addActionListener(this::SemaineListener);
          panel_4.add(prevButton);
          
          bActive = new JButton("Activer");
          bActive.addActionListener(this::bActiveListener);
          panel_4.add(bActive);
          
          
          JButton btnValider = new JButton("Valider");
          btnValider.addActionListener(this::btnValiderListener);
          panel_4.add(btnValider);
          
          
          nextButton = new JButton(">>");
          nextButton.addActionListener(this::SemaineListener);
          panel_4.add(nextButton);
          
          	}
          	
          public void btnValiderListener(ActionEvent e) {
          	
          
          }
          
          
          public void setWeek(int selection) {
          	calendar.set(Calendar.WEEK_OF_YEAR, selection);
          	
                  monthLabel.setText(getWeekLabel());
              	tableModel.fireTableDataChanged(); 
              	tableModel.fireTableStructureChanged(); 
              	
          }
          
          public void SemaineListener(ActionEvent e) {
              if (e.getSource() == prevButton) {
          		calendar.add(Calendar.WEEK_OF_YEAR, -1); // on décrémente
          		
          
                  monthLabel.setText(getWeekLabel()); 
              	tableModel.fireTableStructureChanged(); //STRUCTURE DE LA TABLE ENTIERE CHANGE 
          		updateSlection();
              }
              else if (e.getSource() == nextButton) {
          		calendar.add(Calendar.WEEK_OF_YEAR, 1); // on incrémente
          		
          		
                  monthLabel.setText(getWeekLabel());
              	tableModel.fireTableStructureChanged(); 
          		updateSlection();
              }
          }
          
          private void updateSlection() {
          	
          
          }
          
          private String getWeekLabel() {
          	 
          	Calendar calendar = Calendar.getInstance(); // on créé un nouveau calendar pour pas modifier le calendar qui nous sert pour savoir quelle semaine on affiche
          	calendar.setTime(this.calendar.getTime()); // on recopie dedans la date actuellement mise dans le calendar qui ser pour savoir quelle semaine on affiche
          
          	int week = calendar.get(Calendar.WEEK_OF_YEAR); // RECUPERE LE NUMERO DE LA SEMAINE
          
                  // le premier jour de cette semaine
          	Date premierJour = calendar.getTime();
          	int monthPremierJour = calendar.get(Calendar.MONTH);
          
              // le dernier jour de cette semaine
          calendar.add(Calendar.WEEK_OF_YEAR, 1);
          calendar.add(Calendar.DAY_OF_WEEK, -1);
          Date dernierJour = calendar.getTime();
          
          int monthDernierJour = calendar.get(Calendar.MONTH);
          int annee = calendar.get(Calendar.YEAR);
          
          return getWeekLabel(week, premierJour, dernierJour, monthPremierJour, monthDernierJour, annee); 
          }
          
          private final static DateFormat DATE_DEBUT_FORMAT = new SimpleDateFormat(
          		"dd");
          private final static DateFormat DATE_FORMAT = new SimpleDateFormat(
          		"dd MMMM");
          
          public static  String getWeekLabel(int week, Date premierJour, Date dernierJour, int monthPremierJour, int monthDernierJour, int annee) {
          	String debut;
          	if (monthDernierJour == monthPremierJour) {
          		debut = DATE_DEBUT_FORMAT.format(premierJour);
          	} else {
          		debut = DATE_FORMAT.format(premierJour);
          	}
          
          	String milieu = DATE_FORMAT.format(dernierJour);
          
          	String fin = " (" + week + ")";
          
          
          	return debut + " - " + milieu + " " + annee + fin ;
          }
          
          private ArrayList<Jour> listJour = new ArrayList<Jour>();
          
          private class ModelTableau extends AbstractTableModel{
          
              private static final long serialVersionUID = 1L;
              
              private String[] entete = {"",getDayName(Calendar.SUNDAY), getDayName(Calendar.MONDAY), getDayName(Calendar.TUESDAY),
              		getDayName(Calendar.WEDNESDAY), getDayName(Calendar.THURSDAY), getDayName(Calendar.FRIDAY), getDayName(Calendar.SATURDAY)};
              
              
              public ModelTableau(Calendar calendar) {
                   
                  listJour.add(new Jour("8h-9h"));
                  listJour.add(new Jour("9h-10h"));
                  listJour.add(new Jour("10h-11h"));
                  listJour.add(new Jour("11h-12h"));
                  listJour.add(new Jour("12h-13h"));
                  listJour.add(new Jour("13h-14h"));
                  listJour.add(new Jour("14h-15h"));
                  listJour.add(new Jour("15h-16h"));
                  listJour.add(new Jour("16h-17h"));
                  listJour.add(new Jour("17h-18h"));
                  listJour.add(new Jour("18h-19h"));
                  listJour.add(new Jour("19h-20h"));
                  listJour.add(new Jour("Soirée"));
             
              }
              
              protected String getDayName(int day) {
              	Calendar calendarDay = Calendar.getInstance();
              	calendarDay.setTime(calendar.getTime());
          		calendarDay.add(Calendar.DATE, day);
          		return calendar.getDisplayName(Calendar.DAY_OF_WEEK_IN_MONTH, Calendar.LONG_FORMAT, Locale.getDefault())+" "+calendarDay.get(Calendar.DATE);
          }
          
          	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).isHuit();
                  case 2: return listJour.get(rowIndex).isNeuf();
                  case 3: return listJour.get(rowIndex).isDix();
                  case 4: return listJour.get(rowIndex).isOnze();
                  case 5: return listJour.get(rowIndex).isDouze();
                  case 6: return listJour.get(rowIndex).isTreize();
                  case 7: return listJour.get(rowIndex).isQuatorze();
                  case 8: return listJour.get(rowIndex).isQuinze();
                  case 9: return listJour.get(rowIndex).isSeize();
                  case 10: return listJour.get(rowIndex).isDixsept();
                  case 11: return listJour.get(rowIndex).isDixhuit();
                  case 12: return listJour.get(rowIndex).isDixneuf();
                  case 13: return listJour.get(rowIndex).isVingt();
                  case 14: return listJour.get(rowIndex).isSoir();
                  default: return null;
                  }
              }
               
              public void setValueAt(Object value, int rowIndex, int columnIndex) {
                  if (isModifiable) {
                      switch (columnIndex) {
                      case 1: listJour.get(rowIndex).setHuit((boolean) value);break;
                      case 2: listJour.get(rowIndex).setNeuf((boolean) value);break;
                      case 3: listJour.get(rowIndex).setDix((boolean) value); break;
                      case 4: listJour.get(rowIndex).setOnze((boolean) value);break;
                      case 5: listJour.get(rowIndex).setDouze((boolean) value);break;
                      case 6: listJour.get(rowIndex).setTreize((boolean) value);break;
                      case 7: listJour.get(rowIndex).setQuatorze((boolean) value);break;
                      case 8: listJour.get(rowIndex).setQuinze((boolean) value);break;
                      case 9: listJour.get(rowIndex).setSeize((boolean) value);break;
                      case 10: listJour.get(rowIndex).setDixsept((boolean) value);break;
                      case 11: listJour.get(rowIndex).setDixhuit((boolean) value);break;
                      case 12: listJour.get(rowIndex).setDixneuf((boolean) value);break;
                      case 13: listJour.get(rowIndex).setVingt((boolean) value);break;
                      case 14: listJour.get(rowIndex).setSoir((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;
              }
          }
           
          
          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;
              }
          }
          
          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(new Color(204,204,255));
                  }else{
                      setBackground(Color.WHITE);
                  }
                  return this;
              }
          }
           
          
          public class Jour{
              public String nom;
              public boolean huit;
              public boolean neuf;
              private boolean dix;  
              private boolean onze;
              private boolean douze;
              private boolean treize;
              private boolean quatorze;
              private boolean quinze;
              private boolean seize;
              private boolean dixsept;
              private boolean dixhuit;
              private boolean dixneuf;
              private boolean vingt;
              private boolean soir;
              
               
              public Jour(String nom) {
                  this.nom = nom;
                 huit = neuf = dix = onze = douze = treize = quatorze= quinze = seize= dixsept= dixhuit = dixneuf= vingt= soir = false;
              }
              public String getNom() {
                  return nom;
              }
          
              public void setNom(String nom) {
                  this.nom = nom;
              }
              public boolean isHuit() {
          		return huit;
          	}
          	public void setHuit(boolean huit) {
          		this.huit = 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 boolean isOnze() {
                  return onze;
              }
          
              public void setOnze(boolean onze) {
                  this.onze = onze;
              }
          	public boolean isDouze() {
          		return douze;
          	}
          	public void setDouze(boolean douze) {
          		this.douze = douze;
          	}
          	public boolean isTreize() {
          		return treize;
          	}
          	public void setTreize(boolean treize) {
          		this.treize = treize;
          	}
          	public boolean isQuatorze() {
          		return quatorze;
          	}
          	public void setQuatorze(boolean quatorze) {
          		this.quatorze = quatorze;
          	}
          	public boolean isQuinze() {
          		return quinze;
          	}
          	public void setQuinze(boolean quinze) {
          		this.quinze = quinze;
          	}
          	public boolean isSeize() {
          		return seize;
          	}
          	public void setSeize(boolean seize) {
          		this.seize = seize;
          	}
          	public boolean isDixsept() {
          		return dixsept;
          	}
          	public void setDixsept(boolean dixsept) {
          		this.dixsept = dixsept;
          	}
          	public boolean isDixhuit() {
          		return dixhuit;
          	}
          	public void setDixhuit(boolean dixhuit) {
          		this.dixhuit = dixhuit;
          	}
          	public boolean isDixneuf() {
          		return dixneuf;
          	}
          	public void setDixneuf(boolean dixneuf) {
          		this.dixneuf = dixneuf;
          	}
          	public boolean isVingt() {
          		return vingt;
          	}
          	public void setVingt(boolean vingt) {
          		this.vingt = vingt;
          	}
          	public boolean isSoir() {
          		return soir;
          	}
          	public void setSoir(boolean soir) {
          		this.soir = soir;
          	}
          
          }
          
          
          public void bActiveListener(ActionEvent e ) {
          	
          	isModifiable = !isModifiable;
              if(isModifiable) {
                  bActive.setBackground(new Color(204,204,255));
              }else {
                  bActive.setBackground(null);       
              }
          };
          public static void main (String[] args) {
          	
          	CalendarWeekTableModel w = new CalendarWeekTableModel();
          	w.setVisible(true);
          }
          
          }
          • Partager sur Facebook
          • Partager sur Twitter
            22 mars 2019 à 14:26:40

            Je te propose de prendre les problèmes les uns après les autres. Commençons par l'étiquette en haut de ta JTable. Si j'ai bien compris, elle devrait afficher : "18 - 24 mars 2019 (12)".

            Voici un exemple de code qui réalise cela:

            //On se positionne sur le jour actuel
            		Calendar calendar = Calendar.getInstance();
            		int annee = calendar.get(Calendar.YEAR);
            		int semaine = calendar.get(Calendar.WEEK_OF_YEAR);
            		
            		//On se positionne sur le lundi
            		calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
            		int nbLundi = calendar.get(Calendar.DAY_OF_MONTH);
            		String moisLundi = calendar.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault());
            		
            		//On se postionne sur le dimanche
            		calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
            		int nbDimanche = calendar.get(Calendar.DAY_OF_MONTH);
            		String moisDimanche = calendar.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault());
            		
            		//On affiche le résultat
            		String resultat = nbLundi + " ";
            		if(!moisLundi.equals(moisDimanche)) {
            			resultat += moisLundi + " ";
            		}
            		resultat += "- " + nbDimanche + " " + moisDimanche + " " + annee + " (" + semaine + ")";
            		
            		System.out.println(resultat);



            • Partager sur Facebook
            • Partager sur Twitter
              22 mars 2019 à 15:12:42

              Oui cela fonctionne merci, je pensais que le calendar se positionnais automatiquement sur le dimanche par rapport a ce que j'avais lu, et ne comprenait pas pourquoi il était décalé d'une semaine.
              • Partager sur Facebook
              • Partager sur Twitter
                22 mars 2019 à 15:32:00

                Maintenant, regardons de plus prêt les entêtes du tableau. Je suppose que tu cherches à obtenir quelques chose comme: Lundi 18, Mardi 19, Mercredi 20, etc.

                A mon sens, le plus simple est de modifier directement la méthode getColumnName() comme ceci:

                public String getColumnName(int columnIndex){
                        Calendar calendar = Calendar.getInstance();
                    	switch(columnIndex) {
                	        case 0: return "";
                	        case 1: calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); break;
                	        case 2: calendar.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY); break;
                	        case 3: calendar.set(Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY); break;
                	        case 4: calendar.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY); break;
                	        case 5: calendar.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY); break;
                	        case 6: calendar.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY); break;
                	        case 7: calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); break;
                	        default: return null;
                        }
                    	return calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.getDefault()) + " " +
                        			calendar.get(Calendar.DAY_OF_MONTH);
                    }

                A noter que dans ce cas, j'ai créé un nouvelle instance de Calendar. Dans ton programme final, je pense qu'il faudra en faire une instance globale pour savoir à quelle semaine tu te réfères.

                • Partager sur Facebook
                • Partager sur Twitter
                  22 mars 2019 à 16:29:26

                  Oui effectivement ca me sort des jours qui ne correspondent pas a la semaine mais je bidouillerais ca plus tard, je te remercie !
                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 mars 2019 à 17:10:39

                    Pour ce qui est du rafraichissement des données, une possibilité est que lors d'un clic sur un bouton ">>" ou "<<", le model de tableau regarde dans ta base de donnée Mysql. Si la semaine existe, tu la recopie dans la listJour, sinon, tu remets la listJour à zéro et tu préviens la JTable du changement avec un fireTableDataChanged. A mon sens, le bouton valider est un peu superflux.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 mars 2019 à 17:17:48

                      Le bouton valider était pour confirmer l'entrée et le transfert a la base de donnée, mais je te remercie beaucoup pour ton aide précieuse je n'avais pas pensé a cette optique la. Un grand merci !!
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Calendar JTable

                      × 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