Bonjour,

J'ai reproduit mon problème dans ce petit programme.

Il y a 200 petits JPanel vides. Quand on tape une touche, ça change le background (couleur) de tous les panels.

Mon problème c'est que c'est très lent ! On voit les panels changer de couleur 1 par 1, parfois même très lentement (plus d'1 sec!). Pourtant on peut pas faire plus simple comme programme...

J'ai essayé bcp de choses (utiliser paintImmediatly, remplacer les JPanel par des JComponent dans lesquels je peins moi-même le fond, etc.) mais sans différence significative.

Des idées ?

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
 
package testslowrepaint;
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
public class TestSlowRepaint extends JFrame
{
    private static final int NB_BOXES = 204;
    private JPanel contentPanel;
    private boolean allSelected;
 
    public TestSlowRepaint()
    {
        contentPanel = new JPanel(new GridLayout(0, 6));  // 6 columns, and as many rows as needed
        setContentPane(contentPanel);
 
        // Tile with many boxes
        for (int i = 0; i < NB_BOXES; i++)
        {
            contentPanel.add(new MyBox());
        }
 
        // A key press will select or unselect all boxes
        addKeyListener(new KeyAdapter()
        {
            public void keyPressed(KeyEvent e)
            {
                toggleSelectAll();
            }
        });
 
        setPreferredSize(new Dimension(800, 600));
        pack();
    }
 
    private void toggleSelectAll()
    {
        allSelected = !allSelected;
        for (Component c : contentPanel.getComponents())
        {
            ((MyBox) c).setSelected(allSelected);
        }
    }
 
    public static void main(String[] args)
    {
        final TestSlowRepaint app = new TestSlowRepaint();
        app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        java.awt.EventQueue.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                app.setVisible(true);
            }
        });
    }
 
    // ---------------------------------------------------------------------------------------
    // MyBox class
    // ---------------------------------------------------------------------------------------
    private final class MyBox extends JPanel
    {
        public MyBox()
        {
            setBorder(BorderFactory.createLineBorder(Color.BLUE, 1));
            setSelected(false);
        }
 
        public void setSelected(boolean b)
        {
            setBackground(b ? Color.YELLOW : Color.GRAY);
        }
    }
}