Bonjour à tous!
Pour une application de caisse avec une prévisualisation du ticket, j'ai un problème de lenteur avec ma Jlist et mon ListCellRenderer.
En résumé, il s'agit d'un panel qui contient un JScrollPane qui contient une Jlist. Les élements de la liste sont customisés par le ListCellRenderer.
Lors de l'ajout des premiers élements, l'opération s'éxecute rapidement mais dès que je dépasse la taille de ma JScrollPane , il y a de gros ralentissements à chaque ajout d'élement.
En lisant certains forums, ils parlent qu'il ne faut pas trop charger la méthode getListCellRendererComponent(), dans mon cas je ne pense pas que les différents tests prennent énormement de temps.
Création de la Jlist avec le ScrollPane :
Voici la classe qui contient le Renderer :
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 //ticket et boutons défilement dans panel du bas list = new JList(getTicket()); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); list.setSelectedIndex(1); list.setCellRenderer(new TicketListRenderer()); list.setFont(new Font("Helvetica", Font.PLAIN, 11)); //ici on perd la synchronisation avec l'EDT si le premier article saisi vient d'un scan... //alors j'ajoute le mouselistener par SwingUtilities pour etre sur que cet event soit toujours synchro SwingUtilities.invokeLater(new Runnable() { public void run() { list.addMouseListener(new MouseListener() { public void mouseReleased(MouseEvent arg0) { ... } public void mousePressed(MouseEvent arg0) {} public void mouseExited(MouseEvent arg0) {} public void mouseEntered(MouseEvent arg0) {} public void mouseClicked(MouseEvent arg0) {} }); } }); listScrollPane = new JScrollPane(list); listScrollPane.setPreferredSize(new Dimension(lliste, hliste)); listScrollPane.setBorder(BorderFactory.createLineBorder(Color.black, 2)); listScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); listScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); listScrollPane.setViewportView(list);
Et une partie du ticket, à noter qu'on utilise souvent SwingUtilities.invokeLater car notre caisse contient des scanners qui nous font perdre la synchronisation avec l'EDT :
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 public class TicketListRenderer extends DefaultListCellRenderer { String separateur = "_________________________________________________________________________"; DAOMagasin mag = Global.magasin; private static final long serialVersionUID = 1L; public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) { JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); label.setOpaque(true); if(index % 2 == 1){ label.setBackground(new Color(240,240,240)); } label.setBorder(null); if(isSelected){ label.setBackground(new Color(215,228,189)); } if(index == 0){ if(mag.getMagasinId() > 0){ label.setIcon(new ImageIcon(Global.ini.getPath_Images() + "logo_jumbo_ticket.JPG")); String m2 = mag.getAdresse2(); if(m2 == null || "".equals(m2)){ m2 = ""; }else{ m2 = ", " + m2; } int lang = OperateurController.getOperateurCourant().getLangueId(); String tel = Util.getTrad(Global.mapTrad, "ticket.tel", lang); String info = "<html><center>" + mag.getNom() + ", " + mag.getNpa() + "<br>" + mag.getAdresse1() + m2 + "<br>" + tel + mag.getTelephone() + "<br>" + "<b>" + mag.getUrl() + "<b>" + "<br>" + separateur + "<br>" + "</html>"; label.setText(info); label.setVerticalTextPosition(JLabel.BOTTOM); label.setHorizontalTextPosition(JLabel.CENTER); label.setFont(new Font("Helvetica", Font.PLAIN, 10)); label.setHorizontalAlignment(SwingConstants.CENTER); label.setOpaque(false); label.setBorder(null); label.setPreferredSize(new Dimension(444, 145)); } } else{ String val = (String)value; setForeground(Color.black); if(index == list.getModel().getSize()-1){ setForeground(Color.blue); } int nbt = Util.compteNombreCar((String)value, "<tr>") - 1; label.setPreferredSize(new Dimension(444, 20 * nbt)); if(val.contains("TXTAJOUT:" + ConstantesTRA.EXTOURNE_ARTICLE)){ label.setForeground(Color.red); } if(val.contains("RETOUR:")){ label.setForeground(new Color(11, 156, 28)); } else if(val.contains("DEMANDEMONNAIE")){ label.setForeground(Color.black); } else if(val.contains(":RABMYONE") || val.contains("RABAIS_CLIENT") || val.contains("BON:") || val.contains("RABAISBT:11") || val.contains("RABAIS:") ){ label.setOpaque(false); label.setBorder(null); } else if(val.contains("TRANSITION")){ if(val.equals("TRANSITIONPAIEMENT")){ String info = "<html><center>" + separateur + "<br>" + "</html>"; label.setText(info); label.setVerticalTextPosition(JLabel.BOTTOM); label.setHorizontalTextPosition(JLabel.CENTER); label.setFont(new Font("Helvetica", Font.PLAIN, 10)); label.setHorizontalAlignment(SwingConstants.CENTER); label.setPreferredSize(new Dimension(444, 11)); } label.setOpaque(false); label.setBorder(null); label.setForeground(Color.black); } else if(val.contains("MOYENPAIEMENT")){ label.setOpaque(false); label.setBorder(null); label.setForeground(Color.black); } } 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 public class Ticket extends DefaultListModel<Object> implements ListDataListener { public Ticket(CaisseController contr){ super(); addListDataListener(this); SwingUtilities.invokeLater(new Runnable() { public void run() { //l'élément vide affichera le logo au début du ticket addElement(""); } }); ensureCapacity(1000); this.contr = contr; this.lang = contr.getOperateurCourant().getLangueId(); } public void affiche(DAOTransaction t){ String aff = "<html><body><table BORDER=\"" + border + "\" width=\"100%\"><tr>"; ... aff += "</html>"; final String affi = aff; SwingUtilities.invokeLater(new Runnable() { public void run() { addElement(affi); } }); }
Partager