Tag: javafx

JavaFX绑定和空值

我想知道如何绑定绑定的来源可能为null的值。 我有一个属性: private ObjectProperty<Operation> operation = new SimpleObjectProperty<>(null); 我也有一个文本字段: @FXML private Text txtCurrentOperation; 我想将字段的textProperty绑定到操作对象的值。 我的第一个想法是使用FluentAPI的时候/然后/否则构造,但它是热切的评价,所以解决方案: Bindings.when(operation.isNotNull()) .then("null") .otherwise(operation.get().getName())); 会抛出一个NPE,因为不管什么时候的结果, otherwise参数都被评估。 我的下一个想法是不知何故使用lambda: txtCurrentOperation.textProperty().bind(() -> new SimpleStringProperty( operation.isNotNull().get() ? "Null" : operation.get().getName() )); 但绑定没有启用lambda的解决方案。 (后来我意识到它不可能有,因为真正的工作倒退:绑定对象(操作)的更改将触发活页夹(字段文本属性)的更新。) 我发现一些文章建议使用属性的“极值”值而不是null。 但是Operation是一个复杂而重量级的组件,所以构造一个人工实例来表示null是不平凡的。 更重要的是,这在我看来锅炉代码,这是一个绑定机制旨在帮助消除。 我的下一个尝试是逻辑交换绑定的方向,并添加侦听器的操作属性,并让它以编程方式更新字段。 它的工作原理相当简单,只要更新的需要只取决于操作对象实例: operation.addListener((e) -> { txtCurrentOperation.setText(operation.isNull().get() ? "Null" : operation.get().getName()); }); operation.set(oper); 它比较简单,但不起作用:它会抛出“无法设置绑定值”。 例外,我不明白为什么控制的文本属性被视为绑定。 我跑出了想法。 经过大量的搜索,我仍然不能解决简单的问题来根据源是否为空来不同地更新文本字段。 这似乎是如此简单和日常的问题,我相信我错过了解决方案。

在JavaFX的表格中获取复选框值

我有一个表,它有一个复选框的行。 我想要做的是在按钮点击我想找出什么复选框被选中,哪些不是。 到目前为止,我设法在表中创建复选框。 代码如下。 public class TTEs implements Initializable{ @FXML private TableView<TestObject> tableReport; @FXML private TableColumn<TestObject, String> name; @FXML private TableColumn<TestObject, Boolean> checkbox; @FXML public void getValues(){ //the method will get what check boxes are checked (this part is the problem) } @Override public void initialize(URL arg0, ResourceBundle arg1) { ObservableList<TestObject> data = FXCollections.observableArrayList(); data.add(new […]

JavaFX,JavaScript控制台日志记录和框架(Vue.js)

好吧,我正在开发一个基本上是自包含的web应用程序。 Jetty后端通过RESTful Ajax调用与HTML / JS前端进行通信,前端位于JavaFX WebEngine中。 无论如何,我在这个项目中使用了Vue.js。 我已经重定向控制台日志记录使用我已经读了几次相同的方法(请注意我使用Kotlin的后端): class JavaBridge { fun log(text: String){ AppLogger.webConsole.debug(text) } } //Other code here… val window = engine.executeScript("window") as JSObject val bridge = JavaBridge() window.setMember("java", bridge) engine.executeScript(""" console.log = function(message){ java.log(message); } """) 所以,这里是我的问题的一个例子,用一些示例JavaScript: console.log('This will print to the logs'); new Vue({ el: '#element', methods: { doSomething: function(){ console.log('This […]

Kotlin。 基本的JavaFX应用程序

尝试Kotlin朗,我有一个印象,它与Java兼容,因此与JavaFX,我试着下面: public object TestKt: Application() { public override fun start(stage: Stage){ val pane= Pane() val scene=Scene(pane,200.0,200.0) stage.scene = scene stage.show() } @JvmStatic public fun main(args: Array<String>){ launch() } } 这与Java的基本相同 public class Test extends Application { @Override public void start(Stage stage) { Pane pane=new Pane(); Scene scene=new Scene(pane, 200,200); stage.setScene(scene); stage.show(); } public static void […]

从Delegate属性的getValue()和setValue()函数外部获取KProperty信息

我试图用委托Kotlin属性实现JavaFX Property接口,以便它可以像这样使用: class Foo(bar:Bar){ val barProperty=PropertyFX(bar) var bar by barProperty } 我为此写了一个小类(大部分): class PropertyFX<T>(value:T):SimpleObjectProperty<T>(value),ReadWriteProperty<Any?,T>{ override fun getValue(thisRef:Any?,property:KProperty<*>)=get() override fun setValue(thisRef:Any?,property:KProperty<*>,value:T)=set(value) } 但是,这个类没有实现接口的getBean()和getName()方法。 它们应该分别从getValue()和setValue()函数中引用的参数中返回值thisRef和property.name,但是我不能从函数外部访问这些参数。 我可以在第一次使用时存储这些值,如下所示: class PropertyFX<T>(value:T):SimpleObjectProperty<T>(value),ReadWriteProperty<Any?,T>{ private var bean:Any?=null private var name="" override fun getBean()=bean override fun getName()=name override fun getValue(thisRef:Any?,property:KProperty<*>):T{ bean=thisRef name=property.name return get() } override fun setValue(thisRef:Any?,property:KProperty<*>,value:T){ bean=thisRef name=property.name set(value) } 但是,这似乎是一个可怕的黑客攻击,它不返回正确的值getBean()和getName(),直到该属性被访问一次。 有没有办法获得这些值,而不需要传递给构造函数,就像SimpleObjectProperty所要求的那样 […]

如何在javafx中获得固定数量的没有填充的调整大小的单元格?

背景: 我正在研究实时规划算法的可视化工具。 “世界”是在一个文本文件中提供的,其中'_'是一个空闲单元格,'#'是一个被阻止的单元格。 以下是一个例子: 41 21 ___________________ @ _____________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _ _ ####################################### _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ___________________ * _____________________ 窗口在每一行中具有完全相同数量的单元格,并且在每一列中具有完全相同数量的单元格是非常重要的。 我必须在Kotlin中可视化,这是与Java 100%互操作的。 我决定尝试javafx,版本8.0.60。 在对javafx布局做一些研究后,我决定使用TilePane是我最好的选择。 我到目前为止: 这是我迄今为止。 如果仔细观察,可以在TilePane的每个节点中看到非常少量的填充。 由于机器人从瓦片到瓦片,这个少量的填充引入了一个小错误,因为机器人使用瓦片的宽度和高度移动,而不考虑填充。 这使得机器人在走过迷宫时不会在瓷砖的中心。 另外,我的解决方案非常依赖窗口的大小。 如果我稍微调整一下,则世界显示不正确,因为每行和每列的固定单元格数目不同。 问题: 这些问题是重要的。 是否有一个布局或设置,将提供给我每行和每列固定数量的单元格? 展现世界取决于这一点。 如何摆脱布局中每个节点之间的填充? 如果可能的话,我想调整布局,同时保持前两个不变量。 有谁知道一个办法做到这一点? 我的代码的相关部分: 注意:robot.fill与调用robot.setFill相同,Kotlin在实例化对象时省略了类型和关键字new。 val […]

连续动画在TornadoFX?

在阅读完文档后,我仍然对如何在另一个完成后执行动画感到困惑。 我有这样的时间表: timeline { keyframe(Duration.seconds(0.5)) { keyvalue(firstImg.scaleXProperty(), 1.0, interpolator = Interpolator.EASE_BOTH) keyvalue(firstImg.scaleYProperty(), 1.0, interpolator = Interpolator.EASE_BOTH) keyvalue(firstImg.rotateProperty(), 0.0, interpolator = Interpolator.EASE_BOTH) } keyframe(Duration.seconds(0.5)) { keyvalue(secondImg.scaleXProperty(), 1.0, interpolator = Interpolator.EASE_BOTH) keyvalue(secondImg.scaleYProperty(), 1.0, interpolator = Interpolator.EASE_BOTH) keyvalue(secondImg.rotateProperty(), 0.0, interpolator = Interpolator.EASE_BOTH) } keyframe(Duration.seconds(0.5)) { keyvalue(thirdImg.scaleXProperty(), 1.0, interpolator = Interpolator.EASE_BOTH) keyvalue(thirdImg.scaleYProperty(), 1.0, interpolator = Interpolator.EASE_BOTH) keyvalue(thirdImg.rotateProperty(), 0.0, interpolator […]

在JavaFX TableView中平滑滚动

我正在使用TornadoFX在Kotlin上编写一个小型的聊天应用程序,这个程序到目前为止都是有效的。 我正在尝试使它在接收新消息时更具视觉吸引力。 消息在一个TableView (发送者 – 消息),但滚动到新的消息是不平稳的,我想。 我需要帮助的片段相对较短: addEventHandler(ScrollToEvent.ANY) { it.consume() timeline { val keyValue = KeyValue(/* property to change */, /* target value */, Interpolator.EASE_OUT) keyframe(0.25.seconds) { this.plusAssign(keyValue) } } } 一般来说,我需要帮助确定哪些属性需要更改以及目标应该在这一行中: KeyValue(/* property to change */, /* target value */, Interpolator.EASE_OUT)

tornadoFX togglebutton没有文本属性

我是kotlin和tornadoFX的新手。 在TornadoFX指南中,可以使用以下方法构建ToggleButton: togglebutton("OFF").action { text = if (isSelected) "ON" else "OFF" } 但是,当我将相同的代码复制到我的IDE,这是错的! 似乎tornadoFX中的togglebutton中没有文本属性?

Tornadofx – 如何将参数传递给每一个实例的片段

我是javafx,kotlin和显然tornadofx的新手。 问题 : 如何将参数传递给每一个实例的片段? 比方说,我有一个表视图布局作为我的片段。 现在这个片段被用在多个地方,但有不同的数据集。 例如。 在下面添加片段: class SomeView : View() { … root += SomeViewFragment::class } class SomeAnotherView : View() { … root += SomeViewFragment::class } 声明片段: class SomeViewFragment : Fragment() { … tableview(someDataSetFromRestApiCall) { … } } 如何从SomeView和SomeAnotherView传递不同的someDataSetFromRestApiCall?