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

 Java Discussion :

Faire un planning avec JTable


Sujet :

Java

  1. #21
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Je reviens vers toi car je galère vraiment à faire commencer mon planning en Septembre et le faire finir en Août. Et j'arrive pas non plus à mettre les jours de la semaine.
    Voici mes classe:
    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
    class CalendarWeekRenderer extends JLabel implements TableCellRenderer {
     
        public CalendarWeekRenderer() {
            super();
            setFont(new Font(null, Font.PLAIN, 28));
            setVerticalAlignment(JLabel.TOP);
            setHorizontalAlignment(JLabel.LEFT);
            setOpaque(true);
        }
     
        public Component getTableCellRendererComponent(JTable table, Object value,
                                                        boolean isSelected, boolean hasFocus,
                                                        int row, int column) {
            setText((String)value);
            return this;
        }
    }
    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    public class WeekPanel extends JPanel {
     
    	private final static Color COLOR_EVEN = new Color(111, 199, 227);
    	private final static Color COLOR_ODD = Color.WHITE;
    	private final static Color COLOR_SELECTION = Color.YELLOW;
     
    	private final Calendar calendar;
    	private JLabel[] labels;
    	private int selection;
    	private CalendarWeekViewer viewer;
    	private JPanel weekPanel;
     
    	public WeekPanel(CalendarWeekViewer viewer, Calendar calendar) {
    		this.viewer=viewer;
    		this.calendar = calendar;
     
    		selection = calendar.get(Calendar.WEEK_OF_YEAR);
     
    		setLayout(new BorderLayout());
     
    		int premiereSemaine = calendar.getMinimum(Calendar.SEPTEMBER);
    		int derniereSemaine = calendar.getMaximum(Calendar.AUGUST);
     
    		labels=new JLabel[derniereSemaine-premiereSemaine+1];
     
    		weekPanel = new JPanel(new GridLayout(1, 0));
    		for (int i = premiereSemaine; i <= derniereSemaine; i++) {
    			JLabel label = new JLabel(getWeekLabel(i), JLabel.CENTER);
    			label.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5));
    			label.setOpaque(true);
    			labels[i-premiereSemaine]=label;
    			setLabelColor(i);
    			label.setEnabled(true);
    			final int week = i;
    			label.addMouseListener(new MouseAdapter() {
    				@Override
    				public void mouseClicked(MouseEvent e) {
    					setSelection(week);
    				}
    			});
    			weekPanel.add(label);
    		}
     
    		JScrollPane slider = new JScrollPane(weekPanel,
    				JScrollPane.VERTICAL_SCROLLBAR_NEVER,
    				JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    		add(slider, BorderLayout.CENTER);
    	}
     
    	private void setLabelColor(int week) {
    		int premiereSemaine = calendar.getMinimum(Calendar.WEEK_OF_YEAR);
    		JLabel label=labels[week-premiereSemaine];
    		if ( week==selection ) {
    			label.setBackground(COLOR_SELECTION);
    		}
    		else if (week % 2 == 0) {
    			label.setBackground(COLOR_ODD);
    		} else {
    			label.setBackground(COLOR_EVEN);
    		}
     
    	}
     
    	public void updateSelection() {
    		int premiereSemaine = calendar.getMinimum(Calendar.WEEK_OF_YEAR);
    		int oldSelection = selection;
    		selection = calendar.get(Calendar.WEEK_OF_YEAR);
    		setLabelColor(oldSelection);
    		setLabelColor(selection);
    		weekPanel.scrollRectToVisible(labels[selection-premiereSemaine].getBounds());
    	}
     
    	private void setSelection(int selection) {
    		int oldSelection = this.selection;
    		this.selection = selection;
    		setLabelColor(oldSelection);
    		setLabelColor(selection);
    		viewer.setWeek(selection);
    	}
     
    	private String getWeekLabel(int week) {
     
    		Calendar calendar = Calendar.getInstance(); 
    		calendar.setTime(this.calendar.getTime()); 
    		calendar.set(Calendar.WEEK_OF_YEAR, week);
     
    		// 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);
     
            return getWeekLabel(week, premierJour, dernierJour, monthPremierJour, monthDernierJour);		
     
    	}
     
    	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) {
    		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 + fin;
    	}
     
    }
    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
    public class CalendarWeekTableModel extends AbstractTableModel {
     
        private Calendar calendar;
     
        public CalendarWeekTableModel(Calendar calendar) {
        	this.calendar = calendar;
        }
     
        public int getColumnCount() {
        	// ramene les 7 jours de la semaine
            return 7;
        }
     
        public int getRowCount() {
        	// ramene le nombre de ligne
        	// nombre de demi journée 
        	return 2;
        }
     
        public String getColumnName(int col) {
            return getDayName(col);
        }
     
        public Object getValueAt(int row, int col) {
            int dayOfMonth = row * 7 + col - getFirstDayOfWeek() + 2;
            if (dayOfMonth < 1 || dayOfMonth > getLastDayOfMonth()) {
                return "";
            }
            else {
                return new Integer(dayOfMonth).toString();
            }
        }
     
        public boolean isCellEditable(int row, int col) {
            return true;
        }
        private String getDayName(int day) {
        	Calendar calendarDay = Calendar.getInstance();
        	calendarDay.setTime(calendar.getTime());
    		calendarDay.add(Calendar.DATE, day);
    		return calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG_FORMAT, Locale.getDefault())+" "+calendarDay.get(Calendar.DATE);
    	}
     
        private int getFirstDayOfWeek() {
            return calendar.get(Calendar.DAY_OF_WEEK);
        }
     
        private int getLastDayOfMonth() {
            return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        }
    }
    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    vpublic class CalendarWeekViewer extends JFrame implements ActionListener {
     
        Calendar calendar;
        DateFormat dateFormatter;
     
        CalendarWeekTableModel tableModel;
     
        JLabel monthLabel;
        JTable table;
        JButton prevButton;
        JButton nextButton;
        private WeekPanel weekPanel;
     
    	public CalendarWeekViewer() {
            super("Calendar Viewer");
            calendar = Calendar.getInstance();
            calendar.set(Calendar.WEEK_OF_YEAR,calendar.SEPTEMBER); // on se positionne sur la première semaine de l'année
            calendar.set(Calendar.DAY_OF_WEEK,calendar.getFirstDayOfWeek()); // on se positionne sur le premier jour de la semaine
            dateFormatter = new SimpleDateFormat("MMMM yyyy");
            createComponents();
        }
     
        private void createComponents() {
            addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
     
            monthLabel = new JLabel(getWeekLabel());
            monthLabel.setFont(new Font(null, Font.PLAIN, 36));
            monthLabel.setVerticalAlignment(JLabel.CENTER);
            monthLabel.setHorizontalAlignment(JLabel.CENTER);
     
            tableModel = new CalendarWeekTableModel(calendar);
            table = new JTable((TableModel)tableModel);
            table.setPreferredScrollableViewportSize(new Dimension(700, 600));
            table.setDefaultRenderer(String.class, new CalendarWeekRenderer());
            table.setRowHeight(200);
            TableColumnModel tableColumnModel = table.getColumnModel();
            for (int i=0; i < tableColumnModel.getColumnCount(); ++i) {
                TableColumn tableColumn = tableColumnModel.getColumn(i);
                tableColumn.setPreferredWidth(200);
            }
     
            JScrollPane tableScrollPane = new JScrollPane(table);
     
            prevButton = new JButton("<<");
            prevButton.addActionListener(this);
     
            nextButton = new JButton(">>");
            nextButton.addActionListener(this);
     
            JPanel southPanel = new JPanel(new BorderLayout()); // le panel intermédiaire
            JPanel btnPanel = new JPanel();
            btnPanel.add(prevButton);
            btnPanel.add(nextButton);
            enabledButtons();
     
            // on créé le weekPanel	
            weekPanel = new WeekPanel(this, calendar);
            // on met le btnPanel et le weekPanel dans le panel intermédiaire
            southPanel.add(btnPanel, BorderLayout.NORTH); 
            southPanel.add(weekPanel, BorderLayout.SOUTH);
     
            getContentPane().add(monthLabel, BorderLayout.NORTH);
            getContentPane().add(tableScrollPane, BorderLayout.CENTER);
            getContentPane().add(southPanel, BorderLayout.SOUTH);
        }
     
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == prevButton) {
        		calendar.add(Calendar.WEEK_OF_YEAR, -1); // on décrémente
        		enabledButtons();
     
                monthLabel.setText(getWeekLabel());
            	tableModel.fireTableStructureChanged(); 
        		weekPanel.updateSelection();
            }
            else if (e.getSource() == nextButton) {
        		calendar.add(Calendar.WEEK_OF_YEAR, 1); // on incrémente
        		enabledButtons();
     
                monthLabel.setText(getWeekLabel());
            	//tableModel.fireTableDataChanged(); 
            	tableModel.fireTableStructureChanged(); 
        		weekPanel.updateSelection();
            }
        }
     
        public void setWeek(int selection) {
        	calendar.set(Calendar.WEEK_OF_YEAR, selection);
        	enabledButtons();
                monthLabel.setText(getWeekLabel());
            	tableModel.fireTableStructureChanged(); 
            	weekPanel.updateSelection();
        }
     
        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); // on récupère le numéro de la semaine
     
            // le premier jour de cette semaine
        	Date premierJour = calendar.getTime();
        	int monthPremierJour = calendar.get(Calendar.MONDAY);
     
            // 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);
     
        	return WeekPanel.getWeekLabel(week, premierJour, dernierJour, monthPremierJour, monthDernierJour); 
        }
     
        // cette méthode permet d'empêcher les boutons de changer d'année
        private void enabledButtons() {
        	int curWeek = calendar.get(Calendar.WEEK_OF_YEAR);
    		boolean previousEnabled=true;
    		boolean nextEnabled=true;
    		if ( curWeek==calendar.getMinimum(Calendar.WEEK_OF_YEAR) ) {
    			previousEnabled=false;
        	}
    		if ( curWeek==calendar.getMaximum(Calendar.WEEK_OF_YEAR) ) {
    			nextEnabled=false;
        	}
    		prevButton.setEnabled(previousEnabled);
    		nextButton.setEnabled(nextEnabled);
        }
     
        public static void main(String[] args) {
        	CalendarWeekViewer frame = new CalendarWeekViewer();
        	frame.pack();
        	frame.setVisible(true);
        }
    }

  2. #22
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    C'est sûr que comme tu fais n'importe quoi, ça risque pas de fonctionner.

    Dans le WeekViewer tu as écris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    calendar = Calendar.getInstance();
    calendar.set(Calendar.WEEK_OF_YEAR,calendar.SEPTEMBER); // on se positionne sur la première semaine de l'année
    calendar.set(Calendar.DAY_OF_WEEK,calendar.getFirstDayOfWeek()); // on se positionne sur le premier jour de la semaine
    Ces trois lignes font :
    • Créer une instance de Calendar : par défaut, la date est celle du jour
    • Ensuite tu dis que la semaine courante est le mois de septembre ! C'est n'importe quoi : un mois et un numéro de semaine ça n'a rien à voir
    • Ensuite, tu dis que le jour doit être le premier jour officiel de la semaine (donc le lundi en France), mais comme la semaine est complètement fausse, ça reste faux


    Dans le WeekViewer, on avait à l'origine, dans le code que tu avais pris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    calendar = Calendar.getInstance();
    calendar.set(Calendar.DAY_OF_MONTH, 0);
    Ces 2 lignes font :
    • Créer une instance de Calendar : par défaut, la date est celle du jour
    • Ensuite on dit qu'on se place au premier mois (parce que le calendrier d'origine affiche les mois du premier au dernier de l'année, donc il ne s'interesse pas aux jours.


    Moi, je t'ai dit d'initialiser le calendrier puis de se placer sur le mois de septembre comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // le calendar à l'initialisation contient la date du jour
    int month = calendar.get(Calendar.MONTH);
    if ( month<Calendar.SEPTEMBER ) { // si le mois courant est avant septembre
       // on doit passer à l'année d'avant pour commencer en septembre
       calendar.add(Calendar.YEAR, -1);
    }
     
    calendar.set(Calendar.MONTH,Calendar.SEPTEMBER); // on se positionne sur le mois de septembre (le début de notre liste de semaines)    	           calendar.set(Calendar.WEEK_OF_MONTH, 1); // on se positionne sur la première semaine du mois
    calendar.set(Calendar.DAY_OF_WEEK,calendar.getMinimum(Calendar.DAY_OF_WEEK)); // on se positionne sur le premier jour de la semaine
    Il n'y aucun rapport avec ce code et celui que tu as fait. J'ai mis dans les commentaires pourquoi je faisais comme ça.

    Evidemment, comme tu veux commencer la semaine au premier jour officiel (lundi), il faut changer ça, donc ça donne au final :

    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 CalendarWeekViewer() {
            super("Calendar Viewer");
            calendar = Calendar.getInstance();
     
         // le calendar à l'initialisation contient la date du jour
            int month = calendar.get(Calendar.MONTH);
            if ( month<Calendar.SEPTEMBER ) { // si le mois courant est avant septembre
               // on doit passer à l'année d'avant pour commencer en septembre
               calendar.add(Calendar.YEAR, -1);
            }
     
            calendar.set(Calendar.MONTH,Calendar.SEPTEMBER); // on se positionne sur le mois de septembre (le début de notre liste de semaines)    	   
            calendar.set(Calendar.WEEK_OF_MONTH, 1); // on se positionne sur la première semaine du mois
            calendar.set(Calendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek()); // on se positionne sur le premier jour officiel
     
            dateFormatter = new SimpleDateFormat("MMMM yyyy");
            createComponents();
        }
    Ensuite, il faut reprendre la même idée pour l'appliquer au weekpanel, pour que les semaines aillent de la première de septembre à la dernière d'aoùt

    Toi tu as écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int premiereSemaine = calendar.getMinimum(Calendar.SEPTEMBER);
    int derniereSemaine = calendar.getMaximum(Calendar.AUGUST);
    Ce qui n'a strictement aucun sens : le paramètre de getMinimum() est un identifant de champ (cf la doc de Calendar). Là tu passes un numéro de mois : ça fait donc n'importe quoi.

    La première semaine c'est un numéro de semaine : et on l'a déjà déterminé dans le CalendarWeekViewer (puisqu'on se positionne sur cette première semaine).
    La dernière semaine se détermine sur le même principe, sauf qu'on va aller chercher la semaine précédent la première du mois suivant du dernier mois de la période, donc en fait celui de l'année suivante, (on sait dire quelle est la première semaine d'un mois facilement (c'est 1), mais pour la dernière, il faut connaitre le nombre de semaines du mois : c'est donc bien plus simple d'avancer d'un mois et de reculer d'une semaine, par rapport à la première semaine du mois).

    Mais il y a autre chose qui complique tout : avant on allait de la première semaine (0) à la dernière (52 ou 53). Et pour les labels c'était pareil. Donc je gérais la semaine sélectionnée par un int. Mais maintenant la semaine va d'une semaine en plein milieu d'année (la dernière de septembre), la 36 pour cette année, jusqu'à la 35 de l'année prochaine. Et ça change tous les ans (pas de beaucoup, mais ça change).

    Donc, il est bien plus compliqué de gérer la boucle par un for ou un while. On va donc utiliser une instance de calendar pour gérer la sélection : ce sera bien plus simple.

    Il y a beaucoup de code qui change du coup, alors je te mets directement la classe : j'ai mis des commentaires (comme les fois d'avant). Il est indispensable que tu les lises pour comprendre ce que ça fait et pourquoi c'est fait comme ça.

    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    public class WeekPanel extends JPanel {
     
    	private static final int CALENDAR_START = Calendar.SEPTEMBER;
    	private final static Color COLOR_EVEN = new Color(111, 199, 227);
    	private final static Color COLOR_ODD = Color.WHITE;
    	private final static Color COLOR_SELECTION = Color.YELLOW;
     
    	private final Calendar calendar;
    	private JLabel[] labels;
    	private Calendar selection; // la sélection est gérée par un Calendar et non plus un int
    	private CalendarWeekViewer viewer;
    	private JPanel weekPanel;
    	private Map<Integer, Integer> weeks=new HashMap<>(); // on a besoin de retrouver la position d'une semaine dans la liste de label
     
    	public WeekPanel(CalendarWeekViewer viewer, Calendar calendar) {
    		this.viewer=viewer;
    		this.calendar = calendar;
     
    		// comme on ne va plus de la semaine 0 à la dernière, mais d'une semaine en plein milieu de l'année à une autre de l'année suivantre, on ne peut plus utiliser un entier pour la sélection : il est plus simple d'utiliser un calendar (parce qu'on a besoin d'une numéro de la seamine, mais aussi de l'année)
    		selection = copyCalendar(calendar);
     
    		setLayout(new BorderLayout());
     
    		Calendar premiereSemaine = getPremiereSemaine(CALENDAR_START); 
    		Calendar derniereSemaine = getDerniereSemaine(CALENDAR_START);
     
    		int nbSemaines = compteSemaines(premiereSemaine, derniereSemaine);
    		labels=new JLabel[nbSemaines];
     
    		weekPanel = new JPanel(new GridLayout(1, 0));
     
    		Calendar semaine = Calendar.getInstance(); // on a besoin de parcourir les semaines...
    		semaine.setTime(premiereSemaine.getTime()); // on les parcourt de la première à la dernière
    		for(int i=0; i<nbSemaines; i++) {
    			final Calendar week = copyCalendar(semaine);
    			weeks.put(week.get(Calendar.WEEK_OF_YEAR), i); // ceci nous permet de facilement trouver le numéro d'une semaine dans la liste de label
    			JLabel label = new JLabel(getWeekLabel(semaine), JLabel.CENTER);
    			label.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5));
    			label.setOpaque(true);
    			labels[i]=label;
    			setLabelColor(week);
    			label.setEnabled(true);
    			label.addMouseListener(new MouseAdapter() {
    				@Override
    				public void mouseClicked(MouseEvent e) {
    					setSelection(week);
    				}
    			});
    			weekPanel.add(label);
    			semaine.add(Calendar.WEEK_OF_YEAR, 1); // on avance d'une semaine
    		}
     
    		JScrollPane slider = new JScrollPane(weekPanel,
    				JScrollPane.VERTICAL_SCROLLBAR_NEVER,
    				JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    		add(slider, BorderLayout.CENTER);
    	}
     
     
    	private Calendar copyCalendar(Calendar calendar) {
    		Calendar copy = Calendar.getInstance();
    		copy.setTime(calendar.getTime());
    		return copy;
     	}
     
     
    	private int compteSemaines(Calendar premiereSemaine,
    			Calendar derniereSemaine) {
            Calendar calendar = copyCalendar(premiereSemaine); // on prend une nouvelle instance 
    		int count=0;
    		while(calendar.get(Calendar.WEEK_OF_YEAR)!=derniereSemaine.get(Calendar.WEEK_OF_YEAR)) { // tant qu'on a pas atteint la dernière semaine
    			count++; // on compte une semaine de plus
    			calendar.add(Calendar.WEEK_OF_YEAR, 1); // on avance d'une semaine
    		}
    		return count + 1; // on ajoute 1 parce qu'il faut compte la dernière semaine (qu'on a pas compter dans la boucle)
    	}
     
     
    	public static Calendar getPremiereSemaine(int month) {
            Calendar calendar = Calendar.getInstance();
     
         // le calendar à l'initialisation contient la date du jour
            int currentmonth = calendar.get(Calendar.MONTH);
            if ( currentmonth<CALENDAR_START ) { // si le mois courant est avant septembre
               // on doit passer à l'année d'avant pour commencer en septembre
               calendar.add(Calendar.YEAR, -1);
            }
     
            calendar.set(Calendar.MONTH,month); // on se positionne sur le mois demandé 
            calendar.set(Calendar.WEEK_OF_MONTH, 1); // on se positionne sur la première semaine du mois
            calendar.set(Calendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek()); // on se positionne sur le premier jour officiel
     
            return calendar;
    	}
     
    	public static Calendar getDerniereSemaine(int month) {
    		Calendar calendar = getPremiereSemaine(month); // on se place sur la première semaine du mois
    		calendar.add(Calendar.YEAR, 1); // on avance d'un an
    		calendar.add(Calendar.WEEK_OF_YEAR, -1); // on recule d'une semaine
    		return calendar;
    	}
     
    	private void setLabelColor(Calendar calendar) {
    		JLabel label=labels[weeks.get(calendar.get(Calendar.WEEK_OF_YEAR))]; // on utilise la map pour savoir le numéro du label correspondant à la semaine
    		if ( calendar.equals(selection) ) {
    			label.setBackground(COLOR_SELECTION); // la semaine sélectionnée
    		}
    		else if (calendar.get(Calendar.WEEK_OF_YEAR) % 2 == 0) { // les semaines impaires d'une couleur
    			label.setBackground(COLOR_ODD);
    		} else {
    			label.setBackground(COLOR_EVEN); //  les paires d'une autre
    		}
     
    	}
     
    	public void updateSelection() {
    		Calendar oldSelection = selection;
    		selection = copyCalendar(calendar);
    		setLabelColor(oldSelection);
    		setLabelColor(selection);
    		weekPanel.scrollRectToVisible(labels[weeks.get(selection.get(Calendar.WEEK_OF_YEAR))].getBounds());
    	}
     
    	private void setSelection(Calendar selection) {
    		Calendar oldSelection = this.selection;
    		this.selection = selection;
    		setLabelColor(oldSelection);
    		setLabelColor(selection);
    		viewer.setWeek(selection);
    	}
     
    	private String getWeekLabel(Calendar week) {
     
    		Calendar calendar = copyCalendar(week);
     
    		// 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);
     
            return getWeekLabel(week.get(Calendar.WEEK_OF_YEAR), premierJour, dernierJour, monthPremierJour, monthDernierJour);		
     
    	}
     
    	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) {
    		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 + fin;
    	}
     
    }
    Il est évidemmant nécessaire de modifier la méthode setWeek de WeekPanel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void setWeek(Calendar selection) {
        	calendar.setTime( selection.getTime());
        	enabledButtons();
                monthLabel.setText(getWeekLabel());
            	tableModel.fireTableStructureChanged(); 
            	weekPanel.updateSelection();
        }
    De plus, il faut que tu changes la méthode enableButtons de WeekPanel, parce que les première et dernière semaines ne sont plus les mêmes ! Donc les tests curWeek==calendar.getMinimum(Calendar.WEEK_OF_YEAR) && curWeek==calendar.getMaximum(Calendar.WEEK_OF_YEAR) ne sont plus les mêmes. Je t'ai rendu les méthodes getPremiereSemaine() et getDerniereSemaine() static pour que tu puisses les utiliser pour faire le bon test : normalement, si tu lis toutes les explications et la doc de la classe Calendar, tu devrais savoir comment faire le bon test.


    Par ailleurs, il y avait un bug dans la méthode getDayNames du modèle. Le bon code est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        private String getDayName(int day) {
        	Calendar calendarDay = Calendar.getInstance();
        	calendarDay.setTime(calendar.getTime());
    		calendarDay.add(Calendar.DATE, day);
    		return calendarDay.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG_FORMAT, Locale.getDefault())+" "+calendarDay.get(Calendar.DATE); // bug sur cette ligne calendar au lieu de calendarDay
    	}
    Et dans cette méthode aussi (de CalendarWeekViewer) :

    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
        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); // on récupère le numéro de la semaine
     
            // le premier jour de cette semaine
        	Date premierJour = calendar.getTime();
        	int monthPremierJour = calendar.get(Calendar.MONTH); // bug ici (il y avait int monthPremierJour = calendar.get(Calendar.MONDAY); donc n'importe quoi)!!!
     
            // 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);
     
        	return WeekPanel.getWeekLabel(week, premierJour, dernierJour, monthPremierJour, monthDernierJour); 
        }

  3. #23
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Merci de ton aide.
    Les suivants et précédents j'ai décidé de les retirer car ils me servent pas vu que j'ai déjà les semaines en bas.
    Maintenant je vais essayer d'indiquer le numéro du jour dans mes entêtes de colonne.
    Par exemple, Lundi 23, Mardi 24, ...

  4. #24
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par totot Voir le message
    Merci de ton aide.
    Les suivants et précédents j'ai décidé de les retirer car ils me servent pas vu que j'ai déjà les semaines en bas.
    Ça ne peut que te simplifier le boulot, même si c'est dommage.
    Citation Envoyé par totot Voir le message
    Maintenant je vais essayer d'indiquer le numéro du jour dans mes entêtes de colonne.
    Par exemple, Lundi 23, Mardi 24, ...
    Euh, mais c'est ce que fait déjà le code

    Nom : CaptureAg.PNG
Affichages : 275
Taille : 18,3 Ko

    PS : tiens, d'ailleurs on voit un petit bug sur cette vue : la semaine actuelle (sélectionnée) n'est pas affichée en jaune dans la liste en bas. Il suffit d'ajouter setLabelColor(selection); à la fin du constructeur de WeekPanel.

  5. #25
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Exacte, j'avais pas fait attention

Discussions similaires

  1. Peut-on faire du cluster avec winXP ?
    Par wikers dans le forum Windows XP
    Réponses: 37
    Dernier message: 02/06/2009, 11h13
  2. Problème unit CRT pour Faire du Pascal avec Delphi
    Par alexmorel dans le forum Débuter
    Réponses: 4
    Dernier message: 01/06/2004, 17h13
  3. [INDY] comment faire un 'POST' avec idHTTP??
    Par gamez dans le forum Composants VCL
    Réponses: 5
    Dernier message: 17/05/2004, 19h02
  4. Faire une JFrame avec LookAndFeel
    Par aburner dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 03/12/2003, 08h54
  5. faire des graphiques avec Perl
    Par And_the_problem_is dans le forum Modules
    Réponses: 2
    Dernier message: 16/07/2003, 16h08

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