Как автоматически обновить комбобокс со значениями из SQLite в JavaFX? - PullRequest
0 голосов
/ 03 января 2019

Я пишу приложение с JavaFX, Scene Builder и SQlite

У меня есть выпадающий список со значениями (id), который идет из базы данных SQLite. У меня есть 2 textArias.У меня есть кнопка «Добавить», которая имеет метод void addCard(ActionEvent event).Метод добавляет текст из textArias и применяет его к определенным столбцам в SQLite.

Проблема заключается в следующем: когда я пытаюсь добавить значения в SQLite и нажимаю кнопку, а затем открываю выпадающий список, я не вижу добавленного идентификатора., но когда я закрываю окно и открываю его снова, в выпадающем списке отображается мой добавленный идентификатор.

Очень неприятно закрывать и открывать окно каждый раз, когда я хочу увидеть добавленный результат в выпадающем списке

  • Класс модели содержит всю логику
  • Класс контроллера работает между моделью и представлением
  • Класс Persistent Queries содержит все запросы к / из SQLite

Как отобразить новоеДобавил ID после нажатия на кнопку «Добавить»?

В этом видео показано, как работает мое приложение:

Видео

Класс модели:

package src.card;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Cards {

  PersistentQueries pq = new PersistentQueries();

  final ObservableList OPTIONS = FXCollections.observableArrayList();

  Connection connection;
  PreparedStatement pst = null;
  ResultSet rs = null;




  public Cards() {
try {
  this.connection = DbConnection.getConnection();
} catch (SQLException ex) {
  ex.printStackTrace();
}

if (this.connection == null) {
  System.out.println("connection is not successful!");
  System.exit(1);
}

  }


   public ObservableList getOPTIONS() {return OPTIONS;}



   //add ID of cards to combobox
  void fillCombobox() {
   try {
  pst = connection.prepareStatement(pq.getSqlSelectID());
  rs = pst.executeQuery();

  while (rs.next()) {
    OPTIONS.add(rs.getString("ID"));
  }

  pst.close();
  rs.close();

} catch (SQLException e) {
  e.printStackTrace();
   }
  }

  //check if database is connected
  public boolean isDbConnected() {
    return this.connection != null;
  }
}

Класс контроллера:

 package src.card;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import src.card.Cards;
import src.card.Context;
import src.card.DbConnection;
import src.card.PersistentQueries;

import java.net.URL;
import java.sql.*;
import java.util.ResourceBundle;




public class QuestController implements Initializable {

  @FXML  private TextArea ta_questText, ta_answerText;
  @FXML  private Label questId, error;
  @FXML  private ComboBox<String> combobox_question;

  Cards cards = new Cards();
  PersistentQueries pq = new PersistentQueries();

  @Override
  public void initialize(URL location, ResourceBundle resources) {

//register QuestController in  Context Class
Context.getInstance().setQuestController(this);

cards.fillCombobox();
combobox_question.setItems(cards.getOPTIONS());

  }

//adding cards to database
 @FXML
  void addCard(ActionEvent event) {

    if (ta_questText.getText().equals("") || 
   ta_answerText.getText().equals("")) {
  error.setText("All fields are required!");
} else {
  try {
    error.setText("");
    Connection conn = DbConnection.getConnection();
    PreparedStatement stmt = conn.prepareStatement(pq.getSqlInsert());
    stmt.setString(1, this.ta_questText.getText());
    stmt.setString(2, this.ta_answerText.getText());
    ta_questText.setText("");
    ta_answerText.setText("");
    stmt.execute();
    conn.close();


  } catch (SQLException e) {
    e.printStackTrace();
     }
    }

  }

  @FXML
  void idList(ActionEvent event) {

  questId.setText(combobox_question.getValue() + ".");

   }
}

Класс PersistentQueries

package src.card;

public class PersistentQueries {

  private String sqlInsert = "INSERT INTO Cards(question, answer) VALUES 
 (?,?)";
  private String sqlSelectID = "SELECT ID FROM Cards";
  private String sqlSelect = "SELECT question and answer FROM Cards";


  public String getSqlInsert() {
   return sqlInsert;
  }

  public void setSqlInsert(String sqlInsert) {
    this.sqlInsert = sqlInsert;
  }


  public String getSqlSelectID() {
   return sqlSelectID;
   }

  public void setSqlSelectID(String sqlSelectID) {
   this.sqlSelectID = sqlSelectID;
  }

   public String getSqlSelect() {
   return sqlSelect;
  }

  public void setSqlSelect(String sqlSelect) {
   this.sqlSelect = sqlSelect;
  }
}

1 Ответ

0 голосов
/ 04 января 2019

ПРОБЛЕМА РЕШЕНА!

в QuestController в методе @FXML void addCard(ActionEvent event) Я добавил

cards.getOBS().clear();

Удаляет все объекты из списка наблюдаемых

затем я вызвал метод из класса карт, который считывает все новые данные из SQLite и добавляет их в список наблюдаемых

cards.fillCombobox();

и тогда я просто закрываю все соединения:

    pst.close();
    rs.close();
    conn.close();

Мой переписанный метод выглядит так:

 /adding cards to database, update combobox and clear label text
  @FXML  void addCard(ActionEvent event) {

if (ta_questText.getText().equals("") || ta_answerText.getText().equals("")) {
  error.setText("All fields are required!");
} else {
  try {

    error.setText("");
    Connection conn = DbConnection.getConnection();
    pst = conn.prepareStatement(pq.getSqlInsert());
    pst.setString(1, this.ta_questText.getText());
    pst.setString(2, this.ta_answerText.getText());
    pst.execute();

    pst = conn.prepareStatement(pq.getSqlSelectID());
    rs = pst.executeQuery();

    ta_questText.clear();
    ta_answerText.clear();
    cards.getOBS().clear();
    questId.setText("");

   cards.fillCombobox();

    pst.close();
    rs.close();
    conn.close();


  } catch (SQLException e) {
    e.printStackTrace();
  }
}

 }
...