JavaFX列表示例
這是使用JavaFX構建的示例列表應用程序。 該應用程序是待辦事項列表。 此應用程序具有添加,更新和刪除列表中項目的功能。 列表數據存儲在HSQLDB關系數據庫中。 該應用程序使用JDBC(Java數據庫連接)API訪問數據庫。 該應用程序打包為可執行JAR文件。
JavaFX 2.2,Java SE 7和HSQLDB 2.3.2用于構建應用程序。
本文詳細介紹了構建應用程序。 本文件內容:
目錄
1.安裝HSQL數據庫1.安裝HSQL數據庫
關于HSQLDB
HSQL關系數據庫用于存儲待辦事項數據。 在本節中–獲取并安裝數據庫。
HSQLDB(HyperSQL數據庫)是用Java編寫的SQL關系數據庫軟件,可在JVM中運行。 它是一個小型,快速的多線程事務型數據庫引擎,具有基于內存和基于磁盤的表,并支持嵌入式和服務器模式。 這包括JDBC驅動程序。
下載資料庫
從網站http://hsqldb.org/上的下載鏈接下載數據庫軟件。 在這種情況下,將下載HSQLDB版本2.3.2。 下載的文件是一個ZIP文件。 將ZIP文件解壓縮到您選擇的任何目錄中。 將ZIP文件解壓縮到文件夾hsqldb-2.3.2\hsqldb 。 這是主(或安裝)目錄。
這樣就完成了安裝。 已安裝的數據庫具有用戶文檔,JDBC驅動程序,數據庫可執行文件和實用程序。 安裝目錄具有/doc和/lib目錄(以及其他目錄)。
/doc目錄包含用戶指南。
/lib目錄具有以下常用的JAR文件:
- hsqldb.jar :它具有數據庫引擎,JDBC驅動程序和GUI數據庫訪問工具。
- sqltool.jar :這有一個SQL命令行數據庫訪問工具。
2.創建應用數據庫和表
創建待辦事項數據庫
GUI數據庫訪問工具用于創建和訪問數據庫。 從DOS命令提示符運行此命令:
> java -cp "X:\JCG\articles\A JavaFX List Example\hsqldb-2.3.2\hsqldb\lib\hsqldb.jar" org.hsqldb.util.DatabaseManagerSwing 注意: hsqldb.jar文件位于類路徑中。
這將打開一個Connect GUI對話框,如下所示。
在對話框中輸入以下信息:
- 最近的設置:<現在不選擇任何內容。 下次連接數據庫時,選擇現在創建的設置。
- 設置名稱:<輸入名稱>待辦數據庫設置
- 類型:<select> HSQL數據庫引擎獨立
- 驅動程序:<select> hsqldb.jdbcDriver
- URL:<輸入數據庫文件路徑> jdbc:hsqldb:file:<<文件路徑–有關指定路徑的更多詳細信息,請參見下面的注釋>>
- 用戶:<留空>
- 密碼:<留空>
關于URL的文件路徑的注意事項:可以將文件路徑指定為相對路徑或絕對路徑。 相對路徑是相對于當前目錄的。 例如,URL中的jdbc:hsqldb:file:db\TODOS_DB將創建一個名為db的目錄,并在其中創建TODOS_DB數據庫。 帶有絕對路徑的示例是jdbc:hsqldb:file:X:\JCG\articles\A JavaFX List Example\db\TODOS_DB 。
單擊確定。
這將在指定目錄中創建一個名為TODOS_DB的數據庫。 這還將打開“ HSQLDatabase Manager”窗口。 該窗口具有顯示數據庫結構,SQL條目和結果詳細信息的區域。 該窗口如下所示。
2.2創建待辦事項表
待辦事項表具有三列:id,名稱和描述。
- id:這是數據庫系統生成的唯一整數。 這被定義為IDENTITY列。
IDENTITY列是由數據庫的序列生成器自動生成的INTEGER。 默認情況下,列值從1開始,并遞增1。當在表中進行插入時,將自動用新的序列號填充id列值。 本文后面將顯示用于插入和檢索id列值的語法(請參閱第5章“創建數據庫訪問代碼” )。
- 名稱:定義為VARCHAR(50),并且不為null。
- 描述:這被定義為VARCHAR(500)。
在“ HSQLDatabase Manager”窗口中,輸入以下SQL腳本并執行它。
CREATE TABLE TODO_TABLE (id INTEGER GENERATED BY DEFAULT AS IDENTITY,name VARCHAR(50) NOT NULL,description VARCHAR(500) );這將創建待辦事項表。 可以在數據庫結構區域中查看新創建的表。
注意:此步驟需要完成,然后再繼續。 該應用程序的代碼假定已創建數據庫和表。
3.申請
待辦事項顯示在列表中,其中每個待辦事項都是一個列表項。 在列表中選擇待辦事項時,名稱和描述分別顯示在文本框和文本區域中。 該數據可以編輯。 有一些按鈕可以創建待辦事項,刪除和保存。 狀態消息顯示最近執行的操作。
GUI顯示在一個窗口中。 可從todo數據庫訪問列表和文本框/區域中顯示的數據。 該數據庫在應用程序啟動時打開,在關閉應用程序時關閉。
下面顯示了完成的應用程序的GUI。
應用類別
該應用程序包含三個Java類。
- Todo.java:此類表示待辦事項。
- TodoApp.java:此類是具有GUI和程序執行邏輯的主要應用程序。
- TodoDataAccess.java:此類具有訪問todo數據庫的功能。
3.1.1 Todo.java
一個Todo.java由Todo.java類表示。 待辦事項具有名稱和描述屬性。 這還將維護一個唯一的id字段。
3.1.2 TodoDataAccess.java
此類具有訪問todo數據庫和數據的功能。 其功能是:
- 連接并關閉數據庫
- 插入,更新,刪除,查詢和驗證數據庫中的數據
3.1.3 TodoApp.java
此類是主要的應用程序。 它具有啟動應用程序,關閉應用程序,創建用戶界面以及將GUI和應用程序連接到數據訪問代碼的功能。
4.構建GUI
在此步驟中,將構建沒有按鈕的數據庫訪問和動作事件處理程序的GUI。 僅將列表連接到列表選擇更改偵聽器。
該應用程序在列表中顯示一些預定義的待辦事項數據。 可以選擇待辦事項列表,相應的待辦事項名稱和說明將顯示在它們各自的文本框/區域中。
下面顯示了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類
以下描述了用于構建GUI的JavaFX類:
- Stage類用于構建應用程序的主窗口。
- GridPane用于在行和列的網格中布局控件(按鈕,文本字段等)。
- HBox和VBox將其子控件布置在單個水平或垂直行中。
- ListView用于顯示待辦事項的垂直可滾動列表,用戶可以從中進行選擇。
- Label和Text用于待辦事項名稱標簽和文本字段。
- TextArea用于待辦事項描述字段。 該字段放置在ScrollPane ,以便可以滾動文本。
- Button控件用于新建,保存和刪除按鈕。
- Text用于顯示動作狀態。
4.2.2控件布局
網格窗格布局具有3行和2列。 放置控件的單元格如下:
- 第1行第1行具有列表視圖。
- Todo標簽和文本字段位于hbox中。
- 第1行第2行在vbox中具有hbox和todo description文本區域。
- 第2行第1行在hbox中具有“新建”和“刪除”按鈕。
- 第2行第2列具有保存按鈕。
- 第3行第1行具有狀態文本。
4.2.3列表的更改偵聽器
類型為ChangeListener<Number>的列表選擇更改偵聽器已附加到列表視圖:
listView.getSelectionModel().selectedIndexProperty().addListener(new changeListener());選擇列表項后,該項的待辦事項名稱和描述將顯示在文本字段中。
4.2.4列表數據
列表視圖中填充了來自ObservableList<Todo>集合的數據–在應用程序的start()方法中:
data = getListData();listView.setItems(data);在本節中,將在程序中創建列表的數據。 getListData()方法創建待辦事項并將其作為ObservableList <Todo>集合返回。
4.3源代碼
這是應用程序的版本1。 新創建了兩個類。 這些類是:
- Todo.java
- TodoApp.java
注意:要編譯代碼并運行應用程序, jfxrt.jar (JavaFX庫)文件必須位于類路徑中。 對于Java 7,可以在以下位置找到它: <JRE_HOME>/lib/jfxrt.jar 。
5.創建數據庫訪問代碼
待辦事項列表的數據是從數據庫存儲和訪問的。 TODO_DB數據庫中的TODO_TABLE存儲待辦事項詳細信息。 數據庫和表已在前面創建(請參閱2.創建應用程序數據庫和表一節 )。 請注意,該應用假定訪問數據庫之前已創建該數據庫。
本節介紹數據庫訪問代碼。 TodoDataAccess.java類具有代碼。 此代碼使用JDBC(Java數據庫連接)API來訪問TODO_DB數據庫。
注意:應用程序的GUI在下一節( 6.使用數據庫訪問連接GUI )中將其連接到數據庫訪問。
此類具有以下方法:
- 連接到todo數據庫
- 關閉待辦事項數據庫
- 將所有待辦事項表行讀入List集合
- 在待辦事項表中插入一行
- 檢查待辦事項表中是否存在待辦事項名稱
- 從待辦事項表中刪除一行
- 更新待辦事項表中的一行
下面顯示了TodoDataAccess.java類的代碼和詳細信息。
5.1獲取連接
構造函數具有訪問數據庫并獲取Connection對象的代碼。 此連接對象用于讀取或更新數據庫數據。 連接的屬性設置為自動提交,即,事務在沒有顯式提交的情況下在插入,更新或刪除時提交。 連接是可更新的類型。
DriverManager's getConnection()靜態方法使用URL連接到數據庫。
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表。 該方法返回新的待辦事項行的ID。
id值是數據庫系統生成的序列號。 這是一個IDENTITY列。 DEFAULT關鍵字(在INSERT語句中)用于IDENTITY列,這將為該列自動生成一個值。 請參閱第2.2節。 創建待辦事項表以獲取有關IDENTITY列創建的詳細信息。
PreparedStatement's getGeneratedKeys()方法使用新生成的標識列值檢索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名稱是否存在
此方法檢查待辦事項表中是否已存在待辦事項名稱。 請注意,該應用僅允許使用唯一的待辦事項名稱。
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刪除一行
此方法從給定待辦事項的待辦事項表中刪除一行(如果存在)。 請注意,如果沒有行被刪除,則不會引發異常。
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更新行
此方法使用待辦事項屬性的任何更改來更新待辦事項表中的現有行。
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關閉數據庫
此方法關閉數據庫連接并關閉數據庫。
public void closeDb()throws SQLException {conn.close();}5.8源代碼
這是應用程序的版本2。 新創建一個類– TodoDataAccess.java。 其他沒有變化。 這些類是:
- Todo.java
- TodoDataAccess.java
注意:這些類已編譯。 沒有要運行的程序。
6.通過數據庫訪問連接GUI
這是完成的應用程序。
該應用程序的GUI已連接到數據庫。 該應用程序已更新,具有以下功能:
將新的待辦事項添加到列表中。
- 點擊新按鈕; 輸入待辦事項名稱和說明字段。
- 點擊保存按鈕。 這會將新輸入的待辦事項插入數據庫。 新的待辦事項已添加到列表中。
- 該應用程序驗證輸入的待辦事項名稱具有5到50個字符的長度,并且在列表中是唯一的。
- 輸入新的待辦事項時,可以通過單擊刪除按鈕來取消輸入。
更新列表中的待辦事項。
- 從列表中選擇一個待辦事項。 編輯名稱和/或描述字段。
- 點擊保存按鈕。 驗證后,這會將更新的待辦事項保存在數據庫中并更新列表。
刪除列表中的待辦事項。
- 從列表中選擇一個待辦事項。
- 單擊刪除按鈕。 這將從數據庫和列表中刪除待辦事項。
應用啟動和關閉。
- 在應用程序啟動時,數據庫中的所有待辦事項都將加載到列表中。
- 在應用程序關閉時,數據庫已關閉。
6.1編碼
在此部分中,應用程序已更新:
- 新的,保存和刪除按鈕連接到相應的事件處理程序。
- 處理程序的代碼訪問數據庫。
- 應用程序的啟動和關閉方法訪問數據庫。
數據庫訪問代碼已在上一節( 5.創建數據庫訪問代碼 )中構建。
6.1.1關于事件處理程序
類型為ActionEvent的事件處理程序用作按鈕的動作事件處理程序。 為此,實現了EventHandler接口。 按鈕的處理程序屬性設置為button.setOnaction(someHandler) 。
這是此應用程序中的三個按鈕的常見功能-新建,刪除和保存。
6.2創建一個新的待辦事項
當用戶單擊新按鈕時,將在列表視圖中創建一個新的待辦事項,應用程序會提示用戶輸入新待辦事項的名稱和說明。
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保存待辦事項
單擊保存按鈕后,該應用程序:
- 驗證待辦事項名稱的長度(5至50個字符)
- 檢查名稱是否已經存在于數據庫中
- 將待辦事項插入數據庫
請注意,此事件處理程序用于插入和更新功能。
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刪除或取消待辦事項
刪除按鈕的操作具有兩個功能:
- 取消正在輸入但尚未保存的新待辦事項。
- 從列表和數據庫中刪除選定的(現有)待辦事項。
6.5應用程序啟動和關閉
JavaFX Application類的init()和stop()方法用于應用程序的初始化和關閉。 這些在應用程序中被覆蓋。 init方法具有在應用程序啟動時訪問數據庫的代碼。 stop方法具有在應用程序關閉時關閉數據庫的代碼。
同樣,在應用程序啟動之后,待辦事項列表中會填充數據庫數據(而不是早期版本1中在程序內創建的數據)。 這將替換版本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源代??碼
這是應用程序的版本3,并且是最終版本。 一類TodoApp.java被修改。 其他沒有變化。 這些類是:
- Todo.java
- TodoDataAccess.java
- TodoApp.java
注意:
- 要編譯該應用程序, jfxrt.jar必須位于類路徑中。
- 要運行該應用程序, jfxrt.jar和hsqldb.jar文件必須位于類路徑中。
7.部署為JAR文件
7.1創建可執行的JAR文件:todoapp.jar
帶有createjar命令選項的javafxpackager實用程序用于為應用創建可執行的JAR文件。
- 創建一個名為: deploy的目錄
- 在deploy目錄中創建兩個子目錄: src和dest
- 將所有應用程序的class文件放在src目錄中
- 導航到deploy目錄,從DOS提示符下運行以下命令:
這將創建應用程序的可執行JAR文件。 驗證是否在dest目錄中創建了文件todoapp.jar 。
7.2運行應用
將創建的todoapp.jar文件復制到deploy (或任何)目錄中。 請注意,在運行應用程序之前,需要滿足以下條件:
- 目錄(或類路徑)中的hsqldb.jar file
- 該應用程序的數據庫和表是預先創建的(請參閱創建應用程序數據庫和表一節 )
通過以下方式之一運行應用程序:
(a)在DOS命令提示符下:
> java -jar todoapp.jar(b)雙擊todoapp.jar文件。
8.下載Java源代碼
可以從此處下載源代碼的所有三個版本: JavaFX List Example 。翻譯自: https://www.javacodegeeks.com/2015/01/javafx-list-example.html
總結
以上是生活随笔為你收集整理的JavaFX列表示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 8 StringJoiner
- 下一篇: 化妆品有备案就安全吗是真的吗(化妆品有备