`

JavaFX应用举例

阅读更多

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 应用小实例

    JavaFX 实例教程(CHM)

    JavaFX技巧 (3) JAVAFX技术 (13) JavaFX新闻 (5) JavaFX编程 (12) 吃豆人游戏 (4) 许愿树 (4)

    JavaFX Application应用实例

    下面小编就为大家带来一篇JavaFX Application应用实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    GMapsFX:在JavaFX应用程序中使用Google Maps的Java API

    纯JavaFX API,可让您将Google Maps添加到JavaFX应用程序中,而无需与基础Google Maps JavaScript API进行交互。 GMapsFX需要Java 8 快速开始 建立框架 $ mvn install 运行示例应用程序 $ mvn exec:java 发展须知 ...

    JavaFX例子程序

    本实例是由JavaFX技术开发的一个简单学习系统,JavaFX开发的桌面应用布局很好设计!

    Java学习指南20 JavaFX高级

    一、课程简介这是『Java学习指南系列』的第20篇教程 ,是Java开发的高级课程,介绍JavaFX的高级技术。JavaFX教程分为两篇:JavaFX入门篇,JavaFX高级篇。本篇课程的主要以实例为主,穿插必要的理论章节。以实际工程...

    基于安卓的音频播放器基于安卓的音频播放器javafx2.0官方例子JavaMAIL1.6JavaMAIL1.6anylogic

    基于安卓的音频播放器基于安卓的音频播放器javafx2.0,java,javafx,例子,代码 Sun公司(已于20092008年12月05日发布了JavaFX技术的正式版,它使您能利用 JavaFX 编程语 言开发富互联网应用程序(RIA)。JavaFX ...

    XRD-Data-Analysis-Utilities:一个应用程序(在JavaFX中),用于查看MAR Tiff数据,跟踪样本之间的变化以及计算选定组的X射线衍射图

    学习Java和Oracle和Java开发人员社区推荐的在生产环境中与JavaFX应用程序一起使用的模式。 尽管该工具目前处于有用状态,但在接下来的几个月中将添加大量功能(和文档)。 笔记 该项目最初是由IntelliJ 13中的...

    Java学习指南19 JavaFX入门

    一、课程简介 这是『Java学习指南系列』的第19篇教程 ,是Java开发的高级课程,介绍JavaFX的...〖网站开发系列〗:包含网页基础、网站入门、数据库、网站中级、FreeMarker、网站高级、项目应用、MyBatis、Redis等课程。

    osgifx:在 OSGi felix 容器中运行 JavaFX 2 的应用程序示例

    在具有 JPA 持久性和 iPOJO 注入的 OSGi felix 容器中运行 JavaFX 2 的应用程序示例。 view - 主要的 JavaFX 视图模块,包含一个用于管理 Persosn 的视图。 核心 - 定义视图使用的模型、persistence.xml 和服务...

    QCon 2009 beijing全球企业开发大会ppt:13.RIA技术在GeoWeb项目中的实际应用

    近年来RIA技术日趋成熟并开始得到广泛应用,继RIA先驱Adobe Flex之后,微软和Sun相继推出Silverlight和JavaFX来参与和拓展RIA的应用和市场。基于JavaScript的AJAX开源平台,如Dojo Toolkit,也将JavaScript于RIA领域...

    pyqt:PyQt工作

    用相同的名称重新实现Java应用程序。 该选项卡也是使用Python模块的开始,因为选项卡是文件中特定模块的实例。 这与我用于Java版本的基本设计相同,但是实现细节完全不同。 学习如何在Python中达到与Java和JavaFX...

    DebtManager:解决鞭打问题的应用

    ## Building但是,如果您要自己构建它,请记住,它是针对我们的设置进行了大量自定义的(运行Linux的Amazon EC2实例,运行PostgreSQLAmazon RDS和用于发送电子邮件的SendGrid)。 ####先决条件 包含JavaFX的Java ...

    Java3D实例之创建空间几何模型的实现方法

    Java3D,算是比较古老的技术,Java8中Oracle对JavaFX支持了Java3D. 相关资料参照Oracle官网 环境...实例应用:创建3D直线 代码如下:package com.java3d.dennist.study; import javax.media.j3d.Appearance;import jav

    messaging-demo

    消息传递框架和一个简单的聊天应用程序重要的这不是...聊天应用“聊天客户端”模块是使用JavaFX构建的聊天应用程序。 它使用“ messaging-client”库与正在运行的“ messaging-server”实例进行通信。 它使用PUB连接将

    CimPal:CimPal是由gridDigIt发布并在EUPL-1.2或更高版本下获得许可的开源Java应用程序。 它通过提供工具简化与SHACL约束有关的工作以及识别不同版本的CIM之间的更改来帮助CIM实施。

    该应用程序基于Apache Jena(Apache许可证v2.0),TopBraid SHACL API(Apache许可证v2.0)和JAVAFX(GPLv2 + CE许可证)。 CimPal通过提供工具简化与SHACL约束有关的工作以及识别不同版本的CIM之间的更改来帮助CIM...

    trex-stateless-gui:TRex无状态GUI

    TRex无状态GUI应用程序是基于JavaFX的应用程序。 该应用程序的主要功能可以分为树状部分(TRex管理,流量配置文件管理和数据包制作工具): TRex管理 主要特点 这是在线部分,您需要连接到TRex才能执行以下操作: ...

    student-manager:学生经理

    同时,我们旨在为您简要介绍JavaFX。Java FX Java FX是用于交付UI桌面应用程序的软件框架。 它是Java Swing的最新替代品。 该演示项目的灵感来自。问题跟踪为了演示完整的敏捷工作流,我们创建了一个Jira实例,您...

    student-manager:http

    同时,我们旨在为您简要介绍JavaFX。 Java FX Java FX是用于交付UI桌面应用程序的软件框架。 它是Java Swing的最新替代品。 该演示项目的灵感来自。 问题跟踪 为了演示完整的敏捷工作流,我们创建了一个Jira实例,...

    studentmanager

    同时,我们旨在为您简要介绍JavaFX。 Java FX Java FX是用于交付UI桌面应用程序的软件框架。它是Java Swing的最新替代品。该演示项目的灵感来自。 问题跟踪 为了演示完整的敏捷工作流,我们创建了一个Jira实例,您...

Global site tag (gtag.js) - Google Analytics