Bonjour,

Excusez moi de vous déranger, je suis un peu perdu. Lorsque je passe par un proxy dynamique pour effectuer une opération (ici il s'agit de faire passer un calque de type StackPane contenant un spinner au dessus d'un AnchorPane), celle-ci n'est effectuée qu'à la fin de la méthode invoke. Il semblerait que cette dernière bloque toute opération graphique. Il y aurait il moyen de retirer ce blocage s'il vous plait ? Vous allez surement me dire que cela ne sert à rien mais c'est un exemple que j'ai créé car présenter l'autre version qui nécessite le passage par un proxy aurait été un peu trop long.

Ci-dessous le code de la classe Calque :

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
 
import javafx.geometry.Insets;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.CornerRadii;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
 
public class Calque extends StackPane {
 
	private String urlImg;
	private ImageView imgV;
    private Image image;
 
 
	public Calque(){
		this.urlImg = "application/spinner.gif";
		this.initImg();
		this.setStyle("-fx-min-Width:-infinity;"
				+ "-fx-min-Height:-infinity;"
				+ "-fx-max-Width:-infinity;"
				+ "-fx-pref-Width:1024;"
				+ "-fx-pref-Height:800;"
				+ "-fx-opacity:0.8;");
 
		AnchorPane.setLeftAnchor(this, 0.0); 
		AnchorPane.setRightAnchor(this, 0.0); 
		AnchorPane.setBottomAnchor(this, 0.0); 
		AnchorPane.setTopAnchor(this, 0.0); 
 
 
		this.backgroundProperty().set(new Background(new BackgroundFill(Color.valueOf("#4B4B4B"), CornerRadii.EMPTY, Insets.EMPTY)));
		this.setVisible(false);
		this.toBack();
	}
 
	private void initImg() {
        imgV = new ImageView();
        imgV.setFitHeight(320);
        imgV.setFitWidth(320);
        image = new Image(urlImg);
        imgV.setImage(image);
        this.getChildren().add(imgV);
        this.setCache(true);
    }
 
 
	public void show(){
		this.toFront();
		this.setVisible(true);
	}
 
	public void hide(){
		this.toBack();
		this.setVisible(false);
	}
 
 
}
Le bout de code permettant d'initialiser le proxy. Il est écrit au sein controller.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
ProxyTest<ClassePrTest> testProxy = new ProxyTest<ClassePrTest>(obj,cl);
objInter = (InterfPrTest) Proxy.newProxyInstance(ClassePrTest.class.getClassLoader(), obj.getClass().getInterfaces(), testProxy);
//...
objInter.method1() // méthode d'appel lancée lors du clique sur le bouton.
Et la classe ProxyTest :
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
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


public class ProxyTest<T> implements InvocationHandler {

    private T cible;
    private Calque calque;

    public ProxyTest(T cible, Calque calque) {
        this.cible = cible;
        this.calque = calque;
    }

    @Override
    public Object invoke(Object arg0, Method arg1, Object[] arg2) throws IllegalAccessException,
            IllegalArgumentException, InvocationTargetException, InterruptedException {
        calque.show();
        Thread.sleep(5000);
        Object val = null;
        val = arg1.invoke(cible, arg2);
        this.calque.hide();
        return val;
    }

}
En gros, il ne se passe rien que ce soit en mode debug ou le temps que le Thread.sleep(5000) soit fini sur l'écran. Je dois attendre que le return val soit fait pour que les opérations de la méthode .show() apparaissent sur l'écran. Sniff.

Je vous remercie d'avance pour votre aide et vous souhaite une bonne journée.

Cordialement,

Vincent

(des modifications à faire avec Quantumtoolkit ou Toolkit de javafx ou Platform, peut-être une histoire de runlater, suis perdu. Désolé du dérangement)