[JDialog]comment effectuer un setsize (ou pack) sans repaint
J'ai fait une palette d'outils à partir d'un jdialog composé d'un JPanel boxlayout vertical. Ce JPanel contient des zones de palettes (class PaletteZone extends JPanel) repliables et dépliables.
Voilà mon petit soucis :
La méthode de la class PaletteZone utilisée pour replier (à partir d'un MouseClick event) est :
public void collapse(){
ContentVisible=false;
ZoneTitle.title.setIcon(rightTriangle);
// le component 0 est la barre de titre, le component 1 est l'ensemble d'icones :
this.remove(1);
JP.validate();
}
**** 1 ) en utilisant JP.validate(), je n'ai aucun scintillement (flickering) sur ma palette et le look est très fluide... MAIS malheureusement le JDialog n'est pas remis à la bonne taille. On obtient ceci en cliquant sur "construction" :
AVANT :
http://db-maths.nuxit.net/im1.png
APRES :
http://db-maths.nuxit.net/im2.png
**** 2 ) en utilisant JP.pack(), bien sûr le dialogue est correctement retaillé et redessiné, mais cela cause un scintillement qui m'exaspère fortement (tous les composants sont redessinés)
**** 3 ) en utilisant JP.setSize(), cela a le même effet qu'un pack...
Comment puis-je me sortir d'après vous de ce dilemne ???
[/img]
Pour être beaucoup plus clair !
Je viens de faire un essai en refaisant un autre projet "essaiflicker". Pour me rassurer, j'ai tout fait dans le GUIbuilder de netbeans : tout le code est craché automatiquement, sauf les bricoles setsizes... Je me dis que le pb ne vient donc pas de ma façon de programmer.
Voilà le truc :
***** 1) Tout d'abord un lien de téléchargement du dossier contenant essaiflicker.jar :
http://db-maths.nuxit.net/essaiflicker.zip
***** 2) En cliquant sur "Flicker !" on voit le scintillement (je suis sur mac, mais je viens de faire l'essai sur un PC : pareil)
***** 3) En cliquant sur "Flicker au ralenti !" on se dirige sur une methode ou je ne fais que rajouter une pause d'une seconde juste après le setSize... Pendant 1 seconde, on voit bien que le background est effacé
***** 4) Pour être encore plus clair, voici le code de ma jdialog :
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 78 79 80 81 82 83 84 85
| package essaiflicker;
public class JDialog extends javax.swing.JDialog {
public JDialog(java.awt.Frame parent, boolean modal) {
super(parent, modal);
initComponents();
this.setSize(300,300);
}
private void initComponents() {
jButton1 = new javax.swing.JButton();
jButton2 = new javax.swing.JButton();
jButton3 = new javax.swing.JButton();
jButton4 = new javax.swing.JButton();
jButton5 = new javax.swing.JButton();
getContentPane().setLayout(new javax.swing.BoxLayout(getContentPane(), javax.swing.BoxLayout.Y_AXIS));
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
jButton1.setText("Flicker !");
jButton1.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jButton1MouseClicked(evt);
}
});
getContentPane().add(jButton1);
jButton2.setText("Flicker au ralenti (1s) !");
jButton2.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jButton2MouseClicked(evt);
}
});
getContentPane().add(jButton2);
jButton3.setText("jButton3");
getContentPane().add(jButton3);
jButton4.setText("jButton4");
getContentPane().add(jButton4);
jButton5.setText("jButton5");
getContentPane().add(jButton5);
pack();
}
private void jButton2MouseClicked(java.awt.event.MouseEvent evt) {
if (this.getSize().height==300){
this.setSize(500,500);
}else{
this.setSize(300,300);
}
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
}
}
private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {
if (this.getSize().height==300){
this.setSize(500,500);
}else{
this.setSize(300,300);
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new JDialog(new javax.swing.JFrame(), true).setVisible(true);
}
});
}
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JButton jButton3;
private javax.swing.JButton jButton4;
private javax.swing.JButton jButton5;
} |
***** 5) Plus clairement ma question donc : il y a t-il un moyen d'éviter cet effacement du background qui provoque le scintillement à chaque setsize...