JavaFX JDBC:Derby колоните от ДБ в колонина TableView

Meniak

Registered
Здравейте. Гледам че форума няма раздел java но все пак е с целенасоченост към програмиране та пиша, може някои да има решение на проблема ми.

Как мога колоните от базата данни да ги вкарам в колоните на таблицата
Прочетох може би всички теми в интернет по въпроса но там са показани примери с предварително дефинирани стойности а и като гледам колко код се изписва за да вкарвам някакъв текст в колоната на таблицата не ми се вярва да е вярно това.

Не давам код защото не сам стигнал до никъде просто сам направил един интерфейс с JavaFX SceneBuilder в FXML файл който зареждам в класа с main метода и към този FXML файл има един файл с контролера на fxml файла.
 
Не съм запознат с 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
 

Back
Горе