`

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技术来开发功能丰富的应用程序。通过深入理解JavaFX,开发者可以创建具有交互性、动画效果和自定义组件的精美用户界面。 JavaFX提供了丰富的API,包括基本控件...

    JavaFX 8 实例教程

    JavaFX 8实例教程主要介绍了如何使用JavaFX 8来创建富客户端应用程序,提供了一个实际的例子来指导用户。...通过实践和教程中的步骤,开发者可以逐步构建起一个基础的JavaFX应用程序,并理解JavaFX框架的基本工作原理。

    JavaFx 入门文档,JavaFx实例

    舞台是JavaFX应用程序的顶级窗口,它包含了至少一个场景。节点是构成用户界面的基本元素,它们可以是简单的图形元素或复杂的组件。布局则负责管理这些节点的位置和大小,以实现不同的布局策略。 要开始JavaFX的开发...

    spring boot javafx 集成 实例Demo 源码

    6. **测试与运行**:完成上述配置后,可以直接运行主类,Spring Boot会启动并加载JavaFX应用程序。通过源码示例,你可以看到如何将Spring Boot的特性,如依赖注入、配置管理等,应用到JavaFX的实践中。 这个实例...

    javafx 2.0 tableview 实例

    这个"javafx 2.0 tableview 实例"是一个很好的学习资源,它可以帮助开发者了解如何在JavaFX应用程序中有效地使用TableView。 首先,让我们详细了解一下JavaFX中的TableView组件。TableView是一个可定制的数据视图...

    javafx1.3实例

    JavaFX是Oracle公司推出的一种用于创建桌面应用、Web应用以及移动应用的富互联网应用程序(Rich Internet...通过深入分析这个实例,开发者可以更好地理解JavaFX框架的工作原理,并逐步熟练掌握富客户端应用的开发技巧。

    javaFX完整项目案例可用.zip

    JavaFX是一个用于构建桌面、移动和嵌入式设备上的富客户端应用程序的开源框架。它提供了丰富的用户界面组件和强大的2D/3D图形功能,使得开发者可以创建出具有吸引力的图形用户界面。在这个名为"javaFX完整项目案例...

    javaFx2.0 实例

    总的来说,这个JavaFX 2.0实例展示了如何利用其强大的功能创建具有丰富交互性和美观界面的应用程序。从事件处理到数据绑定,再到图形绘制和窗口管理,每个方面都体现了JavaFX的灵活性和易用性。随着更多功能的加入,...

    JavaFX 监听窗口关闭事件实例详解

    开发JavaFX应用程序时,管理窗口的关闭事件是一项重要的任务,特别是在涉及到多线程时。在多线程环境下,如果程序退出时没有正确地关闭后台线程,可能会导致资源未能释放,或者产生数据不一致等问题。因此,在JavaFX...

    JavaFX 构建GUI 应用程序

    ### JavaFX 构建GUI应用程序知识点详解 #### 一、JavaFX GUI简介 **JavaFX** 是一个用于构建丰富的客户端应用程序的平台,特别是在图形用户界面(GUI)领域有着广泛的应用。JavaFX 提供了一套完整的工具和框架,...

    JavaFx2.0入门指南

    开始构建JavaFX应用,你可以选择任何支持Java应用开发的工具,本教程中推荐使用NetBeans IDE。在开始前,确保你使用的NetBeans IDE版本兼容JavaFX 2.0。系统需求和安装步骤可以在Oracle官网找到相应的指导。 以下是...

    javafx11win64.zip

    这些JMODs可以用于构建模块化的JavaFX应用,与Java Platform Module System (JPMS)兼容。 总的来说,这个压缩包提供了一套在Windows上用JavaFX 11开发和运行应用所需的资源,包括SDK、模块文件以及可能的一个基于...

    javafx 2.0 tableView 实例

    JavaFX是Oracle公司推出的用于构建桌面、移动以及云端应用程序的富客户端GUI平台,它扩展了Java语言的功能,提供了丰富的用户界面组件和强大的图形效果。在JavaFX 2.0版本中,`TableView`是一个核心的组件,用于展示...

    MySocialNetwork:JavaFX应用程序

    “我的社交网络”是一个典型的JavaFX应用实例,它涵盖了用户交互、数据管理、网络通信等多个方面,展现了JavaFX的强大功能。通过学习这个项目,开发者可以深入了解如何使用JavaFX构建复杂的桌面应用程序,同时也可以...

    JavaFX 实例教程(CHM)

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

    javaFX高级教程JavaFX2.0的FXML语言 中文文档

    每个 FXML 应用都必须包含一些基本的 JavaFX 代码,至少包括创建舞台、场景以及启动应用程序的代码。下面是一个示例代码: ```java package fxmlexample; import java.util.ResourceBundle; import javafx....

    javafx+mysql新闻发布查询系统(News)

    在JavaFX应用中,可能有一个单独的DAO(Data Access Object)层,用于封装数据库操作,确保数据操作的封装性和可测试性。 【系统实现流程】 1. 用户在JavaFX界面输入查询条件或浏览新闻列表。 2. 点击查询按钮后,...

    JavaFX拖放操作示例

    在这个"JavaFX拖放操作示例"中,我们将深入探讨如何在JavaFX应用程序中实现拖放(Drag and Drop)功能。 拖放操作在用户界面设计中非常常见,它允许用户通过简单的鼠标操作来移动或复制数据。在JavaFX中,实现这一...

    Learn JavaFX 8 源代码

    9. **打包与部署**:JavaFX应用程序可以打包成独立的应用程序,通过JavaFX Packager或现代的JLink和JPackage工具,生成可执行文件,方便在不同平台上运行。 10. **模块系统**:JavaFX 8开始引入模块系统,这使得...

Global site tag (gtag.js) - Google Analytics