【发布时间】:2020-04-29 12:20:00
【问题描述】:
我知道那里有很多 javafx 教程。但是其中 99% 没有提供好的 fxml 东西。 在 fxml 中,我们可以进行数据绑定或“表达式绑定”,如何在 javafx 上调用它。
通过表达式绑定将 Image 绑定到 ImageView 有效。但如果图像发生变化,实际显示的图像不会改变。如何在 javafx 中使用尽可能少的代码隐藏来做到这一点。
控制器文件
class MyController {
private Image _imageA;
private Image_ imageB;
private Image_ image;
public MyController(){
_imageA = new Image(this.getClass().getResourceAsStream("imageA.png"));
_imageB = new Image(this.getClass().getResourceAsStream("imageB.png"));
_image = _imageA;
}
public getImage(){
return _image;
}
public void mouseEnter(MouseEvent mouseEvent){
_image = _imageA;
}
public void mouseLeave(MouseEvent mouseEvent){
_image = _imageB;
}
}
fxml 文件
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?>
<AnchorPane fx:id="_anchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="868.0" prefWidth="1124.0" xmlns="http://javafx.com/javafx/10.0.2-internal" xmlns:fx="http://javafx.com/fxml/1" fx:controller="MyController">
<ImageView fx:id="_imgview" image="${controller.image}" onMouseEnter="#mouseEnter" onMouseExited="#mouseLeave"/>
</AnchorPane>
当应用程序启动时,图像就会显示出来。但是当鼠标光标移动到图像上时,getImage 方法会被调用,但图像不会改变。 有没有办法用最少的代码隐藏来解决这个问题?
我不想做的是这里
class MyController implements Initializable {
//..other stuff
@FXML
private ImageView _imgview;
SimpleObjectProperty<Image> _propertyImage = new SimpleObjectProperty<>();
public void initialize(URL url, ResourceBundle resourceBundle) {
_imageViewSettings.imageProperty().bind(_propertySettingsImage);
}
public void mouseEnter(MouseEvent mouseEvent){
_imageProperty.setValue(_imageB);
}
public void mouseLeave(MouseEvent mouseEvent){
_imageProperty.setValue(_imageA);
}
}
使用 TableView 已经可以通过可观察的集合绑定数据。 如果列表内容发生变化,tableview 也会发生变化。所以在这里它起作用了。
<TableView items="${controller.items}">
<!-- other stuff-->
</TableView>
class TableController{
private ObservableList<Integer> _list = FXCollections.observableArrayList();
ObservableList<Integer> getItems(){
return _list;
}
}
正如我之前提到的,有很多 javafx 示例。但只是几个覆盖fxml。大部分的人 使用
GridPane p = new GridPane();;
p.setAlignment(...);
p.setChildren(...);
但我认为引入 FXML 是为了摆脱 WPF/XAML 中的所有这些代码隐藏内容。 长文本短问题。如何将 Image 绑定到 ImageView 以便在 Image 更改时 ImageView 将显示新图像?
亲切的问候, 鲍勃。
【问题讨论】:
-
“我不想在这里做的是……”。为什么不?这就是预期的方法。如果你想绑定到某个东西,你必须在 JavaFX 的意义上使它成为
Observable,这意味着使用一个属性或绑定。而且,在你的控制器中,你有一个对ImageView的引用,那么为什么不在事件处理程序中直接调用setImage(...)呢? -
顺便说一句,我发现在变量名中使用所有这些多余的下划线来阅读您的代码真的很困难。你能坚持标准Java naming conventions吗?
-
虽然我的回答显示了(我相信)您想要的示例,但请记住,并非所有事情都可以直接在 FXML 中完成。视图的动态部分以及其他更复杂的视图相关逻辑可能必须在代码中定义,通常在 FXML 控制器中。根据您使用的架构(例如 MVC、MVP、MVVM 等),您的控制器实际上可能非常复杂。
标签: java javafx data-binding expression fxml