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 :
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
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); } }
Et la classe ProxyTest
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.:
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.
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
28import 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; } }
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)







Répondre avec citation



quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.
suivez
!
) , il me semble qu'une partie du soucis vient du fait que tu sembles attendre une exécution linéaire des choses alors qu'au contraire, tout est sensé fonctionné en asynchrone : c'est a dire qu'on lance des methodes dans le vide, elles retournent tout de suite, mais lors de l’exécution réelle elles font un effet de bord qui a un retour dans l'UI (ce qui est la manière normale de faire avec 
Partager