实现方式:
可以实现采用手动触发事件的方式。
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方法里
@Overridepublic 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的包不能导入。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)