Comment accélérer ce bout de code Swing ?
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:
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);
}
}
} |