日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

javafx 示例_JavaFX列表示例

發(fā)布時(shí)間:2023/12/3 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 javafx 示例_JavaFX列表示例 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

javafx 示例

這是使用JavaFX構(gòu)建的示例列表應(yīng)用程序。 該應(yīng)用程序是待辦事項(xiàng)列表。 該應(yīng)用程序具有添加,更新和刪除列表中項(xiàng)目的功能。 列表數(shù)據(jù)存儲(chǔ)在HSQLDB關(guān)系數(shù)據(jù)庫中。 該應(yīng)用程序使用JDBC(Java數(shù)據(jù)庫連接)API訪問數(shù)據(jù)庫。 該應(yīng)用程序打包為可執(zhí)行JAR文件。

JavaFX 2.2,Java SE 7和HSQLDB 2.3.2用于構(gòu)建應(yīng)用程序。



本文詳細(xì)介紹了構(gòu)建應(yīng)用程序。 本文件內(nèi)容:

目錄

1.安裝HSQL數(shù)據(jù)庫
1.1。 關(guān)于HSQLDB 1.2。 下載資料庫
2.創(chuàng)建應(yīng)用數(shù)據(jù)庫和表
2.1。 創(chuàng)建待辦事項(xiàng)數(shù)據(jù)庫 2.2。 創(chuàng)建待辦事項(xiàng)表
3.申請(qǐng)
3.1。 應(yīng)用類別
4.構(gòu)建GUI
4.1。 代碼 4.2。 代碼說明 4.3。 源代碼
5.創(chuàng)建數(shù)據(jù)庫訪問代碼
5.1。 獲取連接 5.2。 獲取所有行 5.3。 插入行 5.4。 檢查Todo名稱是否存在 5.5。 刪除行 5.6。 更新行 5.7。 關(guān)閉數(shù)據(jù)庫 5.8。 源代碼
6.通過數(shù)據(jù)庫訪問連接GUI
6.1。 編碼 6.2。 創(chuàng)建一個(gè)新的待辦事項(xiàng) 6.3。 保存待辦事項(xiàng) 6.4。 刪除或取消待辦事項(xiàng) 6.5。 應(yīng)用啟動(dòng)和關(guān)閉 6.6。 源代碼
7.部署為JAR文件
7.1。 創(chuàng)建可執(zhí)行的JAR文件:todoapp.jar 7.2。 運(yùn)行應(yīng)用
8.下載Java源代碼

1.安裝HSQL數(shù)據(jù)庫

關(guān)于HSQLDB

HSQL關(guān)系數(shù)據(jù)庫用于存儲(chǔ)待辦事項(xiàng)數(shù)據(jù)。 在本節(jié)中–獲取并安裝數(shù)據(jù)庫。

HSQLDB(HyperSQL數(shù)據(jù)庫)是用Java編寫SQL關(guān)系數(shù)據(jù)庫軟件,可在JVM中運(yùn)行。 它是一個(gè)小型,快速的多線程事務(wù)型數(shù)據(jù)庫引擎,具有基于內(nèi)存和基于磁盤的表,并支持嵌入式和服務(wù)器模式。 這包括JDBC驅(qū)動(dòng)程序。

下載資料庫

從網(wǎng)站http://hsqldb.org/上的下載鏈接下載數(shù)據(jù)庫軟件。 在這種情況下,將下載HSQLDB版本2.3.2。 下載的文件是一個(gè)ZIP文件。 將ZIP文件解壓縮到您選擇的任何目錄中。 該ZIP文件被解壓縮到文件夾hsqldb-2.3.2\hsqldb 。 這是主(或安裝)目錄。

這樣就完成了安裝。 已安裝的數(shù)據(jù)庫包含用戶文檔,JDBC驅(qū)動(dòng)程序,數(shù)據(jù)庫可執(zhí)行文件和實(shí)用程序。 安裝目錄具有/doc和/lib目錄(以及其他目錄)。

/doc目錄包含用戶指南。

/lib目錄具有以下常用的JAR文件:

  • hsqldb.jar :它具有數(shù)據(jù)庫引擎,JDBC驅(qū)動(dòng)程序和GUI數(shù)據(jù)庫訪問工具。
  • sqltool.jar :這有一個(gè)SQL命令行數(shù)據(jù)庫訪問工具。

2.創(chuàng)建應(yīng)用數(shù)據(jù)庫和表

創(chuàng)建待辦事項(xiàng)數(shù)據(jù)庫

GUI數(shù)據(jù)庫訪問工具用于創(chuàng)建和訪問數(shù)據(jù)庫。 從DOS命令提示符運(yùn)行以下命令:

> java -cp "X:\JCG\articles\A JavaFX List Example\hsqldb-2.3.2\hsqldb\lib\hsqldb.jar" org.hsqldb.util.DatabaseManagerSwing

注意: hsqldb.jar文件位于類路徑中。
這將打開一個(gè)“ Connect GUI”對(duì)話框,如下所示。

在對(duì)話框中輸入以下信息:

  • 最近的設(shè)置:<現(xiàn)在不選擇任何內(nèi)容。 下次連接數(shù)據(jù)庫時(shí),選擇現(xiàn)在創(chuàng)建的設(shè)置。
  • 設(shè)置名稱:<輸入名稱> todo db設(shè)置
  • 類型:<select> HSQL數(shù)據(jù)庫引擎獨(dú)立
  • 驅(qū)動(dòng)程序:<select> hsqldb.jdbcDriver
  • URL:<輸入數(shù)據(jù)庫文件路徑> jdbc:hsqldb:file:<<文件路徑–有關(guān)指定路徑的更多詳細(xì)信息,請(qǐng)參見下面的注釋>>
  • 用戶:<留空>
  • 密碼:<留空>

關(guān)于URL的文件路徑的注意事項(xiàng):可以將文件路徑指定為相對(duì)路徑或絕對(duì)路徑。 相對(duì)路徑是相對(duì)于當(dāng)前目錄的。 例如,URL中的jdbc:hsqldb:file:db\TODOS_DB將創(chuàng)建一個(gè)名為db的目錄,并在其中創(chuàng)建TODOS_DB數(shù)據(jù)庫。 帶有絕對(duì)路徑的示例是jdbc:hsqldb:file:X:\JCG\articles\A JavaFX List Example\db\TODOS_DB 。

單擊確定。

這將在指定目錄中創(chuàng)建一個(gè)名為TODOS_DB的數(shù)據(jù)庫。 這還將打開“ HSQLDatabase Manager”窗口。 該窗口具有顯示數(shù)據(jù)庫結(jié)構(gòu),SQL條目和結(jié)果詳細(xì)信息的區(qū)域。 窗口如下所示。

2.2創(chuàng)建待辦事項(xiàng)表

待辦事項(xiàng)表具有三列:id,名稱和描述。

  • id:這是數(shù)據(jù)庫系統(tǒng)生成的唯一整數(shù)。 這被定義為IDENTITY列。

IDENTITY列是由數(shù)據(jù)庫的序列生成器自動(dòng)生成的INTEGER。 默認(rèn)情況下,列值從1開始并遞增1。當(dāng)在表中進(jìn)行插入時(shí),將自動(dòng)用新的序列號(hào)填充id列值。 本文后面將顯示用于插入和檢索id列值的語法(請(qǐng)參閱第5章“創(chuàng)建數(shù)據(jù)庫訪問代碼” )。

  • 名稱:定義為VARCHAR(50),不為null。
  • 描述:這被定義為VARCHAR(500)。

在“ HSQLDatabase Manager”窗口中,輸入以下SQL腳本并執(zhí)行它。

CREATE TABLE TODO_TABLE (id INTEGER GENERATED BY DEFAULT AS IDENTITY,name VARCHAR(50) NOT NULL,description VARCHAR(500) );

這將創(chuàng)建待辦事項(xiàng)表。 可以在數(shù)據(jù)庫結(jié)構(gòu)區(qū)域中查看新創(chuàng)建的表。

注意:此步驟需要完成,然后再繼續(xù)。 該應(yīng)用程序的代碼假定已創(chuàng)建數(shù)據(jù)庫和表。

3.申請(qǐng)

待辦事項(xiàng)顯示在列表中,其中每個(gè)待辦事項(xiàng)都是一個(gè)列表項(xiàng)。 在列表中選擇待辦事項(xiàng)時(shí),名稱和描述分別顯示在文本框和文本區(qū)域中。 該數(shù)據(jù)可以編輯。 有一些按鈕可以創(chuàng)建待辦事項(xiàng),刪除和保存。 狀態(tài)消息顯示最近執(zhí)行的操作。

GUI顯示在一個(gè)窗口中。 可從todo數(shù)據(jù)庫訪問列表和文本框/區(qū)域中顯示的數(shù)據(jù)。 該數(shù)據(jù)庫在應(yīng)用程序啟動(dòng)時(shí)打開,在關(guān)閉應(yīng)用程序時(shí)關(guān)閉。

下面顯示了完成的應(yīng)用程序的GUI。

應(yīng)用類別

該應(yīng)用程序包含三個(gè)Java類。

  • Todo.java:此類表示待辦事項(xiàng)。
  • TodoApp.java:此類是具有GUI和程序執(zhí)行邏輯的主要應(yīng)用程序。
  • TodoDataAccess.java:此類具有訪問todo數(shù)據(jù)庫的功能。

3.1.1 Todo.java

待辦事項(xiàng)由Todo.java類表示。 待辦事項(xiàng)具有名稱和描述屬性。 這還將維護(hù)一個(gè)唯一的id字段。

3.1.2 TodoDataAccess.java

此類具有訪問todo數(shù)據(jù)庫和數(shù)據(jù)的功能。 其功能是:

  • 連接并關(guān)閉數(shù)據(jù)庫
  • 插入,更新,刪除,查詢和驗(yàn)證數(shù)據(jù)庫中的數(shù)據(jù)

3.1.3 TodoApp.java

此類是主要的應(yīng)用程序。 它具有啟動(dòng)應(yīng)用程序,關(guān)閉應(yīng)用程序,創(chuàng)建用戶界面以及將GUI和應(yīng)用程序連接到數(shù)據(jù)訪問代碼的功能。

4.構(gòu)建GUI

在此步驟中,將構(gòu)建沒有按鈕的數(shù)據(jù)庫訪問和動(dòng)作事件處理程序的GUI。 僅將列表連接到列表選擇更改偵聽器。

該應(yīng)用程序在列表中顯示一些預(yù)定義的待辦事項(xiàng)數(shù)據(jù)。 可以選擇待辦事項(xiàng)列表,相應(yīng)的待辦事項(xiàng)名稱和說明將顯示在它們各自的文本框/區(qū)域中。

下面顯示了TodoApp.java類的代碼及其說明。

4.1。守則

TodoApp.java:

import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.layout.GridPane; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.scene.layout.AnchorPane; import javafx.scene.text.Font; import javafx.scene.text.FontWeight; import javafx.scene.text.Text; import javafx.scene.paint.Color; import javafx.scene.control.ListView; import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.control.TextArea; import javafx.scene.control.ScrollPane; import javafx.scene.control.ScrollPane.ScrollBarPolicy; import javafx.scene.control.Button; import javafx.scene.control.Tooltip; import javafx.scene.text.Text; import javafx.geometry.Pos; import javafx.geometry.Insets; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import java.util.List; import java.util.ArrayList; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue;public class TodoApp extends Application {private ListView<Todo> listView;private ObservableList<Todo> data;private TextField nametxt;private TextArea desctxt;private Text actionstatus;public static void main(String [] args) {Application.launch(args);}@Overridepublic void start(Stage primaryStage) {primaryStage.setTitle("Todo App - version 1");// gridPane layoutGridPane grid = new GridPane();grid.setAlignment(Pos.CENTER);grid.setHgap(15);grid.setVgap(20);grid.setPadding(new Insets(25, 25, 25, 25));// list view, listener and list datalistView = new ListView<>();listView.getSelectionModel().selectedIndexProperty().addListener(new ListSelectChangeListener());data = getListData();listView.setItems(data);grid.add(listView, 1, 1); // col = 1, row = 1// todo name label and text fld - in a hboxLabel namelbl = new Label("Todo Name:");nametxt = new TextField();nametxt.setMinHeight(30.0);nametxt.setPromptText("Enter todo name (required).");nametxt.setPrefColumnCount(20);nametxt.setTooltip(new Tooltip("Item name (5 to 50 chars length)"));HBox hbox = new HBox();hbox.setSpacing(10);hbox.getChildren().addAll(namelbl, nametxt);// todo desc text area in a scrollpanedesctxt = new TextArea();desctxt.setPromptText("Enter description (optional).");desctxt.setWrapText(true);ScrollPane sp = new ScrollPane();sp.setContent(desctxt);sp.setFitToWidth(true);sp.setFitToHeight(true);sp.setPrefHeight(300);sp.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER);sp.setVbarPolicy(ScrollPane.ScrollBarPolicy.AS_NEEDED);// todo hbox (label + text fld), scrollpane - in a vbox VBox vbox = new VBox();vbox.setSpacing(10);vbox.getChildren().addAll(hbox, sp);grid.add(vbox, 2, 1); // col = 2, row = 1// new and delete buttonsButton newbtn = new Button("New");Button delbtn = new Button("Delete");HBox hbox2 = new HBox(10);hbox2.getChildren().addAll(newbtn, delbtn);grid.add(hbox2, 1, 2); // col = 1, row = 2// save button to the right anchor pane and gridButton savebtn = new Button("Save");AnchorPane anchor = new AnchorPane();AnchorPane.setRightAnchor(savebtn, 0.0);anchor.getChildren().add(savebtn); grid.add(anchor, 2, 2); // col = 2, row = 2// action message (status) textactionstatus = new Text();actionstatus.setFill(Color.FIREBRICK);actionstatus.setText(""); grid.add(actionstatus, 1, 3); // col = 1, row = 3// sceneScene scene = new Scene(grid, 750, 400); // width=750, height=400primaryStage.setScene(scene);primaryStage.show();// initial selection; statement does nothing if no datalistView.getSelectionModel().selectFirst();} // start()private class ListSelectChangeListener implements ChangeListener<Number> {@Overridepublic void changed(ObservableValue<? extends Number> ov, Number old_val, Number new_val) {if ((new_val.intValue() < 0) || (new_val.intValue() >= data.size())) {return; // invalid data} // set name and desc fields for the selected todoTodo todo = data.get(new_val.intValue());nametxt.setText(todo.getName());desctxt.setText(todo.getDesc());actionstatus.setText(todo.getName() + " - selected"); }}private ObservableList<Todo> getListData() {List<Todo> list = new ArrayList<>(); // initial list datalist.add(new Todo("Work", "Work on JCG's example article."));list.add(new Todo("Grocery", "Get apples, milk and bread."));list.add(new Todo("Calls", "Call kid brother."));list.add(new Todo("Read book", "Magnificent Obcession, by Lloyd C. Douglas."));ObservableList<Todo> data = FXCollections.observableList(list);return data;} }

代碼說明

4.2.1 JavaFX類

下面介紹了用于構(gòu)建GUI的JavaFX類:

  • Stage類用于構(gòu)建應(yīng)用程序的主窗口。
  • GridPane用于在行和列的網(wǎng)格中布局控件(按鈕,文本字段等)。
  • HBox和VBox將其子控件布置在單個(gè)水平或垂直行中。
  • ListView用于顯示待辦事項(xiàng)的垂直可滾動(dòng)列表,用戶可以從中進(jìn)行選擇。
  • Label和Text用于待辦事項(xiàng)名稱標(biāo)簽和文本字段。
  • TextArea用于待辦事項(xiàng)描述字段。 該字段放置在ScrollPane ,以便可以滾動(dòng)文本。
  • Button控件用于新建,保存和刪除按鈕。
  • Text用于顯示操作狀態(tài)。

4.2.2控件布局

網(wǎng)格窗格布局具有3行和2列。 放置控件的單元格如下:

  • 第1行第1行具有列表視圖。
  • Todo標(biāo)簽和文本字段位于hbox中。
  • 第1行第2行在vbox中具有hbox和todo描述文本區(qū)域。
  • 第2行第1行在hbox中具有“新建”和“刪除”按鈕。
  • 第2行第2列具有保存按鈕。
  • 第3行第1行有狀態(tài)文本。

4.2.3列表的更改偵聽器

類型為ChangeListener<Number>的列表選擇更改偵聽器已附加到列表視圖:

listView.getSelectionModel().selectedIndexProperty().addListener(new changeListener());

選擇列表項(xiàng)后,該項(xiàng)的待辦事項(xiàng)名稱和說明將顯示在文本字段中。

4.2.4列表數(shù)據(jù)

列表視圖中填充了來自O(shè)bservableList<Todo>集合的數(shù)據(jù)–在應(yīng)用程序的start()方法中:

data = getListData();listView.setItems(data);

在本節(jié)中,將在程序中創(chuàng)建列表的數(shù)據(jù)。 getListData()方法創(chuàng)建待辦事項(xiàng)并將其作為ObservableList <Todo>集合返回。

4.3源代碼

這是應(yīng)用程序的版本1。 新創(chuàng)建了兩個(gè)類。 這些類是:

  • Todo.java
  • TodoApp.java

注意:要編譯代碼并運(yùn)行應(yīng)用程序, jfxrt.jar (JavaFX庫)文件必須位于類路徑中。 對(duì)于Java 7,可以在以下位置找到它: <JRE_HOME>/lib/jfxrt.jar 。

5.創(chuàng)建數(shù)據(jù)庫訪問代碼

待辦事項(xiàng)列表的數(shù)據(jù)是從數(shù)據(jù)庫存儲(chǔ)和訪問的。 TODO_DB數(shù)據(jù)庫中的TODO_TABLE存儲(chǔ)待辦事項(xiàng)詳細(xì)信息。 數(shù)據(jù)庫和表已經(jīng)在前面創(chuàng)建(請(qǐng)參閱2.創(chuàng)建應(yīng)用程序數(shù)據(jù)庫和表一節(jié) )。 請(qǐng)注意,該應(yīng)用假定訪問數(shù)據(jù)庫之前已創(chuàng)建該數(shù)據(jù)庫。

本節(jié)介紹數(shù)據(jù)庫訪問代碼。 TodoDataAccess.java類具有代碼。 此代碼使用JDBC(Java數(shù)據(jù)庫連接)API來訪問TODO_DB數(shù)據(jù)庫。

注意:應(yīng)用程序的GUI在下一節(jié)( 6.使用數(shù)據(jù)庫訪問連接GUI)中連接到數(shù)據(jù)庫訪問。

此類具有以下方法:

  • 連接到todo數(shù)據(jù)庫
  • 關(guān)閉待辦事項(xiàng)數(shù)據(jù)庫
  • 將所有待辦事項(xiàng)表行讀入List集合
  • 在待辦事項(xiàng)表中插入一行
  • 檢查待辦事項(xiàng)表中是否存在待辦事項(xiàng)名稱
  • 從待辦事項(xiàng)表中刪除一行
  • 更新待辦事項(xiàng)表中的一行

下面顯示了TodoDataAccess.java類的代碼和詳細(xì)信息。

5.1獲取連接

構(gòu)造函數(shù)具有訪問數(shù)據(jù)庫并獲取Connection對(duì)象的代碼。 此連接對(duì)象用于讀取或更新數(shù)據(jù)庫數(shù)據(jù)。 連接的屬性設(shè)置為自動(dòng)提交,即,事務(wù)在沒有顯式提交的情況下在插入,更新或刪除時(shí)提交。 連接是可更新的類型。

DriverManager's getConnection()靜態(tài)方法使用URL連接到數(shù)據(jù)庫。

public TodoDataAccess()throws SQLException, ClassNotFoundException {Class.forName("org.hsqldb.jdbc.JDBCDriver" );conn = DriverManager.getConnection("jdbc:hsqldb:file:db/TODOS_DB;ifexists=true;shutdown=true", "", "");conn.setAutoCommit(true);conn.setReadOnly(false);}

5.2獲取所有行

此方法從todo表中檢索所有行,并返回Todo元素的List集合。

public List<Todo> getAllRows()throws SQLException {String sql = "SELECT * FROM " + todoTable + " ORDER BY name";PreparedStatement pstmnt = conn.prepareStatement(sql);ResultSet rs = pstmnt.executeQuery();List<Todo> list = new ArrayList<>();while (rs.next()) {int i = rs.getInt("id");String s1 = rs.getString("name");String s2 = rs.getString("desc");list.add(new Todo(i, s1, s2));}pstmnt.close(); // also closes related result setreturn list; }

5.3插入一行

此方法將一行插入todo表。 該方法返回新的待辦事項(xiàng)行的ID。

id值是數(shù)據(jù)庫系統(tǒng)生成的序列號(hào)。 這是一個(gè)IDENTITY列。 DEFAULT關(guān)鍵字(在INSERT語句中)用于IDENTITY列,這將為該列自動(dòng)生成一個(gè)值。 請(qǐng)參閱第2.2節(jié)。 創(chuàng)建待辦事項(xiàng)表以獲取有關(guān)IDENTITY列創(chuàng)建的詳細(xì)信息。

PreparedStatement's getGeneratedKeys()方法使用新生成的標(biāo)識(shí)列值檢索ResultSet 。

public int insertRow(Todo todo)throws SQLException {String dml ="INSERT INTO " + todoTable + " VALUES (DEFAULT, ?, ?)";PreparedStatement pstmnt = conn.prepareStatement(dml,PreparedStatement.RETURN_GENERATED_KEYS);pstmnt.setString(1, todo.getName());pstmnt.setString(2, todo.getDesc());pstmnt.executeUpdate(); // returns insert count// get identity column valueResultSet rs = pstmnt.getGeneratedKeys();rs.next();int id = rs.getInt(1);pstmnt.close();return id;}

5.4檢查Todo名稱是否存在

此方法檢查待辦事項(xiàng)表中是否已存在待辦事項(xiàng)名稱。 請(qǐng)注意,該應(yīng)用僅允許使用唯一的待辦事項(xiàng)名稱。

public boolean nameExists(Todo todo)throws SQLException {String sql = "SELECT COUNT(id) FROM " + todoTable + " WHERE name = ? AND id <> ?";PreparedStatement pstmnt = conn.prepareStatement(sql);pstmnt.setString(1, todo.getName());pstmnt.setInt(2, todo.getId());ResultSet rs = pstmnt.executeQuery();rs.next();int count = rs.getInt(1);pstmnt.close();if (count > 0) {return true;}return false;}

5.5刪除一行

此方法從給定待辦事項(xiàng)的待辦事項(xiàng)表中刪除一行(如果存在)。 請(qǐng)注意,如果沒有行被刪除,則不會(huì)引發(fā)異常。

public void deleteRow(Todo todo)throws SQLException {String dml = "DELETE FROM " + todoTable + " WHERE id = ?";PreparedStatement pstmnt = conn.prepareStatement(dml);pstmnt.setInt(1, todo.getId());pstmnt.executeUpdate(); // returns delete count (0 for none)pstmnt.close(); }

5.6更新行

此方法使用待辦事項(xiàng)屬性的任何更改來更新待辦事項(xiàng)表中的現(xiàn)有行。

public void updateRow(Todo todo)throws SQLException {String dml = "UPDATE " + todoTable + " SET name = ?, desc = ? " + " WHERE id = ?";PreparedStatement pstmnt = conn.prepareStatement(dml);pstmnt.setString(1, todo.getName());pstmnt.setString(2, todo.getDesc());pstmnt.setInt(3, todo.getId());pstmnt.executeUpdate(); // returns update countpstmnt.close(); }

5.7關(guān)閉數(shù)據(jù)庫

此方法關(guān)閉數(shù)據(jù)庫連接并關(guān)閉數(shù)據(jù)庫。

public void closeDb()throws SQLException {conn.close();}

5.8源代碼

這是應(yīng)用程序的版本2。 新創(chuàng)建一個(gè)類– TodoDataAccess.java。 其他沒有變化。 這些類是:

  • Todo.java
  • TodoDataAccess.java

注意:這些類已編譯。 沒有要運(yùn)行的程序。

6.通過數(shù)據(jù)庫訪問連接GUI

這是完成的應(yīng)用程序。

該應(yīng)用程序的GUI已連接到數(shù)據(jù)庫。 該應(yīng)用程序已更新,具有以下功能:

將新的待辦事項(xiàng)添加到列表中。

  • 點(diǎn)擊新按鈕; 輸入待辦事項(xiàng)名稱和說明字段。
  • 點(diǎn)擊保存按鈕。 這會(huì)將新輸入的待辦事項(xiàng)插入數(shù)據(jù)庫。 新的待辦事項(xiàng)已添加到列表中。
  • 該應(yīng)用程序驗(yàn)證輸入的待辦事項(xiàng)名稱具有5到50個(gè)字符的長度,并且在列表中是唯一的。
  • 輸入新的待辦事項(xiàng)時(shí),可以通過單擊刪除按鈕來取消輸入。

更新列表中的待辦事項(xiàng)。

  • 從列表中選擇一個(gè)待辦事項(xiàng)。 編輯名稱和/或描述字段。
  • 點(diǎn)擊保存按鈕。 驗(yàn)證后,這會(huì)將更新的待辦事項(xiàng)保存在數(shù)據(jù)庫中并更新列表。

刪除列表中的待辦事項(xiàng)。

  • 從列表中選擇一個(gè)待辦事項(xiàng)。
  • 單擊刪除按鈕。 這將從數(shù)據(jù)庫和列表中刪除待辦事項(xiàng)。

應(yīng)用程序啟動(dòng)和關(guān)閉。

  • 在應(yīng)用程序啟動(dòng)時(shí),數(shù)據(jù)庫中的所有待辦事項(xiàng)都將加載到列表中。
  • 在應(yīng)用程序關(guān)閉時(shí),數(shù)據(jù)庫已關(guān)閉。

6.1編碼

在此部分中,應(yīng)用程序已更新:

  • 新的,保存和刪除按鈕連接到相應(yīng)的事件處理程序。
  • 處理程序的代碼訪問數(shù)據(jù)庫。
  • 應(yīng)用程序的啟動(dòng)和關(guān)閉方法訪問數(shù)據(jù)庫。

數(shù)據(jù)庫訪問代碼已在上一節(jié)( 5.創(chuàng)建數(shù)據(jù)庫訪問代碼 )中構(gòu)建。

6.1.1關(guān)于事件處理程序

類型為ActionEvent的事件處理程序用作按鈕的動(dòng)作事件處理程序。 為此,實(shí)現(xiàn)了EventHandler接口。 按鈕的處理程序?qū)傩栽O(shè)置為button.setOnaction(someHandler) 。
這是此應(yīng)用程序中的三個(gè)按鈕的常見功能-新建,刪除和保存。

6.2創(chuàng)建一個(gè)新的待辦事項(xiàng)

當(dāng)用戶單擊新按鈕時(shí),將在列表視圖中創(chuàng)建一個(gè)新的待辦事項(xiàng),應(yīng)用程序會(huì)提示用戶輸入新待辦事項(xiàng)的名稱和說明。

private class NewButtonListener implements EventHandler<ActionEvent> {@Overridepublic void handle(ActionEvent e) {actionstatus.setText("New");// creates a todo at first row with name NEW todo and// selects itTodo todo = new Todo(0, "NEW Todo", ""); // 0 = dummy idint ix = 0;data.add(ix, todo);listView.getSelectionModel().clearAndSelect(ix);nametxt.clear();desctxt.clear();nametxt.setText("NEW Todo");nametxt.requestFocus();}}

6.3保存待辦事項(xiàng)

單擊保存按鈕后,該應(yīng)用程序:

  • 驗(yàn)證待辦事項(xiàng)名稱的長度(5至50個(gè)字符)
  • 檢查名稱是否已經(jīng)存在于數(shù)據(jù)庫中
  • 將待辦事項(xiàng)插入數(shù)據(jù)庫

請(qǐng)注意,此事件處理程序同時(shí)用于插入和更新功能。

private class SaveButtonListener implements EventHandler<ActionEvent> {@Overridepublic void handle(ActionEvent ae) {int ix = listView.getSelectionModel().getSelectedIndex();if (ix < 0) { // no data selected or no datareturn;}String s1 = nametxt.getText();String s2 = desctxt.getText();// validate nameif ((s1.length() < 5) || (s1.length() > 50)) {actionstatus.setText("Name must be 5 to 50 characters in length");nametxt.requestFocus();nametxt.selectAll();return;}// check if name is uniqueTodo todo = data.get(ix);todo.setName(s1);todo.setDesc(s2);if (isNameAlreadyInDb(todo)) {actionstatus.setText("Name must be unique!");nametxt.requestFocus();return;}if (todo.getId() == 0) { // insert in db (new todo)int id = 0;try {id = dbaccess.insertRow(todo);}catch (Exception e) {displayException(e);} todo.setId(id);data.set(ix, todo);actionstatus.setText("Saved (inserted)");}else { // db update (existing todo)try {dbaccess.updateRow(todo);}catch (Exception e) {displayException(e);}actionstatus.setText("Saved (updated)"); } // end-if, insert or update in db// update list view with todo name, and select itdata.set(ix, null); // required for refreshdata.set(ix, todo);listView.getSelectionModel().clearAndSelect(ix);listView.requestFocus();}}private boolean isNameAlreadyInDb(Todo todo) {boolean bool = false;try {bool = dbaccess.nameExists(todo);}catch (Exception e) {displayException(e);} return bool;}

6.4刪除或取消待辦事項(xiàng)

刪除按鈕的操作具有兩個(gè)功能:

  • 取消正在輸入但尚未保存的新待辦事項(xiàng)。
  • 從列表和數(shù)據(jù)庫中刪除選定的(現(xiàn)有)待辦事項(xiàng)。
private class DeleteButtonListener implements EventHandler<ActionEvent> {@Overridepublic void handle(ActionEvent ae) {int ix = listView.getSelectionModel().getSelectedIndex();if (ix < 0) { // no data or none selectedreturn;}Todo todo = data.remove(ix); try {dbaccess.deleteRow(todo);}catch (Exception e) {displayException(e);} actionstatus.setText("Deleted");// set next todo item after deleteif (data.size() == 0) {nametxt.clear();desctxt.clear();return; // no selection} ix = ix - 1; if (ix < 0) {ix = 0;}listView.getSelectionModel().clearAndSelect(ix);// selected ix data (not set by list listener);// requires this is setTodo itemSelected = data.get(ix);nametxt.setText(itemSelected.getName());desctxt.setText(itemSelected.getDesc());listView.requestFocus();}}

6.5應(yīng)用程序啟動(dòng)和關(guān)閉

JavaFX Application類的init()和stop()方法用于應(yīng)用程序的初始化和關(guān)閉。 這些在應(yīng)用程序中被覆蓋。 init方法具有在應(yīng)用程序啟動(dòng)時(shí)訪問數(shù)據(jù)庫的代碼。 stop方法具有在應(yīng)用程序關(guān)閉時(shí)關(guān)閉數(shù)據(jù)庫的代碼。

同樣,在應(yīng)用程序啟動(dòng)后,待辦事項(xiàng)列表中會(huì)填充數(shù)據(jù)庫數(shù)據(jù)(而不是早期版本1中在程序內(nèi)創(chuàng)建的數(shù)據(jù))。 這將替換版本1中的代碼data = getListData()方法的代碼data = getListData()替換為data = getDbData() 。

@Overridepublic void init() {try {dbaccess = new TodoDataAccess();}catch (Exception e) {displayException(e);}}@Overridepublic void stop() {try {dbaccess.closeDb();}catch (Exception e) {displayException(e);}}private ObservableList<Todo> getDbData() {List<Todo> list = null;try {list = dbaccess.getAllRows();}catch (Exception e) {displayException(e);}ObservableList<Todo> dbData = FXCollections.observableList(list);return dbData;}@Overridepublic void start(Stage primaryStage) {...data = getDbData();listView.setItems(data);...

6.6源代??碼

這是應(yīng)用程序的版本3,并且是最終版本。 一類TodoApp.java被修改。 其他沒有變化。 這些類是:

  • Todo.java
  • TodoDataAccess.java
  • TodoApp.java

注意:

  • 要編譯該應(yīng)用程序, jfxrt.jar必須在類路徑中。
  • 要運(yùn)行該應(yīng)用程序, jfxrt.jar和hsqldb.jar文件必須位于類路徑中。

7.部署為JAR文件

7.1創(chuàng)建可執(zhí)行的JAR文件:todoapp.jar

帶有createjar命令選項(xiàng)的javafxpackager實(shí)用程序用于為該應(yīng)用創(chuàng)建可執(zhí)行JAR文件。

  • 創(chuàng)建一個(gè)名為: deploy的目錄
  • 在deploy目錄中創(chuàng)建兩個(gè)子目錄: src和dest
  • 將所有應(yīng)用程序的class文件放在src目錄中
  • 導(dǎo)航到deploy目錄,從DOS提示符下運(yùn)行以下命令:
> javafxpackager -createjar -appclass TodoApp -srcdir src -outdir dest -outfile todoapp -v -classpath hsqldb.jar

這將創(chuàng)建應(yīng)用程序的可執(zhí)行JAR文件。 驗(yàn)證是否在dest目錄中創(chuàng)建了文件todoapp.jar 。

7.2運(yùn)行應(yīng)用

將創(chuàng)建的todoapp.jar文件復(fù)制到deploy (或任何)目錄中。 請(qǐng)注意,在運(yùn)行應(yīng)用程序之前,需要滿足以下條件:

  • 目錄(或類路徑)中的hsqldb.jar file
  • 該應(yīng)用程序的數(shù)據(jù)庫和表是預(yù)先創(chuàng)建的(請(qǐng)參閱創(chuàng)建應(yīng)用程序數(shù)據(jù)庫和表一節(jié) )

通過以下方式之一運(yùn)行應(yīng)用程序:

(a)在DOS命令提示符下:

> java -jar todoapp.jar

(b)雙擊todoapp.jar文件。

8.下載Java源代碼

可以從此處下載源代碼的所有三個(gè)版本: JavaFX List示例 。

翻譯自: https://www.javacodegeeks.com/2015/01/javafx-list-example.html

javafx 示例

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的javafx 示例_JavaFX列表示例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。