- 浏览: 200344 次
- 性别:
- 来自: 湖南
文章分类
最新评论
-
kongyumi:
电话18800163600
初学certificate -
kongyumi:
解压密码多少?求告知
初学certificate -
船到桥头自然沉:
初学certificate -
笑海人胜:
...
JavaFX学习之Preloader -
kanjiantaiyang:
引用[img][/img][url][/url][b][/b] ...
security
代码老外的,学习学习
该代码主要功能是通过JavaFX的concurrent实现异步的数据库操作。
代码里是通过java的多线程执行task,并不是通过javafx的service。代码很简单通过二个task,一个初始化数据库,一个查询数据库。结果返回显示。
没想到过task.getValue()既是call的返回值,学习到了。
该代码主要功能是通过JavaFX的concurrent实现异步的数据库操作。
package h2app; import java.sql.*; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.*; import javafx.application.Application; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.collections.*; import javafx.concurrent.Task; import javafx.concurrent.WorkerStateEvent; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.layout.*; import javafx.stage.Stage; public class H2Tasks extends Application { private static final Logger logger = Logger.getLogger(H2Tasks.class .getName()); private static final String[] SAMPLE_NAME_DATA = { "John", "Jill", "Jack", "Jerry" }; public static void main(String[] args) { launch(args); } // executes database operations concurrent to JavaFX operations. private ExecutorService databaseExecutor; // the future's data will be available once the database setup has been // complete. private Future databaseSetupFuture; // initialize the program. // setting the database executor thread pool size to 1 ensures // only one database command is executed at any one time. @Override public void init() throws Exception { databaseExecutor = Executors.newFixedThreadPool(1, new DatabaseThreadFactory()); // run the database setup in parallel to the JavaFX application setup. DBSetupTask setup = new DBSetupTask(); databaseSetupFuture = databaseExecutor.submit(setup); } // shutdown the program. @Override public void stop() throws Exception { databaseExecutor.shutdown(); if (!databaseExecutor.awaitTermination(3, TimeUnit.SECONDS)) { logger.info("Database execution thread timed out after 3 seconds rather than shutting down cleanly."); } } // start showing the UI. @Override public void start(Stage stage) throws InterruptedException, ExecutionException { // wait for the database setup to complete cleanly before showing any // UI. // a real app might use a preloader or show a splash screen if this // was to take a long time rather than just pausing the JavaFX // application thread. databaseSetupFuture.get(); final ListView<String> nameView = new ListView(); final ProgressIndicator databaseActivityIndicator = new ProgressIndicator(); databaseActivityIndicator.setVisible(false); final Button fetchNames = new Button("Fetch names from the database"); fetchNames.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { fetchNamesFromDatabaseToListView(fetchNames, databaseActivityIndicator, nameView); } }); final Button clearNameList = new Button("Clear the name list"); clearNameList.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { nameView.getItems().clear(); } }); VBox layout = new VBox(10); layout.setStyle("-fx-background-color: cornsilk; -fx-padding: 15;"); layout.getChildren().setAll( HBoxBuilder .create() .spacing(10) .children(fetchNames, clearNameList, databaseActivityIndicator).build(), nameView); layout.setPrefHeight(200); stage.setScene(new Scene(layout)); stage.show(); } private void fetchNamesFromDatabaseToListView(final Button triggerButton, final ProgressIndicator databaseActivityIndicator, final ListView listView) { final FetchNamesTask fetchNamesTask = new FetchNamesTask(); triggerButton.setDisable(true); databaseActivityIndicator.setVisible(true); databaseActivityIndicator.progressProperty().bind( fetchNamesTask.progressProperty()); //进度条绑定任务 fetchNamesTask.setOnSucceeded(new EventHandler<WorkerStateEvent>() { //task的成功执行事件 @Override public void handle(WorkerStateEvent t) { listView.setItems(fetchNamesTask.getValue()); //task.getValue()获取task.call()方法返回的值 } }); fetchNamesTask.runningProperty().addListener( new ChangeListener<Boolean>() { @Override public void changed( ObservableValue<? extends Boolean> observable, Boolean wasRunning, Boolean isRunning) { if (!isRunning) { triggerButton.setDisable(false); databaseActivityIndicator.setVisible(false); } }; }); databaseExecutor.submit(fetchNamesTask); } abstract class DBTask<T> extends Task<T> { DBTask() { setOnFailed(new EventHandler<WorkerStateEvent>() { @Override public void handle(WorkerStateEvent t) { logger.log(Level.SEVERE, null, getException()); } }); } } class FetchNamesTask extends DBTask<ObservableList<String>> { @Override protected ObservableList<String> call() throws Exception { // artificially pause for a while to simulate a long running // database connection. Thread.sleep(1000); Connection con = getConnection(); return fetchNames(con); } private ObservableList<String> fetchNames(Connection con) throws SQLException { logger.info("Fetching names from database"); ObservableList<String> names = FXCollections.observableArrayList(); Statement st = con.createStatement(); ResultSet rs = st.executeQuery("select name from employee"); while (rs.next()) { names.add(rs.getString("name")); } logger.info("Found " + names.size() + " names"); return names; } } class DBSetupTask<Void> extends DBTask { @Override protected Void call() throws Exception { Connection con = getConnection(); if (!schemaExists(con)) { createSchema(con); populateDatabase(con); } return null; } private boolean schemaExists(Connection con) { logger.info("Checking for Schema existence"); try { Statement st = con.createStatement(); st.executeQuery("select count(*) from employee"); logger.info("Schema exists"); } catch (SQLException ex) { logger.info("Existing DB not found will create a new one"); return false; } return true; } private void createSchema(Connection con) throws SQLException { logger.info("Creating schema"); Statement st = con.createStatement(); String table = "create table employee(id integer, name varchar(64))"; st.executeUpdate(table); logger.info("Created schema"); } private void populateDatabase(Connection con) throws SQLException { logger.info("Populating database"); Statement st = con.createStatement(); for (String name : SAMPLE_NAME_DATA) { st.executeUpdate("insert into employee values(1,'" + name + "')"); } logger.info("Populated database"); } } private Connection getConnection() throws ClassNotFoundException, SQLException { logger.info("Getting a database connection"); Class.forName("com.mysql.jdbc.Driver"); return DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&noAccessToProcedureBodies=true", "root", "root"); } static class DatabaseThreadFactory implements ThreadFactory { static final AtomicInteger poolNumber = new AtomicInteger(1); @Override public Thread newThread(Runnable runnable) { Thread thread = new Thread(runnable, "Database-Connection-" + poolNumber.getAndIncrement() + "-thread"); thread.setDaemon(true); return thread; } } }
代码里是通过java的多线程执行task,并不是通过javafx的service。代码很简单通过二个task,一个初始化数据库,一个查询数据库。结果返回显示。
fetchNamesTask.setOnSucceeded(new EventHandler<WorkerStateEvent>() { //task的成功执行事件 @Override public void handle(WorkerStateEvent t) { listView.setItems(fetchNamesTask.getValue()); //task.getValue()获取task.call()方法返回的值 } });
没想到过task.getValue()既是call的返回值,学习到了。
发表评论
-
JavaFX学习之样例9
2013-02-23 16:42 2476该代码说明table的ColumnResizePolicy ... -
JavaFX学习之样例8
2013-02-21 17:31 1750该代码实现一个简单的时钟 package clo ... -
JavaFX学习之样例7
2013-02-21 12:48 3392该代码是个可编辑的table。 import java ... -
JavaFX学习之样例6
2013-02-20 18:54 2586该代码实现的一个最简单的计算器 import java ... -
JavaFX学习之样例5
2013-02-20 14:03 1633该代码主要是timeline和进度条使用 import ... -
JavaFX学习之样例4
2013-02-20 12:23 3108该代码主要是通过键盘和鼠标移动物体 import ja ... -
JavaFX学习之样例3
2013-02-20 11:17 3996该代码主要是针对node的mouseTransparent ... -
JavaFX学习之样例2
2013-02-20 10:19 1660该代码主要是在linechart中移动到点时显示数据内容 ... -
JavaFX学习 过滤table中的数据
2012-12-31 14:45 2056分享中的代码,大多是借鉴或者直接从别人源码中拿过来的,大 ... -
JavaFX学习 自定义分页,工具栏,window
2012-12-14 14:32 2677这是很多都是借鉴别人的。 用Button实现关闭Icon ...
相关推荐
这个"JavaFX学习之样例8"可能是一个教程或示例集合,用于教授如何使用JavaFX来创建一个特定的图形元素,比如时钟。在这个例子中,我们可能将学习如何利用JavaFX的图形和动画功能来构建一个可交互的模拟时钟。 首先...
1. **JavaFX基础知识**:JavaFX提供了一系列的类和API,用于构建图形用户界面(GUI)。它支持2D和3D图形、媒体播放、CSS样式、图表以及复杂的动画效果。 2. **Scene和Stage**:在JavaFX中,`Scene`是应用程序的主要...
运行时还允许你体验官方提供的样例程序,这些样例展示了JavaFX的各种功能,源代码可供学习参考。 在NetBeans环境中配置JavaFX开发环境是另一个关键步骤。JavaFX2.0在Mac系统上的安装提供了更丰富的功能,如高性能...
综上所述,这个压缩包“我的代码样例”提供了丰富的编程实践材料,覆盖了Java API的运用以及完整的图书管理系统开发,对于Java初学者和进阶者都有很大的学习价值。通过分析和学习这些代码,可以提升编程技巧,了解...
在学习JavaFX的过程中,不断尝试、运行样例和构建自己的项目对于掌握JavaFX是非常有帮助的。随着JavaFX 2.0的出现,开发者有了一个功能强大、跨平台的工具来创建高质量的桌面应用程序。通过本教程,你将能够学习到...
总的来说,这个压缩包提供的GUI样例涵盖了基础界面设计、用户认证流程以及基本计算功能的实现,对于学习和掌握GUI编程,尤其是事件驱动编程和用户交互设计,具有很高的参考价值。通过分析和实践这些案例,开发者能够...
学习和使用JFreeChart样例,你可以逐步理解JFreeChart库的工作原理,掌握创建各种复杂图表的方法,并在自己的项目中灵活运用。这对于任何需要在Java环境中处理数据可视化需求的开发者来说,都是一个非常宝贵的资源。
这个名为"java学习和项目中一些典型的应用场景样例代码.zip"的压缩包显然包含了一些Java编程的实际应用示例,旨在帮助学习者理解Java在实际项目中的运用。下面,我们将深入探讨Java的一些关键应用场景和相关知识点。...
本资源“JAVA作业目录及样例”是针对学习Java编程的学生们提供的一份宝贵的参考资料,它包含了Java程序设计实验和半期考试的相关内容,帮助学生理解和实践Java的核心概念。 Java程序设计实验部分通常涉及基本语法、...
【Java学习样例代码】是针对Java编程语言的学习资源,主要包含了各种Java编程示例,旨在帮助初学者或有经验的开发者深入理解Java语言的核心概念和技术。这些代码样例涵盖了从基础语法到高级特性的广泛内容,对于学习...
6. **样例代码**:提供JavaFX示例代码,帮助开发者了解和学习JavaFX API的用法。 7. **语法高亮**:对JavaFX剧本语言(FXML)提供语法高亮和错误检查。 在安装了**e(fx)lipse** 的Eclipse中,用户可以通过“File” ...
9. **Swing和JavaFX**:这两者是Java的GUI库,样例程序可能会创建窗口应用,展示按钮、文本框、菜单等组件的使用。 10. **反射和注解**:反射允许在运行时检查类的信息,注解提供元数据,样例程序会展示它们如何...
这里,我们主要关注的是基于Java的开发样例,如在"learn-java-master"这个项目中,开发者可以学习如何使用Java语言来实现智能家居系统的关键部分。 首先,让我们深入了解一下Java在智能家居中的应用。Java是一种...
总结来说,`WebViewSample`源码是一个学习JavaFX如何集成Web内容的绝佳实例。通过对源码的深入理解和实践,开发者可以掌握如何在JavaFX应用程序中利用`WebView`组件展示丰富的Web内容,并实现与网页的交互。这不仅...
1. **基础语法**:包括数据类型(如整型、浮点型、字符型、布尔型)、变量、常量、运算符、流程控制语句(如if、for、while等)以及方法的定义与调用。 2. **类与对象**:Java是面向对象的编程语言,所以理解类和...
1. **基本语法**: Java的基本语法包括变量声明、数据类型(如int、double、boolean等)、运算符(算术、比较、逻辑等)、控制结构(如if-else、for、while循环)以及方法定义。初学者应掌握这些基础知识,以便编写...
【Chris-Heavner-Portfolio-1:代码样例】是一个与Java编程相关的项目,它展示了开发者克里斯·海夫纳的编程技能和经验。在这个项目中,我们可以期待找到一系列使用Java语言编写的代码示例,可能包括不同领域的应用,...
为了深入理解这个项目,你需要查看源代码,学习其中的类结构、方法实现以及如何通过JavaFX或Swing等库创建图形用户界面。同时,了解如何在Java中实现文件I/O操作,处理系统事件,以及可能涉及的网络通信(如果有的话...
JFreeChart是一个强大的开源库,专门用于生成高质量的2D图表,适用于各种Java应用程序,包括Swing、JavaFX、Applet以及Servlet。本文将深入探讨JFreeChart的基础知识、主要功能以及如何使用它来创建各种类型的图表。...
1. **基础语法**:Java的基础语法是编程的基石,包括数据类型(如整型、浮点型、字符串等)、变量声明、运算符、流程控制(如if语句、for循环、while循环)、方法定义与调用等。这些实例会帮助初学者理解如何在Java...