JavaFX初探与MediaPlayer(3)

来源:互联网 发布:matlab最优化算法例题 编辑:程序博客网 时间:2024/06/07 15:43

ImageView 查看图像和动态调整对象位置大小


今天我们开始向多媒体迈出一大步:查看图像。

JavaFX提供了用于查看图像的类 javafx.scene.image.Image 和 javafx.scene.image.ImageView。javafx设计的初衷,就是要方便构建互联网应用,可以想见,javafx的图像类,也肯定能(而且就是为了)查看互联网的图像的。JavaFX的文档中,关于Image类,就说明 “used for loading images from a specified URL”,并且支持BMP,GIF,JPEG和PNG四种常用图像格式。

我们将看到,用JavaFX查看图像是极其方便的。我这次不再用Gakki女神,而使用版权毫无争议的Lena女神为例:

Image Lena = new Image("https://upload.wikimedia.org/"                      +"wikipedia/en/2/24/Lenna.png");ImageView LenaView = new ImageView(Lena);

以上构建了两个对象:Image类的Lena导入互联网图像Lenna.png,ImageView类的LenaView用Lena初始化,准备显示它。事实上,如果只想显示图像,也可以直接用图像URL生成ImageView类:

ImageView LenaView = new ImageView("https://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png");

然后就是把LenaView加入Pane,Pane加入Scene,Scene加入Stage,具体代码如下:

import javafx.application.Application;import javafx.stage.Stage;import javafx.scene.Scene;import javafx.scene.layout.Pane;import javafx.scene.image.Image;import javafx.scene.image.ImageView;public class PictureDemo extends Application{    @Override    public void start(Stage primaryStage) {        Image Lena = new Image("https://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png");        ImageView LenaView = new ImageView(Lena);        Pane pane = new Pane();        pane.getChildren().add(LenaView);        Scene scene = new Scene(pane);        primaryStage.setTitle("Lena Demo");        primaryStage.setScene(scene);        primaryStage.show();    }}

显示效果虽然简陋但是让人还是蛮有调通的成就感的:
Lena Demo

现在有个问题,如果我拉大窗口,图形是不会跟着变大的。大家可以自己试试,见到大片的margin的感觉肯定让人很不爽。当然,我们可以监测窗口大小,然后调整ImageView的大小,这似乎也是一般GUI编程的思路。但JavaFX提供的一个更方便的方法:Property Binding。
Property Binding可以翻译作“属性捆绑”,就是把某个对象的某个属性,和别的对象的某个属性“捆绑”在一起,这样两者一起更改。对ImageView而言,图像的宽高就是一个可以被捆绑的属性。简单一点,我可以把ImageView的宽高捆绑为Scene的宽高,这样在我随便调整窗口大小时,图像就可以一起变化了。这个操作只要加入以下两行代码即可:

LenaView.fitHeightProperty().bind(pane.heightProperty());LenaView.fitWidthProperty().bind(pane.widthProperty());

这样,我们就可以轻易调整图形大小,比如获得如下被压扁的Lena:
被压扁的Lena

最后说明一下,很多同学(包括我)在加载本地图像时遇到bug,直接用本地地址不能初始化Image类,需要加一个”file:”标识是本地文件,比如打开当前目录下image\Lena.png,需要这样写:

Image Lena = new Image("file:image\\Lena.png");

为什么一定要这样,当然是因为图像类本来就设计成为打开互联网图像而服务的,不加标识,它把图像也当成一个URL,自然就找不到文件了。

原创粉丝点击