JavaFX初探与MediaPlayer(3)

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,自然就找不到文件了。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值