Olá:
Estou estudando JavaFX pelo Livro Plataforma Pro JavaFx (tradução brasileira). No momento estou no capítulo 7, sobre criação de telas mais complexas. Infelizmente estou com um problema referente a binding referente a este exemplo. A seguir segue-se uma versão simplificada do script problemático:
package testejavafx2;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.Tile;
import javafx.scene.text.Text;
import javafx.scene.text.Font;
Stage {
title: "Teste Bind"
var scene: Scene;
scene: scene = Scene {
width: 600
height: 120
content: Tile {
width: bind scene.width
height: bind scene.height
tileWidth: bind scene.width / 2 // Aqui acontece a exeção!!!
// tileHeight: bind scene.height
content: [
Text {
font: Font {
size: 24
}
x: 10, y: 30
content: "Teste de Bind"
}
]
}
}
}
Quando rodo aparece a seguinte exceção:
Unexpected exception caught in MasterTimer.timePulse():
com.sun.javafx.runtime.AssignToBoundException: Cannot assign to bound variable
at com.sun.javafx.runtime.FXBase.restrictSet$(FXBase.java:148)
at testejavafx2.TestaBind$TestaBind$Script$1Tile$ObjLit$2.set$tileWidth(TestaBind.fx)
at javafx.scene.layout.Tile.doLayout(Tile.fx:400)
at javafx.scene.layout.Container.impl_layoutChildren(Container.fx:1209)
at javafx.scene.Parent.layout(Parent.fx:831)
at javafx.scene.Parent.layout(Parent.fx:837)
at javafx.scene.Scene.doLayoutPass(Scene.fx:352)
at javafx.scene.Scene$ScenePulseListener.pulse(Scene.fx:985)
at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.fx:143)
at com.sun.javafx.tk.Toolkit.handleMasterTimerPulse(Toolkit.fx:132)
at com.sun.javafx.tk.Toolkit$1com$ObjLit$5.firePulseImpl(Toolkit.fx:305)
at com.sun.scenario.ToolkitAccessor.firePulse(ToolkitAccessor.java:55)
at com.sun.scenario.scenegraph.JSGPanelRepainter$FrameDisplay.run(JSGPanelRepainter.java:133)
at com.sun.scenario.animation.AbstractMasterTimer.timePulseImpl(AbstractMasterTimer.java:420)
at com.sun.scenario.animation.AbstractMasterTimer$MainLoop.run(AbstractMasterTimer.java:296)
at com.sun.embeddedswing.EmbeddedEventQueue.doPulse(EmbeddedEventQueue.java:570)
at com.sun.embeddedswing.EmbeddedEventQueue.access$000(EmbeddedEventQueue.java:82)
at com.sun.embeddedswing.EmbeddedEventQueue$2.run(EmbeddedEventQueue.java:473)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Já Procurei pelo Google a respeito dessa mensagem, mas não me ajudou muito :(.
No que se refere ao MasterTimer.timePulse, as sugestões que achei sugerem usar FX.deferAction. Entretanto admito que não entendi como poderia utilizar.
Já que se refere a AssignToBoundException a sugestão é usar bind inverse. Entretanto se eu fizer tileWidth: bind scene.width / 2 with inverse, acontece erro de compilação.
Portanto minha dúvida é sobre o que estou fazendo de errado e como corrigí-lo.
Grato,
