在Java中,ObservableValue 是一个接口,它是 JavaFX 库中的一部分。ObservableValue 是一个用于表示可观察的值的接口,它允许开发者在 JavaFX 应用程序中实现数据绑定和监听。在 JavaFX 中,ObservableValue 是一个非常常用的接口,它用于跟踪一个值的变化,并在值发生变化时通知监听者。
ObservableValue 接口定义了以下几个主要的方法:
addListener(ChangeListener< super T> listener):向 ObservableValue 添加一个值变化的监听器。
removeListener(ChangeListener< super T> listener):从 ObservableValue 移除一个值变化的监听器。
getValue():获取当前的值。
addInvalidationListener(InvalidationListener listener):向 ObservableValue 添加一个无效化监听器。
removeInvalidationListener(InvalidationListener listener):从 ObservableValue 移除一个无效化监听器。
invalidated():通知所有的无效化监听器,值已经无效。
通过使用 ObservableValue,您可以创建一个可以观察的属性,并在属性值发生变化时自动通知相关的监听器。这在实现数据绑定、MVC(Model-View-Controller)模式以及其他需要监听属性值变化的场景中非常有用。
是的,Java可以用于图像的设计。Java提供了许多图形库和工具,可以用于创建和处理图像。以下是一些常用的Java图形库和工具:
1 Java 2D API:Java 2D API提供了一组用于创建和处理2D图形的类和接口,包括绘图、图像处理、颜色管理和字体等方面的功能。
2 JavaFX:JavaFX是一个用于创建富客户端应用程序的框架,包括图形、媒体、界面和动画等方面的功能。JavaFX提供了一组用于创建和处理图像的类和接口,可以用于创建各种类型的图像和动画效果。
3 AWT:Abstract Window Toolkit(AWT)是Java的原始图形库,提供了一组用于创建和处理图形用户界面(GUI)的类和接口。AWT包括一些基本的绘图和事件处理功能,但是相对于Java 2D API和JavaFX,其功能较为有限。
4 Java图像处理库(Java Image Processing Library,JIPL):JIPL是一个开源的Java图像处理库,提供了一组用于处理和编辑图像的类和方法,包括图像过滤器、噪声消除、边缘检测、图像变换和颜色空间转换等方面的功能。
总之,Java可以用于图像的设计,开发人员可以根据具体需求选择适合的图形库和工具。
JavaFX Script 编程语言(以下称为JavaFX)是Sun微系统公司开发的一种declarative, statically typed(声明性的、静态类型)脚本语言。JavaFX技术有着良好的前景,包括可以直接调用Java API的能力。因为 JavaFX Script是静态类型,它同样具有结构化代码、重用性和封装性,如包、类、继承和单独编译和发布单元,这些特性使得使用Java技术创建和管理大型程序变为可能。
只是java编程的一个方向,仅仅雪java编程不用装这个,建议从基础开始学。
使用javafx的Media,MediaPlayer,MediaView。代码如下:
import javaioFile;import javafxapplicationApplication;
import javafxbeansbindingBindings;
import javafxbeanspropertyReadOnlyProperty;
import javafxbeansvalueObservableValue;
import javafxeventActionEvent;
import javafxgeometryPos;
import javafxsceneScene;
import javafxscenecontrolButton;
import javafxscenecontrolMenu;
import javafxscenecontrolMenuBar;
import javafxscenecontrolMenuItem;
import javafxscenecontrolSlider;
import javafxsceneimageImage;
import javafxsceneimageImageView;
import javafxscenelayoutBorderPane;
import javafxscenelayoutHBox;
import javafxscenelayoutPane;
import javafxscenelayoutVBox;
import javafxscenemediaMedia;
import javafxscenemediaMediaPlayer;
import javafxscenemediaMediaPlayerStatus;
import javafxscenemediaMediaView;
import javafxstageFileChooser;
import javafxstageFileChooserExtensionFilter;
import javafxstageStage;
import javafxutilDuration;
public class App extends Application {
private MediaView mediaView;
private Slider processSlider;
private static final Object AUTO = new Object(), MANUAL = new Object();
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
primaryStagesetTitle("javafx视频播放器");
BorderPane root = new BorderPane();
// 菜单栏
initMenu(root);
// 视频播放控件
mediaView = initMediaView(root);
// 视频功能控件
initMediaControllView(root);
primaryStagesetScene(new Scene(root, 600, 400));
primaryStagesetOnCloseRequest(event -> Systemexit(0));
primaryStageshow();
}
private MenuBar initMenu(final BorderPane parent) {
Menu menu = new Menu("菜单");
MenuItem item = new MenuItem("打开");
itemsetOnAction(event -> {
FileChooser chooser = new FileChooser();
choosersetTitle("选择视频文件");
choosergetExtensionFilters()add(new ExtensionFilter("视频文件", "mp4", "flv"));
File file = choosershowOpenDialog(parentgetScene()getWindow());
if (file != null) {
MediaPlayer player = mediaViewgetMediaPlayer();
// 关闭当前的player
if (player != null) {
playerstop();
playerdispose();
}
processSlidersetValue(0);
// 创建一个新的player并自动播放
player = new MediaPlayer(new Media(filetoURI()toString()));
playercurrentTimeProperty()addListener(this::mediaProcessChanged);
playersetAutoPlay(true);
mediaViewsetMediaPlayer(player);
}
});
menugetItems()add(item);
item = new MenuItem("退出");
itemsetOnAction(event -> parentgetScene()getWindow()hide());
menugetItems()add(item);
MenuBar menuBar = new MenuBar(menu);
parentsetTop(menuBar);
return menuBar;
}
private MediaView initMediaView(final BorderPane parent) {
MediaView view = new MediaView();
Pane pane = new Pane(view);
parentsetCenter(pane);
// 视频宽高可随着窗口变化而自动缩放
viewfitWidthProperty()bind(BindingsselectDouble(viewparentProperty(), "width"));
viewfitHeightProperty()bind(BindingsselectDouble(viewparentProperty(), "height"));
viewsetPreserveRatio(true);
return view;
}
private void initMediaControllView(final BorderPane parent) {
VBox bottom = new VBox(10);
bottomsetAlignment(PosCENTER);
parentsetBottom(bottom);
Slider slider = new Slider(0, 100, 0);
slidervalueProperty()addListener(this::processSliderChanged);
// slidersetOnMouseClicked(this::processSliderClicked);
bottomgetChildren()add(slider);
processSlider = slider;
HBox hbox = new HBox(10);
bottomgetChildren()add(hbox);
hboxsetAlignment(PosCENTER);
Button btn = new Button(null, new ImageView(loadImage("pausepng")));
btnsetOnAction(this::pauseOrPlay);
hboxgetChildren()add(btn);
btn = new Button(null, new ImageView(loadImage("stoppng")));
btnsetOnAction(this::stopPlay);
hboxgetChildren()add(btn);
}
private static Image loadImage(String resPath) {
return new Image(ThreadcurrentThread()getContextClassLoader()getResourceAsStream(resPath));
}
private void pauseOrPlay(ActionEvent event) {
MediaPlayer player = mediaViewgetMediaPlayer();
if (player == null) {
return;
}
Status status = playergetStatus();
if (status == StatusREADY || status == StatusPAUSED) {
playerplay();
((Button) eventgetTarget())setGraphic(new ImageView(loadImage("pausepng")));
} else if (status == StatusPLAYING) {
playerpause();
((Button) eventgetTarget())setGraphic(new ImageView(loadImage("playpng")));
}
}
private void stopPlay(ActionEvent event) {
MediaPlayer player = mediaViewgetMediaPlayer();
if (player == null) {
return;
}
playerstop();
}
// private void processSliderClicked(MouseEvent event) {
// Slider slider = (Slider) eventgetSource();
// if (mediaViewgetMediaPlayer() != null) {
// Duration d = mediaViewgetMediaPlayer()getTotalDuration()multiply(slidergetValue() / slidergetMax());
// mediaViewgetMediaPlayer()seek(d);
// }
// }
private void processSliderChanged(ObservableValue< extends Number> observable, Number oldValue, Number newValue) {
Slider slider = (Slider) ((ReadOnlyProperty< extends Number>) observable)getBean();
if (slidergetUserData() == AUTO) { // 进度条是自动改变的,因此不用设置播放器
slidersetUserData(null);
return;
}
if (mediaViewgetMediaPlayer() != null) {
slidersetUserData(MANUAL);
Duration d = mediaViewgetMediaPlayer()getTotalDuration()multiply(newValuedoubleValue() / slidergetMax());
mediaViewgetMediaPlayer()seek(d);
}
}
private void mediaProcessChanged(ObservableValue< extends Duration> observable, Duration oldValue, Duration newValue) {
if (processSlidergetUserData() == MANUAL) { // 手动点击进度条
processSlidersetUserData(null);
return;
}
MediaPlayer player = (MediaPlayer) ((ReadOnlyProperty< extends Duration>) observable)getBean();
processSlidersetUserData(AUTO);
processSlidersetValue(newValuetoMillis() / playergetTotalDuration()toMillis() 100);
}
}
总体来说Swing更稳定,资料更丰富, JavaFX更强大:
一:JavaFX设计思路比较好, 界面和控制逻辑分开, 类似于网页,方便程序员和美术一起协作 也方便修改
FXML文件类似于html ,里面放的是 控件和布局
css 文件 就几乎完全一样了, 里面存放的样式 ,用于修饰 控件的外观 比如换肤功能,只需要切换一下css文件即可
Controllerjava文件, 类似于JavaScript ,主要用于行为的控制, 比如点击按钮后的响应等
二:JavaFX组件更丰富 比如DatePicker,TreeTableView,Pagination,HTMLEditor,ProgressIndicator 等等特别是WebView 支持html5
三: JavaFX 可以很简单的实现3D效果, 动画, 特效等,
四: JavaFX 支持属性的绑定, 可以更方便的把事件和界面联系在一起,比如 滑块的值,和正方形的边长进行绑定,这样拉动滑块,就可以自动改变正方形的变长, 非常的简洁
五: JavaFX 有原生图表,并且比较美观
六: JavaFX 对多媒体提供了支持, 播放音乐,视频 也是很简单的
当然JavaFX 也还是存在一些问题的,
Swing资料非常丰富, 而JavaFX资料相对较少 Swing可以使用纯Java开发, JavaFX 还需要了解下css , xml 等,学习成本稍高
JavaFX的可视化开发工具SceneBuilder ,个人觉得还不太稳定
JavaFX的异常处理机制不太完美,很多时候抛出的异常不能准确定位, debug需要耗费一些时间
以上就是关于Java中observablevalue是什么全部的内容,包括:Java中observablevalue是什么、JAVA也可以用于图像的设计吗、javaFX是干嘛的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)