javafx 示例_JavaFX列表示例
javafx 示例
這是使用JavaFX構(gòu)建的示例列表應(yīng)用程序。 該應(yīng)用程序是待辦事項(xiàng)列表。 該應(yīng)用程序具有添加,更新和刪除列表中項(xiàng)目的功能。 列表數(shù)據(jù)存儲(chǔ)在HSQLDB關(guān)系數(shù)據(jù)庫(kù)中。 該應(yīng)用程序使用JDBC(Java數(shù)據(jù)庫(kù)連接)API訪問數(shù)據(jù)庫(kù)。 該應(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ù)庫(kù)1.安裝HSQL數(shù)據(jù)庫(kù)
關(guān)于HSQLDB
HSQL關(guān)系數(shù)據(jù)庫(kù)用于存儲(chǔ)待辦事項(xiàng)數(shù)據(jù)。 在本節(jié)中–獲取并安裝數(shù)據(jù)庫(kù)。
HSQLDB(HyperSQL數(shù)據(jù)庫(kù))是用Java編寫SQL關(guān)系數(shù)據(jù)庫(kù)軟件,可在JVM中運(yùn)行。 它是一個(gè)小型,快速的多線程事務(wù)型數(shù)據(jù)庫(kù)引擎,具有基于內(nèi)存和基于磁盤的表,并支持嵌入式和服務(wù)器模式。 這包括JDBC驅(qū)動(dòng)程序。
下載資料庫(kù)
從網(wǎng)站http://hsqldb.org/上的下載鏈接下載數(shù)據(jù)庫(kù)軟件。 在這種情況下,將下載HSQLDB版本2.3.2。 下載的文件是一個(gè)ZIP文件。 將ZIP文件解壓縮到您選擇的任何目錄中。 該ZIP文件被解壓縮到文件夾hsqldb-2.3.2\hsqldb 。 這是主(或安裝)目錄。
這樣就完成了安裝。 已安裝的數(shù)據(jù)庫(kù)包含用戶文檔,JDBC驅(qū)動(dòng)程序,數(shù)據(jù)庫(kù)可執(zhí)行文件和實(shí)用程序。 安裝目錄具有/doc和/lib目錄(以及其他目錄)。
/doc目錄包含用戶指南。
/lib目錄具有以下常用的JAR文件:
- hsqldb.jar :它具有數(shù)據(jù)庫(kù)引擎,JDBC驅(qū)動(dòng)程序和GUI數(shù)據(jù)庫(kù)訪問工具。
- sqltool.jar :這有一個(gè)SQL命令行數(shù)據(jù)庫(kù)訪問工具。
2.創(chuàng)建應(yīng)用數(shù)據(jù)庫(kù)和表
創(chuàng)建待辦事項(xiàng)數(shù)據(jù)庫(kù)
GUI數(shù)據(jù)庫(kù)訪問工具用于創(chuàng)建和訪問數(shù)據(jù)庫(kù)。 從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ù)庫(kù)時(shí),選擇現(xiàn)在創(chuàng)建的設(shè)置。
- 設(shè)置名稱:<輸入名稱> todo db設(shè)置
- 類型:<select> HSQL數(shù)據(jù)庫(kù)引擎獨(dú)立
- 驅(qū)動(dòng)程序:<select> hsqldb.jdbcDriver
- URL:<輸入數(shù)據(jù)庫(kù)文件路徑> 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ù)庫(kù)。 帶有絕對(duì)路徑的示例是jdbc:hsqldb:file:X:\JCG\articles\A JavaFX List Example\db\TODOS_DB 。
單擊確定。
這將在指定目錄中創(chuàng)建一個(gè)名為TODOS_DB的數(shù)據(jù)庫(kù)。 這還將打開“ HSQLDatabase Manager”窗口。 該窗口具有顯示數(shù)據(jù)庫(kù)結(jié)構(gòu),SQL條目和結(jié)果詳細(xì)信息的區(qū)域。 窗口如下所示。
2.2創(chuàng)建待辦事項(xiàng)表
待辦事項(xiàng)表具有三列:id,名稱和描述。
- id:這是數(shù)據(jù)庫(kù)系統(tǒng)生成的唯一整數(shù)。 這被定義為IDENTITY列。
IDENTITY列是由數(shù)據(jù)庫(kù)的序列生成器自動(dòng)生成的INTEGER。 默認(rèn)情況下,列值從1開始并遞增1。當(dāng)在表中進(jìn)行插入時(shí),將自動(dòng)用新的序列號(hào)填充id列值。 本文后面將顯示用于插入和檢索id列值的語(yǔ)法(請(qǐng)參閱第5章“創(chuàng)建數(shù)據(jù)庫(kù)訪問代碼” )。
- 名稱:定義為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ù)庫(kù)結(jié)構(gòu)區(qū)域中查看新創(chuàng)建的表。
注意:此步驟需要完成,然后再繼續(xù)。 該應(yīng)用程序的代碼假定已創(chuàng)建數(shù)據(jù)庫(kù)和表。
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ù)庫(kù)訪問列表和文本框/區(qū)域中顯示的數(shù)據(jù)。 該數(shù)據(jù)庫(kù)在應(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ù)庫(kù)的功能。
3.1.1 Todo.java
待辦事項(xiàng)由Todo.java類表示。 待辦事項(xiàng)具有名稱和描述屬性。 這還將維護(hù)一個(gè)唯一的id字段。
3.1.2 TodoDataAccess.java
此類具有訪問todo數(shù)據(jù)庫(kù)和數(shù)據(jù)的功能。 其功能是:
- 連接并關(guān)閉數(shù)據(jù)庫(kù)
- 插入,更新,刪除,查詢和驗(yàn)證數(shù)據(jù)庫(kù)中的數(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ù)庫(kù)訪問和動(dòng)作事件處理程序的GUI。 僅將列表連接到列表選擇更改偵聽器。
該應(yīng)用程序在列表中顯示一些預(yù)定義的待辦事項(xiàng)數(shù)據(jù)。 可以選擇待辦事項(xiàng)列表,相應(yīng)的待辦事項(xiàng)名稱和說(shuō)明將顯示在它們各自的文本框/區(qū)域中。
下面顯示了TodoApp.java類的代碼及其說(shuō)明。
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;} }代碼說(shuō)明
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)名稱和說(shuō)明將顯示在文本字段中。
4.2.4列表數(shù)據(jù)
列表視圖中填充了來(lái)自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庫(kù))文件必須位于類路徑中。 對(duì)于Java 7,可以在以下位置找到它: <JRE_HOME>/lib/jfxrt.jar 。
5.創(chuàng)建數(shù)據(jù)庫(kù)訪問代碼
待辦事項(xiàng)列表的數(shù)據(jù)是從數(shù)據(jù)庫(kù)存儲(chǔ)和訪問的。 TODO_DB數(shù)據(jù)庫(kù)中的TODO_TABLE存儲(chǔ)待辦事項(xiàng)詳細(xì)信息。 數(shù)據(jù)庫(kù)和表已經(jīng)在前面創(chuàng)建(請(qǐng)參閱2.創(chuàng)建應(yīng)用程序數(shù)據(jù)庫(kù)和表一節(jié) )。 請(qǐng)注意,該應(yīng)用假定訪問數(shù)據(jù)庫(kù)之前已創(chuàng)建該數(shù)據(jù)庫(kù)。
本節(jié)介紹數(shù)據(jù)庫(kù)訪問代碼。 TodoDataAccess.java類具有代碼。 此代碼使用JDBC(Java數(shù)據(jù)庫(kù)連接)API來(lái)訪問TODO_DB數(shù)據(jù)庫(kù)。
注意:應(yīng)用程序的GUI在下一節(jié)( 6.使用數(shù)據(jù)庫(kù)訪問連接GUI)中連接到數(shù)據(jù)庫(kù)訪問。
此類具有以下方法:
- 連接到todo數(shù)據(jù)庫(kù)
- 關(guān)閉待辦事項(xiàng)數(shù)據(jù)庫(kù)
- 將所有待辦事項(xiàng)表行讀入List集合
- 在待辦事項(xiàng)表中插入一行
- 檢查待辦事項(xiàng)表中是否存在待辦事項(xiàng)名稱
- 從待辦事項(xiàng)表中刪除一行
- 更新待辦事項(xiàng)表中的一行
下面顯示了TodoDataAccess.java類的代碼和詳細(xì)信息。
5.1獲取連接
構(gòu)造函數(shù)具有訪問數(shù)據(jù)庫(kù)并獲取Connection對(duì)象的代碼。 此連接對(duì)象用于讀取或更新數(shù)據(jù)庫(kù)數(shù)據(jù)。 連接的屬性設(shè)置為自動(dòng)提交,即,事務(wù)在沒有顯式提交的情況下在插入,更新或刪除時(shí)提交。 連接是可更新的類型。
DriverManager's getConnection()靜態(tài)方法使用URL連接到數(shù)據(jù)庫(kù)。
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ù)庫(kù)系統(tǒng)生成的序列號(hào)。 這是一個(gè)IDENTITY列。 DEFAULT關(guān)鍵字(在INSERT語(yǔ)句中)用于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)屬性的任何更改來(lái)更新待辦事項(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ù)庫(kù)
此方法關(guān)閉數(shù)據(jù)庫(kù)連接并關(guān)閉數(shù)據(jù)庫(kù)。
public void closeDb()throws SQLException {conn.close();}5.8源代碼
這是應(yīng)用程序的版本2。 新創(chuàng)建一個(gè)類– TodoDataAccess.java。 其他沒有變化。 這些類是:
- Todo.java
- TodoDataAccess.java
注意:這些類已編譯。 沒有要運(yùn)行的程序。
6.通過(guò)數(shù)據(jù)庫(kù)訪問連接GUI
這是完成的應(yīng)用程序。
該應(yīng)用程序的GUI已連接到數(shù)據(jù)庫(kù)。 該應(yīng)用程序已更新,具有以下功能:
將新的待辦事項(xiàng)添加到列表中。
- 點(diǎn)擊新按鈕; 輸入待辦事項(xiàng)名稱和說(shuō)明字段。
- 點(diǎn)擊保存按鈕。 這會(huì)將新輸入的待辦事項(xiàng)插入數(shù)據(jù)庫(kù)。 新的待辦事項(xiàng)已添加到列表中。
- 該應(yīng)用程序驗(yàn)證輸入的待辦事項(xiàng)名稱具有5到50個(gè)字符的長(zhǎng)度,并且在列表中是唯一的。
- 輸入新的待辦事項(xiàng)時(shí),可以通過(guò)單擊刪除按鈕來(lái)取消輸入。
更新列表中的待辦事項(xiàng)。
- 從列表中選擇一個(gè)待辦事項(xiàng)。 編輯名稱和/或描述字段。
- 點(diǎn)擊保存按鈕。 驗(yàn)證后,這會(huì)將更新的待辦事項(xiàng)保存在數(shù)據(jù)庫(kù)中并更新列表。
刪除列表中的待辦事項(xiàng)。
- 從列表中選擇一個(gè)待辦事項(xiàng)。
- 單擊刪除按鈕。 這將從數(shù)據(jù)庫(kù)和列表中刪除待辦事項(xiàng)。
應(yīng)用程序啟動(dòng)和關(guān)閉。
- 在應(yīng)用程序啟動(dòng)時(shí),數(shù)據(jù)庫(kù)中的所有待辦事項(xiàng)都將加載到列表中。
- 在應(yīng)用程序關(guān)閉時(shí),數(shù)據(jù)庫(kù)已關(guān)閉。
6.1編碼
在此部分中,應(yīng)用程序已更新:
- 新的,保存和刪除按鈕連接到相應(yīng)的事件處理程序。
- 處理程序的代碼訪問數(shù)據(jù)庫(kù)。
- 應(yīng)用程序的啟動(dòng)和關(guān)閉方法訪問數(shù)據(jù)庫(kù)。
數(shù)據(jù)庫(kù)訪問代碼已在上一節(jié)( 5.創(chuàng)建數(shù)據(jù)庫(kù)訪問代碼 )中構(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)的名稱和說(shuō)明。
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)名稱的長(zhǎng)度(5至50個(gè)字符)
- 檢查名稱是否已經(jīng)存在于數(shù)據(jù)庫(kù)中
- 將待辦事項(xiàng)插入數(shù)據(jù)庫(kù)
請(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ù)庫(kù)中刪除選定的(現(xiàn)有)待辦事項(xiàng)。
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ù)庫(kù)的代碼。 stop方法具有在應(yīng)用程序關(guān)閉時(shí)關(guān)閉數(shù)據(jù)庫(kù)的代碼。
同樣,在應(yīng)用程序啟動(dòng)后,待辦事項(xiàng)列表中會(huì)填充數(shù)據(jù)庫(kù)數(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)行以下命令:
這將創(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ù)庫(kù)和表是預(yù)先創(chuàng)建的(請(qǐng)參閱創(chuàng)建應(yīng)用程序數(shù)據(jù)庫(kù)和表一節(jié) )
通過(guò)以下方式之一運(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ì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的javafx 示例_JavaFX列表示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 翅组词 翅可以组什么词
- 下一篇: 场院读音 场院到底念啥