Не съм запознат с Derby, но гледам един туториал на Vogella и общо взето това ти е кода, който ти трябва:
Код:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
public class DerbyTest {
private Connection connect = null;
private Statement statement = null;
private ResultSet resultSet = null;
public DerbyTest() throws Exception {
try {
Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();
connect = DriverManager
.getConnection("jdbc:derby://localhost/c:/temp/db/FAQ/db");
PreparedStatement statement = connect
.prepareStatement("SELECT * from USERS");
resultSet = statement.executeQuery();
while (resultSet.next()) {
String user = resultSet.getString("name");
String number = resultSet.getString("number");
System.out.println("User: " + user);
System.out.println("ID: " + number);
}
} catch (Exception e) {
throw e;
} finally {
close();
}
}
private void close() {
try {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connect != null) {
connect.close();
}
} catch (Exception e) {
}
}
public static void main(String[] args) throws Exception {
DerbyTest dao = new DerbyTest();
}
}
Поразрових се и поразгледах кода на derby и общо взето най-важното:
Код:
Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();
- при създването на инстанцията ще ти бъде зареден клиентския драйвър за мрежата, видях че има някакви static блокове, които ще се изпълнят при инстанцирането и ще настроят драйвъра. Според документацията не е нужно да създаваш такава инстанция, защото java.sql.DriverManager, ще го направи, но няма да можеш да оперираш пълноценно. Тук има информация: http://db.apache.org/derby/docs/10.11/ref/rrefjdbc32052.html
Код:
connect = DriverManager
.getConnection("jdbc:derby://localhost/c:/temp/db/FAQ/db");
- ще направи конекция към дербито, за формата на стринга има доста писания из нета, стандартен е
Код:
PreparedStatement statement = connect
.prepareStatement("SELECT * from USERS");
resultSet = statement.executeQuery();
while (resultSet.next()) {
String user = resultSet.getString("name");
String number = resultSet.getString("number");
System.out.println("User: " + user);
System.out.println("ID: " + number);
}
- създаване на заявката , изпълнение и извеждане на резултатите, не виждам нещо сложно
За другата част от кода предполагам, че няма смисъл, да я обяснявам.
И сега стигаме до JavaFX:
1. Първо се създава application:
Код:
public class FXMLTableView extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setTitle("FXML TableView Example");
Parent root = FXMLLoader.load(getClass().getResource("jfx_view.fxml"));
Scene myScene = new Scene(root);
primaryStage.setScene(myScene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
- стандартен JFX код за създаване на приложение. Създават се stage и scene, слага се title на прозореца и се указва да се покаже stage-а. Тук чрез root се задава кой Node да се визуализира на scene-a, в случая се взима това от jfx_view.fxml
2. Таблицата:
Виждам, че използваш fxml, а не програмно създаване, следователно трябва да имаш нещо подобно:
Код:
<GridPane alignment="CENTER" hgap="10.0" vgap="10.0"
xmlns:fx="http://javafx.com/fxml"
fx:controller="fxmltableview.FXMLTableViewController">
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>
</GridPane>
- това е най-главния елемент, който ще съдържа останалите, нещо като контейнер, забележи че е дефиниран кой е контролера на fxml-а.
(jfx_view.fxml)
Продължавам нататък с добавянето на таблицата:
Код:
<GridPane alignment="CENTER" hgap="10.0" vgap="10.0"
xmlns:fx="http://javafx.com/fxml"
fx:controller="fxmltableview.FXMLTableViewController">
<TableView fx:id="tableView" GridPane.columnIndex="0"
GridPane.rowIndex="1">
</TableView>
</GridPane>
- таблицата се описва с TableView обект
Създават се колоните:
Код:
<TableView [color=red]fx:id="tableView"[/color] GridPane.columnIndex="0" GridPane.rowIndex="1">
<columns>
<TableColumn text="Username">
<cellValueFactory><PropertyValueFactory property="username" />
</cellValueFactory>
</TableColumn>
<TableColumn text="Number">
<cellValueFactory><PropertyValueFactory property="number" />
</cellValueFactory>
</TableColumn>
</columns>
</TableView>
- В случая таблицата, ще има 2 колони, като тук се дефинират и пропъртитата които ще съдържа колоната(по-долу съм описал пропрътитата, в Person класа)
Попринцип е добра практика данните да се съхраняват в bean-нове, защото лесно се обработват, специално за тази цел в JFX са дефинирани Simple beans properties (нещо подобно на properties в .NET). Нека направим един клас, който да съдържа инфомацията за user-a:
Код:
import javafx.beans.property.SimpleStringProperty;
public class Person {
private final SimpleStringProperty username= new SimpleStringProperty("");
private final SimpleStringProperty number= new SimpleStringProperty("");
public Person() {
this("", "");
}
public Person(String username, String number) {
setUsername(username);
setNumber(number);
}
public String getUsername() {
return username.get();
}
public void setUsername(String newUsername) {
username.set(newUsername);
}
public String getNumber() {
return number.get();
}
public void setNumber(String newNumber) {
lastName.set(newNumber);
}
}
И сега контролера на таблицата:
Код:
public class FXMLTableViewController {
@FXML private TableView tableView;
private ObservableList<Person> data = FXCollections.observableArrayList();
private Connection connect = null;
private Statement statement = null;
private ResultSet resultSet = null;
public FXMLTableViewController () {
tableView.setItems(data);
Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();
connect = DriverManager
.getConnection("jdbc:derby://localhost/c:/temp/db/FAQ/db");
PreparedStatement statement = connect
.prepareStatement("SELECT * from USERS");
resultSet = statement.executeQuery();
while (resultSet.next()) {
Person item = new Person();
String user = resultSet.getString("name");
String number = resultSet.getString("number");
item.setUsername(user);
item.setNumber(number);
data.add(item);
}
} catch (Exception e) {
throw e;
} finally {
close();
}
}
private void close() {
try {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connect != null) {
connect.close();
}
} catch (Exception e) {
}
}
- не помня дали беше нужно да се дефинира тук кое е view-то, ако във view-то е дефиниран контролера. (Тук няма да го дефинирам.)
Нещо подобно трябва да е, не съм го гласил да работи и не съм го тествал, тъй че може да има пропуски. Общо взето тук идеята е следната: взима се обекта на таблицата чрез анотацията @FXML и в конструктора се свързвам към базата от данни, изличам от там нужната информация (като обекти от тип Person), добавям в един списък(по-точно ObservableList, това е списък, който се обработва от JFX и има прикрепени към него евенти, които служат при промяна на списъка да се променя и view-то). Към таблицата се добавя списъка като items, т.е. JFX ще си обработи скисъка и ще си го набута в таблицата.
Предполагам, че няма да тръгне от първия път, повтарям че не съм го тествал. Просто съм уморен и ме мързи да си тегля и конфигурирам дерби и да пиша приложение, поради същата причина може да съдържа и грешки и да е неразбираемо

, надявам се да хванеш логиката ми. Ето тук са линковете които съм използвал за справка, там има доста информация:
Derby: http://db.apache.org/derby/docs/10.11/ref/rrefjdbc32052.html & http://www.vogella.com/tutorials/ApacheDerby/article.html
JavaFX: http://docs.oracle.com/javafx/2/fxml_get_started/fxml_tutorial_intermediate.htm & http://docs.oracle.com/javafx/2/fxml_get_started/jfxpub-fxml_get_started.htm & http://www.drdobbs.com/jvm/javafx-tableview-sample-project/240009090 & http://docs.oracle.com/javafx/2/ui_controls/table-view.htm