#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)) Цикл