javafx中怎么手动的触发事件,如树节点的更新事件

javafx中怎么手动的触发事件,如树节点的更新事件,第1张

实现方式:

可以实现采用手动触发事件的方式。

TreeItem<AbstractTreeNode> currentTreeItem = ;//当前发生修改的树节点

currentTreeItemgetValue()setNodeText("abc");

//自动触发修改的事件,使树节点的显示信息能同步修改

EventfireEvent(currentTreeItem, new TreeItemTreeModificationEvent<AbstractTreeNode>(TreeItemvalueChangedEvent(), currentTreeItem, currentTreeItemgetValue()));

构建树节点的显示时自定义渲染方式:

TreeView<AbstractTreeNode> leftNodeTree = new TreeView<AbstractTreeNode>();

leftNodeTreesetCellFactory(new Callback<TreeView<AbstractTreeNode>, TreeCell<AbstractTreeNode>>() {

@Override

public TreeCell<AbstractTreeNode> call(TreeView<AbstractTreeNode> param) {

return new TreeCellImpl();

}

});

public class TreeCellImpl extends TreeCell<AbstractTreeNode> {

@Override

public void updateItem(AbstractTreeNode item, boolean empty) {

superupdateItem(item, empty);

if (empty) {

setText(null);

setGraphic(null);

} else {

setText(itemgetNodeText());

setGraphic(itemgetGraphic());

if (itemgetNodeType()equals(NodeTypeTREE_CONFIG_NODE)) {

setContextMenu(new TreeConfigContextMenu(thisgetTreeView(), thisgetTreeItem(), item));

} else if (itemgetNodeType()equals(NodeTypeTREE_DETAIL_CONFIG_NODE)) {

setContextMenu(new TreeDetailConfigContextMenu(thisgetTreeView(), thisgetTreeItem(), item));

} else if (itemgetNodeType()equals(NodeTypeSHAREDATA_FIELDS_NODE)) {

// setContextMenu(new TreeConfigContextMenu(item));

}

}

}

}

class AbstractTreeNode {

private String nodeId;

private String nodeText;

public String getNodeId() {

return nodeId;

}

public void setNodeId(String nodeId) {

thisnodeId = nodeId;

}

public String getNodeText() {

return nodeText;

}

public void setNodeText(String nodeText) {

thisnodeText = nodeText;

}

主要问题: 和你上一个问题 "javafx显示不出来" 其实是同一类型的错误

因为你通过代码FXMLLoaderload(fxml)加载了界面,已经实例化了组件, 

就不需要你手动去new XxxView出来了   你可以在new MediaView之前,试试下面这行代码

Systemoutprintln(mv==null);//结果是false ,代表mv已经实例化了

如果你去new了 , 那么mv就是新的MediaView, 而并不是程序界面上的MediaView

所以没有画面 但是有声音, 并且声音没有通过鼠标点击,就自动出来了 因为你把代码写到了初始化方法里 initialize

解决办剪切 initialize 方法里的代码  然后粘贴到新的jj方法里

@Override

public void initialize(URL location, ResourceBundle resources) {//初始化,在这个程序里不需要写代码

}

public void jj() { // onMouseClicked="#jj"   mv点击鼠标后,绑定的方法是jj,所以在这里进行播放工作

String mv_URL = getClass()getResource("你的视频mp4")toString();

 Systemoutprintln(mv_URL);

 Media h = new Media(mv_URL);

 MediaPlayer mp = new MediaPlayer(h);

// mv = new MediaView();//删除此行代码

 mvsetMediaPlayer(mp);

 mpplay();

}

效果图

(1)准备工作

1) 安装JDK 6或者JDK 7

2) 安装scala 210x (注意版本)

2)下载Intellij IDEA最新版(本文以IntelliJ IDEA Community Edition 1311为例说明,不同版本,界面布局可能不同)

3)将下载的Intellij IDEA解压后,安装scala插件,流程如下:

依次选择“Configure”–> “Plugins”–> “Browse repositories”,输入scala,然后安装即可

(2)搭建Spark源码阅读环境(需要联网)

一种方法是直接依次选择“import project”–> 选择spark所在目录 –>

“SBT”,之后intellij会自动识别SBT文件,并下载依赖的外部jar包,整个流程用时非常长,取决于机器的网络环境(不建议在windows

下 *** 作,可能遇到各种问题),一般需花费几十分钟到几个小时。注意,下载过程会用到git,因此应该事先安装了git。

第二种方法是首先在linux *** 作系统上生成intellij项目文件,然后在intellij IDEA中直接通过“Open

Project”打开项目即可。在linux上生成intellij项目文件的方法(需要安装git,不需要安装scala,sbt会自动下载)是:在

spark源代码根目录下,输入sbt/sbt gen-idea

注:如果你在windows下阅读源代码,建议先在linux下生成项目文件,然后导入到windows中的intellij IDEA中。

(3)搭建Spark开发环境

在intellij IDEA中创建scala project,并依次选择“File”–> “project structure”

–> “Libraries”,选择“+”,将spark-hadoop

对应的包导入,比如导入spark-assembly_210-090-incubating-hadoop220jar(只需导入该jar

包,其他不需要),如果IDE没有识别scala 库,则需要以同样方式将scala库导入。之后开发scala程序即可:

编写完scala程序后,可以直接在intellij中,以local模式运行,方法如下:

点击“Run”–> “Run Configurations”,在d出的框中对应栏中填写“local”,表示将该参数传递给main函数,如下图所示,之后点击“Run”–> “Run”运行程序即可。

如果想把程序打成jar包,通过命令行的形式运行在spark 集群中,可以按照以下步骤 *** 作:

依次选择“File”–> “Project Structure” –> “Artifact”,选择“+”–>

“Jar” –> “From Modules with

dependencies”,选择main函数,并在d出框中选择输出jar位置,并选择“OK”。

最后依次选择“Build”–> “Build Artifact”编译生成jar包。

1、如果html文件在jar包内,就是在classpath就这样加载

webViewgetEngine()load(WebViewStyleclassgetResource("/com/html/ScriptToJavahtml")toExternalForm());

2、如果html文件在项目之外

File file = new File("Resources/Html/Chat/show/showhtml");

String absolutePath = filegetAbsolutePath();

absolutePath = absolutePathreplace("\\", "/");

if (absolutePathstartsWith("/")) {

webViewgetEngine()load("file:" + absolutePath);

}else {

webViewgetEngine()load("file:/" + absolutePath);

}

3、js调用Java对象

(1)、Java class需要是public

(2)提交实例化java对象和页面加载完再设置

(3)调用

使用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);

}

}

TableView的数据填充,需要一个ObservableList。其中需要一个类来做数据填充。

下面看看我们数据填充的类:

复制代码代码如下:

import javafxbeanspropertySimpleDoubleProperty;

import javafxbeanspropertySimpleStringProperty;

/

@author wing

/

public final class DownloadData {

private final SimpleStringProperty fileName = new SimpleStringProperty();

private final SimpleStringProperty status = new SimpleStringProperty();

private final SimpleStringProperty dlSpeed = new SimpleStringProperty();

private final SimpleDoubleProperty progress = new SimpleDoubleProperty();

private final SimpleStringProperty downloadSize = new SimpleStringProperty();

private final SimpleStringProperty dlPercent = new SimpleStringProperty();

private String uuid;

public DownloadData(String filename, double progress) {

setFileName(filename);

setProgress(progress);

}

public DownloadData(String status, String filename, String dlSpeed, double progress) {

setStatus(status);

setFileName(filename);

setDlSpeed(dlSpeed);

setProgress(progress);

}

/

@return the fileName

/

public String getFileName() {

return fileNameget();

}

/

@param fileName the fileName to set

/

public void setFileName(String fileName) {

thisfileNameset(fileName);

}

public SimpleStringProperty fileNameProperty(){

return fileName;

}

/

@return the status

/

public String getStatus() {

return statusget();

}

/

@param status the statusto set

/

public void setStatus(String status) {

thisstatusset(status);

}

public SimpleStringProperty statusProperty(){

return status;

}

/

@return the String

/

public String getDlSpeed() {

return dlSpeedget();

}

/

@param dlSpeed the dlSpeed to set

/

public void setDlSpeed(String dlSpeed) {

thisdlSpeedset(dlSpeed);

}

public SimpleStringProperty dlSpeedProperty(){

return dlSpeed;

}

/

@return the progress

/

public double getProgress() {

return progressget();

}

/

@param progress the progress to set

/

public void setProgress(double progress) {

thisprogressset(progress);

}

public SimpleDoubleProperty progressProperty(){

return progress;

}

public String getDownloadSize() {

return downloadSizeget();

}

public void setDownloadSize(String downloadSize) {

thisdownloadSizeset(downloadSize);

}

public SimpleStringProperty downloadSizeProperty(){

return downloadSize;

}

public String getDlPercent() {

return dlPercentget();

}

public void setDlPercent(String dlPercent) {

thisdlPercentset(dlPercent);

}

public SimpleStringProperty dlPercentProperty(){

return dlPercent;

}

public String getUUID() {

return uuid;

}

public void setUUID(String uuid) {

thisuuid = uuid;

}

}

记住,用作数据填充的类,一定要用JavaFX的Property机制,可以进行数据绑定,这样在我们改变ObservableList的时候,TableView的数据才会实时刷新。

复制代码代码如下:

private final ObservableList<DownloadData> data

= FXCollectionsobservableArrayList();

ObservableList<TableColumn> observableList = mDownloadTablegetColumns();

observableListget(0)setCellValueFactory(new PropertyValueFactory("status"));

observableListget(1)setCellValueFactory(new PropertyValueFactory("fileName"));

observableListget(2)setCellValueFactory(new PropertyValueFactory("dlSpeed"));

observableListget(3)setCellValueFactory(new PropertyValueFactory("downloadSize"));

observableListget(4)setCellValueFactory(new PropertyValueFactory("progress"));

observableListget(4)setCellFactory(ProgressBarTableCellforTableColumn());

observableListget(5)setCellValueFactory(new PropertyValueFactory("dlPercent"));

mDownloadTablesetItems(data);

我们通过TableViewgetColumns来获取TableView的所有列。

CellValueFactory指的是TableView每一列里填充的数据。我们这里简单的使用PropertyValueFacotry。后面的要对应你DownloadData中的Property属性名。

CellFactory我们可以指定TableView中某一个Cell的视图类型。大家可以看到我用到了个ProgressBar。

另外CellFactory,JavaFX中自带部分的CellFactory,详细的大家可以在javafxscenecontrolcell包中找到。

接着我们通过创建DownloadData,设置数据,并添加到ObservableList中即可。

JavaFX

在2007JavaOne会议上,Sun负责软件业务的执行副总裁格林公布了JavaFX Script:一种用于编写能够在支持Java的PC和手机上运行的应用软件的更简单的脚本语言。为了解决手机的兼容性问题JavaFX Mobile是一种面向手机厂商、提高Java应用软件在不同手机间兼容性的软件包。

Java包含了一种计算机编程语言和一个平台。

Java编程语言是一种高级语言。由Sun微系统公司(Sun Macrosystem)发布,并作为一种开放的标准进行提供。

Java平台包括了Java虚拟机和Java应用程序接口(API)。

Java将原程序编译成字节码(bytecode),并通过Java虚拟机(JVM)解释字节码的方式来执行。因为这种运行方式,只要针对不同的计算机平台准备相应的Java虚拟机,就可以很方便的实现Java语言的跨平台性。因此,Java非常适合于企业网络和Internet环境,现在已成为Internet中最受欢迎、最有影响的编程语言之一。 Java有许多值得称道的优点,如简单、面向对象、分布式、解释性、可靠、安全、结构中立性、可移植性、高性能、多线程、动态性等。

Java的主要应用有如下几点:

利用浏览器中的Java虚拟机运行于客户端的Applet。

利用本地虚拟机运行的Java应用程序,通常利用Swing或SWT等来编写跨平台的GUI界面系统。

通过编写Servlet/JSP来提供网络服务,运行于网络应用程序服务器中。

利用嵌入式Java虚拟机运行于手机等移动设备的Java应用程序,使用J2ME API。

Java的产生

Java来自于Sun公司的一个叫Green的项目,其原先的目的是为家用消费电子产品开发一个分布式代码系统,这样我们可以把E-mail发给电冰箱、电视机等家用电器,对它们进行控制,和它们进行信息交流。开始,准备采用C++,但C++太复杂,安全性差,最后基于C++开发一种新的语言Oak(Java的前身),Oak是一种用于网络的精巧而安全的语言,Sun公司曾依此投标一个交互式电视项目,但结果是被SGI打败。可怜的Oak几乎无家可归,恰巧这时MarkArdreesen开发的Mosaic和Netscape启发了Oak项目组成员,他们用Java编制了HotJava浏览器,得到了Sun公司首席执行官ScottMcNealy的支持,触发了Java进军Internet。

Java的取名也有一个趣闻,有一天,几位Java成员组的会员正在讨论给这个新的语言取什么名字,当时他们正在咖啡馆喝着Java(爪哇)咖啡,有一个人灵机一动说就叫Java怎样,得到了其他人的赞赏,于是,Java这个名字就这样传开了。

Java平台根据API和使用领域,主要分为三种技术

Java SE (旧称J2SE) - Java Platform, Standard Edition, 定位在客户端,主要用于桌面应用软件的编程

Java EE (旧称J2EE) - Java Platform, Enterprise Edition, 定义在服务器端Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统

Java ME (旧称J2ME) - Java Platform, Micro Edition, 主要应用于嵌入式系统开发,如手机和PDA的编程

Java的特色

Java从1995年的暑假开始在计算机业界就受到了高度注意,特别是在Internet和多 媒体(Multimedia)相关产品类方面。Java是

是一种软件技术

是一种由美国SUN计算机公司(Sun Microsystems, Inc)所研究而成的语言

是一种为 Internet发展的计算机语言

是一种使网页(Web Page)产生生动活泼画面的语言

是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言

是一种语言,用以产生「小应用程序(Applet(s))」

是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能

是一种将安全性(Security)列为第一优先考虑的语言

是一种使用者不需花费很多时间学习的语言

是一种突破用户端机器环境和CPU结构的语言

是一种「写一次,即可在任何机器上执行(Write OnceRun Anywhere)」的语言是有史以来,第一套允 使用者将应用程序(Applications)通过Internet从远端的服务器(Remote Server)传输到本地端的

以上就是关于javafx中怎么手动的触发事件,如树节点的更新事件全部的内容,包括:javafx中怎么手动的触发事件,如树节点的更新事件、javafx mediaview 有声音没图像、最新版IntelliJ IDEA旗舰版 + JDK10最新版,创建javafx项目后很多javafx的包不能导入。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9617704.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存