JavaFX目前是JDK8自带的一套UI框架(jfxrt.jar),相比AWT和SWING,它的文档相对更完整完善了,控件使用更为清晰简单,最重要的是作为Java客户端UI开发框架他和CSS兼容,作出的界面更为美观符合潮流。
oracle上有专门的DEMO程序(库)、API、控件css说明等比较详细的文档和下载。https://docs.oracle.com/javase/8/javafx/api/javafx/scene/doc-files/cssref.html。
以下是自学的示例UI程序:
package com.merrick.japanese; import java.util.ArrayList; import java.util.List; import java.util.Random; import javafx.application.Application; import javafx.geometry.Side; import javafx.scene.Scene; import javafx.scene.control.Tab; import javafx.scene.control.TabPane; import javafx.stage.Stage; public class JaToCnFx extends Application { /** * 控件 * */ private TabPane frametab; private Tab jatocntab; private Tab cntojatab; /** * 方法 * */ @Override public void start(Stage stg) throws Exception { frametab = new TabPane(); frametab.setPrefSize(800, 475); frametab.setMinSize(TabPane.USE_PREF_SIZE, TabPane.USE_PREF_SIZE); frametab.setMaxSize(TabPane.USE_PREF_SIZE, TabPane.USE_PREF_SIZE); frametab.setSide(Side.TOP); frametab.setRotateGraphic(false); frametab.setTabClosingPolicy(TabPane.TabClosingPolicy.UNAVAILABLE); jatocntab = new Tab(); jatocntab.setText("「日本語」->「中国語」"); jatocntab.setStyle("-fx-font-size: 15px;"); cntojatab = new Tab("【中文】->【日文】"); cntojatab.setStyle("-fx-font-size: 15px;"); frametab.getTabs().add(jatocntab); frametab.getTabs().add(cntojatab); JaToCnTab jtc = new JaToCnTab(); jatocntab.setContent(jtc.createJAtoCNpane()); CnToJaTab ctj = new CnToJaTab(); cntojatab.setContent(ctj.createCNtoJApane()); //Scene sc = new Scene(gp,800,475); Scene sc = new Scene(frametab,800,475); /**CSS样式加入*/ sc.getStylesheets().add(JaToCnFx.class.getResource("/com/merrick/japanese/fx.css").toExternalForm()); stg.setTitle("Vocabulary Translation test"); stg.setScene(sc); stg.show(); } public static void main(String[] args) { launch(args); } public static List<Integer> getRandomIntsSerialNoRepeated(int maxelem) { /*** * 生成随机序列,不重复(和初始集合内容顺序有关) * */ int size = maxelem; List<Integer> tmplst = new ArrayList<Integer>(); int rx = 0; Random rn = new Random(); for (int i = 0; i < size; i++) { if(tmplst.size()!=0) { do { rx = rn.nextInt(size); }while(tmplst.contains(rx)); tmplst.add(rx); }else { rx = rn.nextInt(size); tmplst.add(rx); } } return tmplst; } } package com.merrick.japanese; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Properties; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Insets; import javafx.scene.Parent; import javafx.scene.control.Button; import javafx.scene.control.ChoiceBox; import javafx.scene.control.Label; import javafx.scene.control.ProgressBar; import javafx.scene.control.TextField; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.scene.layout.GridPane; import javafx.scene.paint.Color; import javafx.scene.text.Text; public class CnToJaTab { public static final int CURRENT_LESSON_MAX = 9; private boolean onoff = false;//启停按钮状态flag private String currentcn = null;// private int currentlesson = 1; //课程词汇对应编号 private static Properties cntoja = new Properties(); //lesson词汇文件,key:中文,value:日文(已加载,当前) private int testorder = 0; //当前测试的词汇数量 private List<Integer> lst_order = null;//指定lesson,初始生成测试词汇的顺序,和词汇prop文件中行数有关 private String[] keyarr = null;//词汇prop的键值构成的数组 public void loadVocabularyViaLessonnumberCNtoJA(int lesson) { try { cntoja.clear(); cntoja.load(JaToCnFx.class.getResourceAsStream("/com/merrick/chinese/props/lessoncn"+ String.valueOf(lesson) +".properties")); } catch (IOException e) { System.err.println(e.toString()); } } public Parent createCNtoJApane() { GridPane gp = new GridPane(); gp.setHgap(15); gp.setVgap(15); gp.setPadding(new Insets(35,35,35,35)); //构建中到测试页面控件 Text title = new Text("Show Chinese, fill Japanese:"); //题头 控件 title.setStyle("-fx-fill:linear-gradient(to top left, blue,red );-fx-font-size: 15px;"); Label lb_lesson = new Label("Choose Lesson:");//下拉框标签 lb_lesson.setStyle("-fx-font-weight:bold;-fx-font-size:13px;"); ChoiceBox<String> cb_lesson = new ChoiceBox<String>(); //下拉框控件 cb_lesson.setPrefWidth(100); ArrayList<String> items = new ArrayList<String>(); for (int i = 1; i <= CURRENT_LESSON_MAX; i++) { items.add(String.valueOf(i)); } cb_lesson.getItems().addAll(items);//可见内容 cb_lesson.getSelectionModel().select(currentlesson-1);//初始 cb_lesson.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() { @Override public void changed(ObservableValue<? extends Number> arg0, Number oldval, Number newval) { currentlesson = newval.intValue() + 1; } }); Button btn_start = new Button("Press to Start Lesson ");//开始按钮控件 Label cnname = new Label("Chinese:"); //当前中文的标签 Text cntxt = new Text(); //当前中文(动态)控件 cntxt.setStyle("-fx-font-weight:bold;-fx-font-size:13px;"); cntxt.setText(""); Label input = new Label("Input:"); //输入框标签 final TextField inputtxt = new TextField();//中文输入框控件 inputtxt.setMinWidth(150); inputtxt.setMinSize(330, 15); input.setStyle("-fx-font-size:15px;"); Button btn_valid = new Button("Validate");//验证按钮控件 Label lb_prog = new Label("Progress:");//下拉框标签 ProgressBar prog = new ProgressBar(0);//进度控件 prog.setPrefWidth(200); final Text msgtxt_current = new Text(); //状态提示文字文本控件 msgtxt_current.setText(""); //msgtxt_current.setStyle("-fx-font-weight:bold;-fx-font-size:15px;"); final Text msgtx_torf = new Text(); //正确与否提示控件 final Text msgtxt_correct = new Text(); //正确结果展示控件 msgtxt_correct.setStyle("-fx-font-weight:bold;-fx-font-size:15px;"); EventHandler<ActionEvent> starttestAction = (ActionEvent event)->{ loadVocabularyViaLessonnumberCNtoJA(currentlesson); testorder= 0; lst_order = JaToCnFx.getRandomIntsSerialNoRepeated(cntoja.size()); keyarr = cntoja.keySet().toArray(new String[0]); getspecifiedVocabulary(currentlesson,cntoja.size(), testorder); cntxt.setText(currentcn); msgtxt_current.setText(" [LESSON "+currentlesson +", TOTAL:"+cntoja.size()+",CURRENT:"+(testorder)+"]");// prog.setProgress(1.0*testorder/cntoja.size()); onoff = !onoff; if(onoff) { btn_start.setText("Going......"); }else { btn_start.setText("Press to Start Lesson "); //"Lesson Start" msgtxt_current.setText(""); cntxt.setText(""); } }; btn_start.setOnAction(starttestAction); EventHandler<ActionEvent> validaction = (ActionEvent event)->{ String userinput = inputtxt.getText(); String rightvalue = null; String key = currentcn; if (key==null) return; rightvalue = (String) cntoja.get(key);//特定map获取答案 if(userinput.equals(rightvalue)) { msgtx_torf.setFill(Color.GREEN); msgtx_torf.setText("CORRECT INPUT."); }else { msgtx_torf.setFill(Color.RED); msgtx_torf.setText("WRONG INPUT: " + userinput ); } msgtxt_correct.setText("[正确的结果]: "+key+"<====>"+ rightvalue); getspecifiedVocabulary(1,cntoja.size(),testorder); msgtxt_current.setText(" [LESSON "+currentlesson +", TOTAL:"+cntoja.size()+",CURRENT:"+(testorder)+"]"); prog.setProgress(1.0*testorder/cntoja.size()); cntxt.setText(currentcn); inputtxt.clear(); }; btn_valid.setOnAction(validaction); inputtxt.setOnKeyPressed(new EventHandler<KeyEvent>() {//输入框响应回车键 @Override public void handle(KeyEvent kev) { if(kev.getCode() == KeyCode.ENTER) { validaction.handle((ActionEvent) btn_valid.getOnKeyPressed()); } } }); gp.add(title, 0, 0, 3, 1); gp.add(lb_lesson, 0, 1, 1, 1); gp.add(cb_lesson, 1, 1, 1, 1); gp.add(btn_start, 2, 1, 1, 1); gp.add( cnname, 0, 2, 1, 1); gp.add( cntxt, 1, 2, 1, 1); gp.add( input, 0, 3, 1, 1); gp.add( inputtxt, 1, 3, 1, 1); gp.add( btn_valid, 2, 3, 1, 1); gp.add( lb_prog, 0, 4, 1, 1); gp.add( prog, 1, 4, 2, 1); gp.add(msgtxt_current, 0, 5, 3, 1); gp.add(msgtx_torf, 0, 6, 3, 1); gp.add(msgtxt_correct, 0, 7, 3, 1); return gp; } public void getspecifiedVocabulary(int lesson, int len, int order) { if(order>=len) { return; } currentcn = keyarr[lst_order.get(order)]; System.out.println(currentcn); testorder++; } }
相关推荐
JavaFx 应用小实例
JavaFX技巧 (3) JAVAFX技术 (13) JavaFX新闻 (5) JavaFX编程 (12) 吃豆人游戏 (4) 许愿树 (4)
下面小编就为大家带来一篇JavaFX Application应用实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
纯JavaFX API,可让您将Google Maps添加到JavaFX应用程序中,而无需与基础Google Maps JavaScript API进行交互。 GMapsFX需要Java 8 快速开始 建立框架 $ mvn install 运行示例应用程序 $ mvn exec:java 发展须知 ...
本实例是由JavaFX技术开发的一个简单学习系统,JavaFX开发的桌面应用布局很好设计!
一、课程简介这是『Java学习指南系列』的第20篇教程 ,是Java开发的高级课程,介绍JavaFX的高级技术。JavaFX教程分为两篇:JavaFX入门篇,JavaFX高级篇。本篇课程的主要以实例为主,穿插必要的理论章节。以实际工程...
基于安卓的音频播放器基于安卓的音频播放器javafx2.0,java,javafx,例子,代码 Sun公司(已于20092008年12月05日发布了JavaFX技术的正式版,它使您能利用 JavaFX 编程语 言开发富互联网应用程序(RIA)。JavaFX ...
学习Java和Oracle和Java开发人员社区推荐的在生产环境中与JavaFX应用程序一起使用的模式。 尽管该工具目前处于有用状态,但在接下来的几个月中将添加大量功能(和文档)。 笔记 该项目最初是由IntelliJ 13中的...
一、课程简介 这是『Java学习指南系列』的第19篇教程 ,是Java开发的高级课程,介绍JavaFX的...〖网站开发系列〗:包含网页基础、网站入门、数据库、网站中级、FreeMarker、网站高级、项目应用、MyBatis、Redis等课程。
在具有 JPA 持久性和 iPOJO 注入的 OSGi felix 容器中运行 JavaFX 2 的应用程序示例。 view - 主要的 JavaFX 视图模块,包含一个用于管理 Persosn 的视图。 核心 - 定义视图使用的模型、persistence.xml 和服务...
近年来RIA技术日趋成熟并开始得到广泛应用,继RIA先驱Adobe Flex之后,微软和Sun相继推出Silverlight和JavaFX来参与和拓展RIA的应用和市场。基于JavaScript的AJAX开源平台,如Dojo Toolkit,也将JavaScript于RIA领域...
用相同的名称重新实现Java应用程序。 该选项卡也是使用Python模块的开始,因为选项卡是文件中特定模块的实例。 这与我用于Java版本的基本设计相同,但是实现细节完全不同。 学习如何在Python中达到与Java和JavaFX...
## Building但是,如果您要自己构建它,请记住,它是针对我们的设置进行了大量自定义的(运行Linux的Amazon EC2实例,运行PostgreSQLAmazon RDS和用于发送电子邮件的SendGrid)。 ####先决条件 包含JavaFX的Java ...
Java3D,算是比较古老的技术,Java8中Oracle对JavaFX支持了Java3D. 相关资料参照Oracle官网 环境...实例应用:创建3D直线 代码如下:package com.java3d.dennist.study; import javax.media.j3d.Appearance;import jav
消息传递框架和一个简单的聊天应用程序重要的这不是...聊天应用“聊天客户端”模块是使用JavaFX构建的聊天应用程序。 它使用“ messaging-client”库与正在运行的“ messaging-server”实例进行通信。 它使用PUB连接将
该应用程序基于Apache Jena(Apache许可证v2.0),TopBraid SHACL API(Apache许可证v2.0)和JAVAFX(GPLv2 + CE许可证)。 CimPal通过提供工具简化与SHACL约束有关的工作以及识别不同版本的CIM之间的更改来帮助CIM...
TRex无状态GUI应用程序是基于JavaFX的应用程序。 该应用程序的主要功能可以分为树状部分(TRex管理,流量配置文件管理和数据包制作工具): TRex管理 主要特点 这是在线部分,您需要连接到TRex才能执行以下操作: ...
同时,我们旨在为您简要介绍JavaFX。Java FX Java FX是用于交付UI桌面应用程序的软件框架。 它是Java Swing的最新替代品。 该演示项目的灵感来自。问题跟踪为了演示完整的敏捷工作流,我们创建了一个Jira实例,您...
同时,我们旨在为您简要介绍JavaFX。 Java FX Java FX是用于交付UI桌面应用程序的软件框架。 它是Java Swing的最新替代品。 该演示项目的灵感来自。 问题跟踪 为了演示完整的敏捷工作流,我们创建了一个Jira实例,...
同时,我们旨在为您简要介绍JavaFX。 Java FX Java FX是用于交付UI桌面应用程序的软件框架。它是Java Swing的最新替代品。该演示项目的灵感来自。 问题跟踪 为了演示完整的敏捷工作流,我们创建了一个Jira实例,您...