bonjour à tous,
Voila mon problème; actuellement je travaille sur une application Java SE pour définir un agenda (de la même manière que Sunbird ou google Agenda).
seulement j'ai un problème et ne sais pas vraiment quel est le problème.
j'ai un JXTable qui défini un emploi du temps (journalier pour l'instant).
et je veux en cliquant sur une horaire et en draggant jusqu’à une autre pouvoir créer un évènement (exactement comme dans sunbird ou google agenda). mon problème est que l'affichage n'est pas fluide, j'ai un gros clipping au drag (l'objet est dessiné puis effacé ect...).
quand je drag l'objet sans bouger la souris l'objet n'est pas affiché, un peu comme si a chaque mouvement de la souris l'objet etait déssiné et éffacé directement.
Je ne sais pas vraiment quoi faire donc si quelqu'un a une solution ou une astuce ca serait vraiment cool !

voila le code :

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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
 
public class PlancheAgenda extends JPanel {
 
	private static final long serialVersionUID = -3923864495893212973L;
 
	private ResourceBundle labels;
 
	private Agenda parent;
 
    /** définit la vue actuelle j : journalière, h : hebdomadaire, m : mensuelle **/
    private char vue = 'h';
 
    // Table de la vue des jours
    private DefaultTableModel modelTableVueJour = null;
	private JXTable tableVueJour = null;
	private Calendar jour = null;
 
    private Vector<Evenement> vEvenement = new Vector<Evenement>();
    private Evenement tempEvenement = null;
 
    Vector<RoundRectangle2D> vEvenementIHM = new Vector<RoundRectangle2D>();
    RoundRectangle2D tempRoudRectangle = null;
    Point start;
    Point end;
 
    protected static int rowHeight = 60;
	Rectangle r = new Rectangle();
 
 
/* ****************************************************************************************** */
/*                                      CONSTRUCTEUR                                          */
/* ****************************************************************************************** */
    public PlancheAgenda(Agenda parent, ResourceBundle labels) {
        this.parent = parent;
        this.labels = labels;
    }
 
 
/* ****************************************************************************************** */
/*                                    INITIALISATION IHM                                      */
/* ****************************************************************************************** */
    public void initPlancheAgenda(Date dateDebutAffichage, String strSdf) {
    	ZoneLayout mainLayout = ZoneLayoutFactory.newZoneLayout();
    	mainLayout.addRow("6.....");
    	mainLayout.addRow("2a*-a2");
    	mainLayout.addRow("6.....");
    	this.setLayout(mainLayout);
 
		JTabbedPane jtp = new JTabbedPane();
		jtp.add(labels.getString("PlancheAgenda.ongletJour"), initPlancheAgenda_ongletJour());
		jtp.add(labels.getString("PlancheAgenda.ongletSemaine"), initPlancheAgenda_ongletSemaine());
		jtp.add(labels.getString("PlancheAgenda.ongletMois"), initPlancheAgenda_ongletMois());
		jtp.setPreferredSize(new Dimension(1000, 800));
		jtp.setSize(new Dimension(1000, 800));
		this.add(jtp, "a");
    }
 
    private JPanel initPlancheAgenda_ongletJour() {
    	// Zone layout
		ZoneLayout mainLayout = ZoneLayoutFactory.newZoneLayout();
		mainLayout.addRow("6.....");
		mainLayout.addRow("2a+*a2");
		mainLayout.addRow("6.....");
 
		JPanel panel = new JPanel(mainLayout);
 
 
		// Initialisation de la table des tâches
		// -> Création de la table des tâches
		modelTableVueJour = new DefaultTableModel(24, 2);
		tableVueJour = new JXTable(modelTableVueJour);
		tableVueJour.setEnabled(false);
		tableVueJour.setRowHeight(rowHeight);
		tableVueJour.setSortable(false);
		tableVueJour.setRolloverEnabled(false);
 
		// -> Customize Header JXtable
		tableVueJour.getTableHeader().setBackground(Color.LIGHT_GRAY);
		tableVueJour.getTableHeader().setForeground(Color.BLUE);
		tableVueJour.getTableHeader().setResizingAllowed(false);
		tableVueJour.getTableHeader().setReorderingAllowed(false);
 
		// -> Column 0 : heures
		tableVueJour.getColumn(0).setHeaderValue(null);
		tableVueJour.getColumn(0).setResizable(false);
		tableVueJour.getColumn(0).setMinWidth(50);
		tableVueJour.getColumn(0).setMaxWidth(50);
 
		// -> Column 1 : jour
		tableVueJour.getColumn(1).setHeaderRenderer(new MyTableHeaderRenderer());
		jour = Calendar.getInstance(TimeZone.getDefault());
		tableVueJour.getColumn(1).setHeaderValue(labelDateVueJour(jour));
 
		// -> Création du ScrollPane et ajout de la table des jours
		JScrollPane scrollPane = new JScrollPane(tableVueJour);
		tableVueJour.setPreferredScrollableViewportSize(new Dimension(600, 200));
		tableVueJour.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
 
		// -> Ajout du renderer
		tableVueJour.setDefaultRenderer(Object.class, new MyTableRenderer());
 
 
		tableVueJour.addMouseListener(new MouseListener() {
			String heureDebut;
			String heureFin;
 
			@Override
			public void mouseReleased(MouseEvent me) {
				System.out.println("released");
				//System.out.println("mouseReleased debut");
				// recadrer le point y de fin sur la minute (:00, :15, :30, :45) la plus proche avant
				int pixelYFin = (me.getY()/(rowHeight/4))*15;
 
				// recupérer l'heure de début en fonction du point pixelYDebut
				heureFin = convertPixelToHour(pixelYFin);
				String[] heureFinSplit = heureFin.split(":");
				Calendar cDateFin = Calendar.getInstance(TimeZone.getDefault());
				cDateFin = jour;
				cDateFin.set(Calendar.HOUR_OF_DAY, Integer.parseInt(heureFinSplit[0]));
				cDateFin.set(Calendar.MINUTE, Integer.parseInt(heureFinSplit[1]));
 
				tempEvenement = new Evenement();
//*******				tempEvenement.setDateFin(cDateFin.getTime());
				tempEvenement.setHeureDebut(heureFin);
 
				dessinerEvenement(heureDebut, heureFin, tableVueJour.getColumn(0).getWidth(), tableVueJour.getColumn(1).getWidth());
 
//				tempRoudRectangle.setRoundRect(tempRoudRectangle.getX(), tempRoudRectangle.getY(),
//	   					   					   tableVueJour.getColumn(1).getWidth(), pixelYFin-tempRoudRectangle.getY(),
//	   					   					   20, 20);
//				
				Graphics2D g2D = (Graphics2D)(tableVueJour.getGraphics());
 
				g2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, .4f));
				g2D.setColor(Color.RED);
				g2D.fill(r);
				g2D.setColor(Color.BLACK);
	            g2D.setStroke(new BasicStroke(5.0f));
	            g2D.draw(r);
 
				//System.out.println("mouseReleased fin");
			}
 
			@Override
			public void mousePressed(MouseEvent me) {
				System.out.println("pressed");
				//System.out.println("mousePressed debut");
 
				// vérifier que le point se trouve bien seulement sur la colonne 1 des jours
				if(me.getX()>tableVueJour.getColumn(0).getWidth()) {
					// recadrer le point y de début sur la minute (:00, :15, :30, :45) la plus proche avant
					int pixelYDebut = (me.getY()/(rowHeight/4))*15;
 
					// recupérer l'heure de début en fonction du point pixelYDebut
					heureDebut = convertPixelToHour(pixelYDebut);
					String[] heureDebutSplit = heureDebut.split(":");
					Calendar cDateDebut = Calendar.getInstance(TimeZone.getDefault());
					cDateDebut = jour;
					cDateDebut.set(Calendar.HOUR_OF_DAY, Integer.parseInt(heureDebutSplit[0]));
					cDateDebut.set(Calendar.MINUTE, Integer.parseInt(heureDebutSplit[1]));
 
					tempEvenement = new Evenement();
//******					tempEvenement.setDateDebut(cDateDebut.getTime());
					tempEvenement.setHeureDebut(heureDebut);
 
 
 
					tempRoudRectangle = new RoundRectangle2D.Double(tableVueJour.getColumn(0).getWidth(), pixelYDebut,
																	tableVueJour.getColumn(1).getWidth(), 10,
																	20, 20);
					if(start == null)
			            start = me.getPoint();					
				}
 
				//System.out.println("mousePressed fin");
			}
 
			@Override
			public void mouseExited(MouseEvent arg0) {
			}
 
			@Override
			public void mouseEntered(MouseEvent arg0) {
			}
 
			@Override
			public void mouseClicked(MouseEvent me) {
				System.out.println("clicked");
			}
		});
 
		tableVueJour.addMouseMotionListener(new MouseMotionListener() {
 
			@Override
			public void mouseMoved(MouseEvent arg0) {
			}
 
			@Override
			public void mouseDragged(MouseEvent me) {
				//System.out.println("mouseDragged debut");
 
				if(end==null) {
					end = new Point(start.x, start.y);
				}
 
				if(me.getX()>tableVueJour.getColumn(0).getWidth() && me.getY()!=end.getY()) 
				{
					end = me.getPoint();
			        if(start!=null && end!=null){
			            tempRoudRectangle.setRoundRect(tempRoudRectangle.getX(), tempRoudRectangle.getY(),
								   					   tableVueJour.getColumn(1).getWidth(), me.getY()-tempRoudRectangle.getY(),
								   					   20, 20);
					}
				    // redessiner les evenements
 
			        String heureFin;
			        String heureDebut;
 
					int pixelYFin = (me.getY()/(rowHeight/4))*15;
 
					// recupérer l'heure de début en fonction du point pixelYDebut
					heureDebut = tempEvenement.getHeureDebut();
					// recupérer l'heure de début en fonction du point pixelYDebut
					heureFin = convertPixelToHour(pixelYFin);
 
					dragEvenement(heureDebut, heureFin, tableVueJour.getColumn(0).getWidth(), tableVueJour.getColumn(1).getWidth());
		        // fin JPE
 
				}
		        repaint();
 
			}
		});
 
		// Initialisation de la colonne des heures
		String tableauHeures[] = {"00:00", "01:00", "02:00", "03:00", "04:00", "05:00", "06:00", "07:00", "08:00", "09:00", "10:00", "11:00",
								  "12:00", "13:00", "14:00", "15:00", "16:00", "17:00", "18:00", "19:00", "20:00", "21:00", "22:00", "23:00"};
		for(int i=0; i<tableauHeures.length; i++) {
			modelTableVueJour.setValueAt(tableauHeures[i], i, 0);
		}
 
    	panel.add(scrollPane, "a");
 
 
    	return panel;
    }
 
    private JPanel initPlancheAgenda_ongletSemaine() {
    	JPanel panel = new JPanel();
 
    	return panel;
    }
 
    private JPanel initPlancheAgenda_ongletMois() {
    	JPanel panel = new JPanel();
 
    	return panel;
    }
 
 
/* ****************************************************************************************** */
/*                                            IHM                                             */
/* ****************************************************************************************** */
    public void update() {
 
    }
 
    public void clear() {
    	System.out.println("clear");
    }
 
    /**
     * 
     * @param heureDebut : HH:MM avec HH = 00 à 23 et MM = 00|15|30|45
     * @param heureFin : HH:MM
     */
    public void dessinerEvenement(String startHour, String endHour, int x, int width) {
    	int y=0;
    	int height = 0;
 
    	// Avec l'heure de début retrouver les coordonnées y
    	String[] startHourSplit = startHour.split(":");
    	int heureDebut = Integer.parseInt(startHourSplit[0]);
    	int minuteDebut = Integer.parseInt(startHourSplit[1]);
    	y = heureDebut*rowHeight+minuteDebut;
 
    	// Avec l'heure de fin calculer la taille en hauteur de l'affichage de l'évènement
    	String[] endHourSplit = endHour.split(":");
    	int heureFin = Integer.parseInt(endHourSplit[0]);
    	int minuteFin = Integer.parseInt(endHourSplit[1]);
    	height = (heureFin*rowHeight+minuteFin) - y;    	
 
    	r.setLocation(x, y);
    	r.setSize(width, height);
 
    	Graphics2D g2D = (Graphics2D)(tableVueJour.getGraphics());
 
		g2D.setColor(Color.RED);
		g2D.fill(r);
		g2D.setColor(Color.BLACK);
		g2D.setStroke(new BasicStroke(2.0f));
        g2D.draw(r);
    }
 
    public void dragEvenement(String startHour, String endHour, int x, int width)
    {
    	int y=0;
    	int height = 0;
 
    	// Avec l'heure de début retrouver les coordonnées y
    	String[] startHourSplit = startHour.split(":");
    	int heureDebut = Integer.parseInt(startHourSplit[0]);
    	int minuteDebut = Integer.parseInt(startHourSplit[1]);
    	y = heureDebut*rowHeight+minuteDebut;
 
    	// Avec l'heure de fin calculer la taille en hauteur de l'affichage de l'évènement
    	String[] endHourSplit = endHour.split(":");
    	int heureFin = Integer.parseInt(endHourSplit[0]);
    	int minuteFin = Integer.parseInt(endHourSplit[1]);
    	height = (heureFin*rowHeight+minuteFin) - y;    	
 
 
    	Graphics2D g2D = (Graphics2D)(tableVueJour.getGraphics());
 
    	tableVueJour.setLayout(new OverlayLayout(tableVueJour));
    	r.setLocation(x,y);
    	r.setSize(width, height);
 
		g2D.setColor(Color.RED);
		g2D.fill(r);
 
 
		g2D.draw(r);	
    }
 
    public void paintComponent(Graphics g) {
//    	System.out.println("paintComponent debut");
//    	super.paintComponent(g);
 
    	 // redessiner les evenements
			Graphics2D g2D = (Graphics2D)(tableVueJour.getGraphics());
 
			g2D.setColor(Color.RED);
			g2D.fill(r);
			g2D.setColor(Color.BLACK);
            g2D.setStroke(new BasicStroke(5.0f));
            g2D.draw(r);
 
    }