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++; } }
相关推荐
python学习资源
jfinal-undertow 用于开发、部署由 jfinal 开发的 web 项目
基于Andorid的音乐播放器项目设计(国外开源)实现源码,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。
python学习资源
python学习资源
python学习一些项目和资源
【毕业设计】java-springboot+vue家具销售平台实现源码(完整前后端+mysql+说明文档+LunW).zip
HTML+CSS+JavaScarip开发的前端网页源代码
python学习资源
【毕业设计】java-springboot-vue健身房信息管理系统源码(完整前后端+mysql+说明文档+LunW).zip
成绩管理系统C/Go。大学生期末小作业,指针实现,C语言版本(ANSI C)和Go语言版本
1_基于大数据的智能菜品个性化推荐与点餐系统的设计与实现.docx
【毕业设计】java-springboot-vue交流互动平台实现源码(完整前后端+mysql+说明文档+LunW).zip
内容概要:本文主要探讨了在高并发情况下如何设计并优化火车票秒杀系统,确保系统的高性能与稳定性。通过对比分析三种库存管理模式(下单减库存、支付减库存、预扣库存),强调了预扣库存结合本地缓存及远程Redis统一库存的优势,同时介绍了如何利用Nginx的加权轮询策略、MQ消息队列异步处理等方式降低系统压力,保障交易完整性和数据一致性,防止超卖现象。 适用人群:具有一定互联网应用开发经验的研发人员和技术管理人员。 使用场景及目标:适用于电商、票务等行业需要处理大量瞬时并发请求的业务场景。其目标在于通过合理的架构规划,实现在高峰期保持平台的稳定运行,保证用户体验的同时最大化销售额。 其他说明:文中提及的技术细节如Epoll I/O多路复用模型以及分布式系统中的容错措施等内容,对于深入理解大规模并发系统的构建有着重要指导意义。
基于 OpenCV 和 PyTorch 的深度车牌识别
【毕业设计-java】springboot-vue教学资料管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip
此数据集包含有关出租车行程的详细信息,包括乘客人数、行程距离、付款类型、车费金额和行程时长。它可用于各种数据分析和机器学习应用程序,例如票价预测和乘车模式分析。
把代码放到Word中,通过开发工具——Visual Basic——插入模块,粘贴在里在,把在硅基流动中申请的API放到VBA代码中。在Word中,选择一个问题,运行这个DeepSeekV3的宏就可以实现在线问答
【毕业设计】java-springboot+vue机动车号牌管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip
【毕业设计】java-springboot-vue交通管理在线服务系统的开发源码(完整前后端+mysql+说明文档+LunW).zip