Tableview java отображает базу данных следующей строки

#java #mysql #tableview #javafx-8

#java #mysql #tableview #javafx-8

Вопрос:

У меня возникли некоторые проблемы, пытаясь понять, почему значение перезаписывается в одну и ту же строку и столбец таблицы из Tableview, когда другая RFID-метка обнаруживается считывателем.

Все, что я хотел, это убедиться, что все данные могут отображать следующую доступную строку, которую, похоже, я не смог решить. Я надеюсь, что вы, ребята, можете помочь. Спасибо

Вот мое объявление таблиц

 public class tableview extends Application implements Initializable {

    @FXML
    private TableView<UserDetails> table;
    @FXML
    private TableColumn<UserDetails, String> epc;
    @FXML
    private TableColumn<UserDetails, String> modCode;
    @FXML
    private TableColumn<UserDetails, String> modClass;
    @FXML
    private TableColumn<UserDetails, String> modName;
    @FXML
    private TableColumn<UserDetails, String> timestamp;




    public void initialize(URL location, ResourceBundle resources) {

        epc.setCellValueFactory(new PropertyValueFactory<>("epcNo"));
        modCode.setCellValueFactory(new PropertyValueFactory<>("moduleCode"));
        modClass.setCellValueFactory(new PropertyValueFactory<>("moduleClass"));
        modName.setCellValueFactory(new PropertyValueFactory<>("moduleName"));
        timestamp.setCellValueFactory(new PropertyValueFactory<>("timestamp"));

public synchronized void moduleInfo(String epcString) {
        try {
            conn = db.getConnection();
            int i = 0;
            ResultSet rs = conn.createStatement()
                    .executeQuery("SELECT * FROM module_info_table where rfid_tag_id = "   epcString);

            while (rs.next()) {
                String modulecode = rs.getString("module1_code");
                String moduleclass = rs.getString("module_class");
                String modulename = rs.getString("module1_name");
                String epc = rs.getString("rfid_tag_id");
                String timestamp = rs.getString("last_updated");

                System.out.println(modulecode);
                if (epcString.equals(epc)) {
                    data2 = FXCollections.observableArrayList();
                    data2.add(new UserDetails(epc, modulecode, moduleclass, modulename, timestamp));
                }
            }
            table.setItems(data2);
            table.refresh();

            db.closeConn();
        } catch (Exception e) {
            System.out.println(e);

        }

    }
public class PrintListener implements ReadListener {
    @Override
    public void tagRead(Reader r, TagReadData tr) {

        try {

            String epcString = tr.getTag().epcString();

            if (!map.containsKey(epcString)) {


                moduleInfo(epcString); < -- call to here


            }
            table.setItems(data);
            table.refresh();

        } catch (Exception e) {
            System.out.println(e);
        }
    }

}
  

Это мой tableview:

RFID-МЕТКА: 45

    EPC     Module Code   Module Class      Module Name         TimeStamp
   45      ET123       DCPE/FT/5D        Computer System     Mon Oct 4 01:13:23am
   -         -              -                  -                   -
   -         -              -                  -                   -
  

Новая RFID-метка: 100 (она перезапишет предыдущие записи)

    EPC     Module Code   Module Class      Module Name         TimeStamp
   100      ET468       DEEE/FT/8G       Computer Science     Mon Oct 4 01:13:23am
    -         -              -                  -                   -
    -         -              -                  -                   -
  

Как вы можете видеть на изображениях ниже:
Обнаружена первая RFID-метка, и она отобразит содержимое, как только оно совпадет с базой данных mysql

После обнаружения новой RFID-метки последняя RFID-метка перезаписывает старые записи, чего я не хочу, чтобы это произошло.

Обратите внимание, что в tableview много столбцов и строк, которые не отображаются, потому что мне пришлось обрезать, что заняло много места.

Ответ №1:

Вы перезаписываете data2 здесь:

 data2 = FXCollections.observableArrayList();
  

удалите его и поместите сюда

 public synchronized void moduleInfo(String epcString) {
    try {
        data2 = FXCollections.observableArrayList();
        conn = db.getConnection();
        int i = 0;
        ResultSet rs = conn.createStatement()
                .executeQuery("SELECT * FROM module_info_table where rfid_tag_id = "   epcString);

        while (rs.next()) {
            String modulecode = rs.getString("module1_code");
            String moduleclass = rs.getString("module_class");
            String modulename = rs.getString("module1_name");
            String epc = rs.getString("rfid_tag_id");
            String timestamp = rs.getString("last_updated");

            System.out.println(modulecode);
            if (epcString.equals(epc)) {

                data2.add(new UserDetails(epc, modulecode, moduleclass, modulename, timestamp));
            }
        }
        table.setItems(data2);
        table.refresh();

        db.closeConn();
    } catch (Exception e) {
        System.out.println(e);

    }
  

теперь это должно быть исправлено, если я не слепой: P

Комментарии:

1. Это все равно дало мне те же результаты

Ответ №2:

   public void initialize(URL location, ResourceBundle resources) {

    data2 = FXCollections.observableArrayList();

        epc.setCellValueFactory(new PropertyValueFactory<>("epcNo"));
        modCode.setCellValueFactory(new PropertyValueFactory<>("moduleCode"));
        modClass.setCellValueFactory(new PropertyValueFactory<>("moduleClass"));
        modName.setCellValueFactory(new PropertyValueFactory<>("moduleName"));
        timestamp.setCellValueFactory(new PropertyValueFactory<>("timestamp"));
  

Я протестировал размещение observablelist здесь, и это сработало!
Теперь я знаю, что data2 должен быть объявлен до while((rs.next)) Цикл