Отображение элементов из базы данных в JavaFX TableView

Итак, я новичок в этом, и я искал две недели, пытаясь получить набор результатов SQL для печати в TableView, созданном JavaFX Scene Builder. Я могу распечатать свой набор результатов с помощью System.out.println, и данные верны, но когда я пытаюсь поместить его в список, в моем табличном представлении один столбец содержит 0, а другой столбец пуст. Я пытаюсь распечатать список (println), но получаю указатель объекта (?), а не данные, поэтому я не вижу, неправильно ли я перехожу от ResultSet к списку.

Буду признателен за любую помощь... Я хочу понять концепцию, а не просто получить ответ.

Вот мой код контроллера:

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;
    }

}

person John    schedule 26.04.2013    source источник


Ответы (1)


Ваша проблема

Ваша таблица пуста, потому что вы никогда не инициализируете значения dataClass roww, которые вы создаете. Вместо этого попробуйте следующий код:

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

Еще лучшей идеей может быть предоставление конструктора для класса данных, который принимает Key и SalesNo в качестве параметров - таким образом ваши экземпляры dataClass гарантированно будут правильно инициализированы.

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

Эталонное решение

Вот ссылка на некоторый пример кода для доступа к базе данных из JavaFX через JDBC и заполнения ListView с помощью полученные результаты. Код был создан для вопроса StackOverflow: подключение javafx к mysql.

Этот код, аналогичный коду в вашем вопросе, прост для понимания (поэтому я связал его), но имеет недостаток, заключающийся в том, что поиск в базе данных выполняется в потоке приложения JavaFX. Это означает, что пользовательский интерфейс приложения замораживается, пока выполняется поиск в базе данных. Это не оптимально. Чтобы исправить это, я создал еще один пример доступа к базе данных на основе фонового потока для вопроса о переполнении стека: JavaFX — фоновый поток для SQL-запроса. Это решение, которое выполняет запросы в фоновом потоке с использованием Task, предпочтительнее.

В сторону

Я бы посоветовал следовать соглашениям об именах Java. так как это облегчит понимание ваших программ другими разработчиками.

person jewelsea    schedule 26.04.2013
comment
ОМГ, СПАСИБО! Ваше исправление сработало отлично, и ваши ссылки помогают мне понять логику, в которой я ошибся! Что касается соглашений об именах, я знал, что не соблюдаю их, потому что еще не выучил их все, но да, я работаю над этим. Еще раз спасибо! Лучшая помощь, которую я нашел за две недели погони за своим хвостом! - person John; 26.04.2013