2013-04-26 24 views
5

OK, więc jestem nowy w tym, a ja szukałem przez dwa tygodnie, próbując uzyskać zestaw wyników SQL, aby wydrukować do TableView stworzonego przez JavaFX Scene Builder. Mogę wydrukować mój zestaw wyników przy użyciu System.out.println, a dane są poprawne, ale kiedy próbuję umieścić go na liście, mój widok tabeli pokazuje jedną kolumnę z zerami i drugą kolumną pustą. Próbuję wydrukować listę (println), ale otrzymuję wskaźnik obiektu (?), A nie dane, więc nie widzę, czy przechodzę z ResultSet na listę niepoprawnie.Wyświetlanie elementów z bazy danych w JavaFX TableView

Każda pomoc byłaby doceniona ... Chcę zrozumieć tę koncepcję, a nie tylko uzyskać odpowiedź.

Oto mój kod kontrolera:

public class TesterUIController implements Initializable { 

    @FXML 
    private TableView<dataClass> Table; 
    @FXML 
    private Button TestButton; 
    @FXML 
    private TableColumn<dataClass, Integer> colKey; 
    @FXML 
    private TableColumn<dataClass, String> colSalesNo; 

    public static void main (String[] args) { 
     System.out.println("Main has run"); 
    } 


    /** 
    * 
    * @param fxmlFileLocation 
    * @param resources 
    */ 
    @Override 
    public void initialize(URL fxmlFileLocation, ResourceBundle resources) { 
      TestButton.setOnAction(new EventHandler<ActionEvent>() { 

       @Override 
       public void handle(ActionEvent event) { 
        System.out.println("Button Pressed"); 
        colKey.setCellValueFactory(new PropertyValueFactory<dataClass, Integer>("Key")); 
        colSalesNo.setCellValueFactory(new PropertyValueFactory<dataClass, String>("SalesNo")); 

        Table.getItems().setAll(gobbledyGook()); 

       } 
      }); 
    } 

    /* 
    * dataClass is a (sub)class representing the data for TableView "Table" 
    */ 

    public class dataClass { 
     private IntegerProperty Key; 
     public void setKey (int value) {KeyProperty().set(value);} 
     public int getKey() { 
      return KeyProperty().get(); 
     } 
     public IntegerProperty KeyProperty() { 
      if (Key == null) Key = new SimpleIntegerProperty(this, "Key"); 
      return Key; 
     } 

     private StringProperty SalesNo; 
     public void setSalesNo(String value) { 
      SalesNoProperty().set(value); 
     } 
     public String getSalesNo() { 
      return SalesNoProperty().get(); 
     } 
     public StringProperty SalesNoProperty() { 
      if (SalesNo == null) SalesNo = new SimpleStringProperty(this, "SalesNo"); 
      return SalesNo; 
     } 
    } 

    private List<dataClass> gobbledyGook() { //ObservableList<dataClass> gobbledyGook() { // ResultSet getData() { 
     Connection conn; 
     String dbDriver; 
     Statement st; 
     ResultSet rs;// = null; 
     List ll = new LinkedList(); 

     try { 
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
      dbDriver = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};" 
        + "DBQ=Inventario.mdb;"; 
      conn = DriverManager.getConnection(dbDriver, "", ""); 
      st = conn.createStatement(); 

      String getSalesNumber = "SELECT * FROM SalesNumber " // TOP 1 * FROM ... 
        + "ORDER BY SalesNumber.Key DESC";// LIMIT 1"; 
      rs = st.executeQuery(getSalesNumber); 

      while (rs.next()) { 

       int Key = rs.getInt(1); 
       double saleNo = rs.getDouble(2); 
       NumberFormat formatter = new DecimalFormat("###########"); 
       String SalesNo = formatter.format(saleNo); 
       System.out.println(Key + ", " + SalesNo); //key + ", " + saleNo); 

       dataClass roww = new dataClass(); 
       ll.add(roww); 

      } 
     } 
     catch (ClassNotFoundException | SQLException ex) { 
      Logger.getLogger(TesterUIController.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     return ll; 
    } 

} 

Odpowiedz

5

swój problem

Twój stół jest pusty, bo nigdy nie zainicjować wartości dataClass roww które tworzysz. Spróbuj następującego kodu:

dataClass roww = new dataClass(); 
roww.setKey(Key); 
roww.setSalesNo(SalesNo); 
ll.add(roww); 

jeszcze lepszy pomysł, może być zapewnienie konstruktora dla dataClass która przyjmuje Key i SalesNo jako parametry - w ten sposób instancje dataClass są gwarancją prawidłowo zainicjowany.

ll.add(
    new dataClass(
    Key, 
    SalesNo 
) 
); 

referencyjny Rozwiązanie

Oto link do jakiegoś sample code dostępu do bazy danych z JavaFX poprzez JDBC i zapełnianie ListView z wynikami. Kod został utworzony dla pytania StackOverflow: javafx connection to mysql.

Ten kod, podobnie jak kod w pytaniu, jest prosty do zrozumienia (dlatego go połączyłem), ale cierpi na usterkę, że wyszukiwanie bazy danych jest wykonywane w wątku aplikacji JavaFX. Oznacza to, że interfejs aplikacji jest zamrożony podczas wyszukiwania bazy danych. To nie jest optymalne. Aby to naprawić, stworzyłem kolejne background thread based database access sample dla pytania stackoverflow: JavaFX - Background Thread for SQL Query. To rozwiązanie, które wykonuje kwerendy w wątku tła przy użyciu Task, jest preferowane.

Poza

Radziłbym po Java naming conventions jak uczyni to programy łatwiej być rozumiane przez innych programistów.

+0

OMG, DZIĘKUJĘ! Twoja poprawka działała idealnie, a twoje linki pomagają mi zrozumieć logikę, za którą poszedłem źle! Jeśli chodzi o konwencje nazewnictwa, wiedziałem, że ich nie śledzę, ponieważ jeszcze ich nie poznałem, ale tak, pracuję nad tym. Jeszcze raz dzięki! Najlepsza pomoc, jaką znalazłem w ciągu dwóch tygodni ścigania mojego ogona! – John