Табличное представление JFX, заполняющее данные из CSV, но не видимое в таблице - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь заполнить свое табличное представление JFX из файла CSV.

Я использовал конструктор сцены для проектирования представления.

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

public class FXMLDocumentController implements Initializable {

private Label label;
@FXML
private Button readCSVButton;
@FXML
private Button uploadDataButton;
@FXML
private Button cancelButton;
@FXML
private Button authenticateUserButton;
@FXML
private TextField userName;
@FXML
private PasswordField password;
@FXML 
private TableView<Record> tableView = new TableView<>();
@FXML 
private TableColumn <Record,String> col_ID;
@FXML 
private TableColumn <Record,String> col_barcode;
@FXML 
private TableColumn <Record,String> col_fileToDelete;
@FXML 
private TableColumn <Record,String> col_fileToUpload;
@FXML 
private TableColumn <Record,String> col_docType;
@FXML 
private TableColumn <Record,String> col_date;
@FXML 
private TableColumn <Record,String> col_requestBY;
@FXML 
private TableColumn <Record,String> col_status;

private void handleButtonAction(ActionEvent event) {
    System.out.println("You clicked me!");
    label.setText("Hello World!");
}

@Override
public void initialize(URL url, ResourceBundle rb) {
    // TODO
}

@FXML
private void readCSV(ActionEvent event) {

    UploadUtil uploadtUtil= new UploadUtil();
    FileChooser fileChooser = new FileChooser();
    File selectedFile=fileChooser.showOpenDialog(password.getScene().getWindow());

     col_ID.setCellValueFactory(new PropertyValueFactory<Record,String>("id"));
     col_barcode.setCellValueFactory(new PropertyValueFactory<Record,String>("barcode"));
     col_date.setCellValueFactory(new PropertyValueFactory<Record,String>("fileToDelete"));
     col_docType.setCellValueFactory(new PropertyValueFactory<Record,String>("fileToUpload"));
     col_fileToDelete.setCellValueFactory(new PropertyValueFactory<Record,String>("doctype"));
     col_fileToUpload.setCellValueFactory(new PropertyValueFactory<Record,String>("date"));
     col_requestBY.setCellValueFactory(new PropertyValueFactory<Record,String>("requestedBy"));
     col_status.setCellValueFactory(new PropertyValueFactory<Record,String>("status"));
     tableView.getItems().setAll(uploadtUtil.readCSV(selectedFile.getAbsolutePath())); 

}

@FXML
private void uploadData(ActionEvent event) {
}

@FXML
private void cancel(ActionEvent event) {
}

@FXML
private void authenticateUser(ActionEvent event) {
    if (userName.getText().equalsIgnoreCase("naveen") && password.getText().equalsIgnoreCase("1234")) {
        readCSVButton.disableProperty().set(false);
        userName.disableProperty().set(true);
        password.disableProperty().set(true);
    }
}

}

Файл FXML -

    <AnchorPane id="AnchorPane" fx:id="anchorPane" prefHeight="685.0" prefWidth="1091.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.dfg.ui.FXMLDocumentController">
   <children>
      <SplitPane dividerPositions="0.2783661119515885" layoutX="14.0" layoutY="14.0" orientation="VERTICAL" prefHeight="663.0" prefWidth="1064.0">
        <items>
          <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="96.0" prefWidth="422.0">
               <children>
                  <Label layoutX="51.0" layoutY="42.0" prefHeight="17.0" prefWidth="152.0" text="User Name :" />
                  <Label layoutX="51.0" layoutY="82.0" prefHeight="17.0" prefWidth="152.0" text="Password   :" />
                  <Button fx:id="readCSVButton" disable="true" layoutX="581.0" layoutY="135.0" mnemonicParsing="false" onAction="#readCSV" prefHeight="32.0" prefWidth="149.0" text="Read Data from CSV" />
                  <Button fx:id="uploadDataButton" disable="true" layoutX="740.0" layoutY="134.0" mnemonicParsing="false" onAction="#uploadData" prefHeight="32.0" prefWidth="149.0" text="Upload Data to Savvion" />
                  <Button fx:id="cancelButton" cancelButton="true" layoutX="900.0" layoutY="134.0" mnemonicParsing="false" onAction="#cancel" prefHeight="32.0" prefWidth="149.0" text="Cancel" />
                  <TextField fx:id="userName" layoutX="136.0" layoutY="39.0" prefHeight="26.0" prefWidth="188.0" />
                  <PasswordField fx:id="password" layoutX="135.0" layoutY="78.0" prefHeight="26.0" prefWidth="188.0" />
                  <Button fx:id="authenticateUserButton" layoutX="422.0" layoutY="135.0" mnemonicParsing="false" onAction="#authenticateUser" prefHeight="32.0" prefWidth="149.0" text="Authenticate User" />
               </children>
            </AnchorPane>
          <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0">
               <children>
                  <TabPane prefHeight="473.0" prefWidth="1062.0" tabClosingPolicy="UNAVAILABLE">
                    <tabs>
                      <Tab text="Data">
                        <content>
                          <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
                                 <children>
                                    <TableView fx:id="dataTable" prefHeight="415.0" prefWidth="1062.0">
                                      <columns>
                                        <TableColumn fx:id="col_ID" prefWidth="75.0" text="ID" />
                                        <TableColumn fx:id="col_barcode" prefWidth="75.0" text="Barcode" />
                                          <TableColumn fx:id="col_fileToDelete" prefWidth="150.0" text="File to Delete" />                                       
                                          <TableColumn fx:id="col_fileToUpload" prefWidth="196.0" text="File to Upload" />
                                          <TableColumn fx:id="col_docType" minWidth="0.0" prefWidth="104.0" text="Doc Type" />
                                          <TableColumn fx:id="col_date" minWidth="0.0" prefWidth="118.0" text="Date" />
                                          <TableColumn fx:id="col_requestBY" minWidth="0.0" prefWidth="191.0" text="Requested by" />
                                          <TableColumn fx:id="col_status" prefWidth="152.0" text="Status" />
                                      </columns>
                                    </TableView>
                                 </children>
                              </AnchorPane>
                        </content>
                      </Tab>
                      <Tab text="Logs">
                        <content>
                          <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
                        </content>
                      </Tab>
                    </tabs>
                  </TabPane>
               </children>
            </AnchorPane>
        </items>
      </SplitPane>
   </children>
</AnchorPane>

Класс записи-

  public class Record {


            public Record(String id, String barcode, String fileToDelete, String fileToUpload, String doctype, String date, String requestedBy, String status) {
            this.id = id;
            this.barcode = barcode;
            this.fileToDelete = fileToDelete;
            this.fileToUpload = fileToUpload;
            this.doctype = doctype;
            this.date = date;
            this.requestedBy = requestedBy;
            this.status = status;
        } private String  id;
            private String barcode;
            private String fileToDelete;
            private String fileToUpload;
            private String doctype;
            private String date;
            private String requestedBy;
            private String status;


            public void setId(String id) {
                this.id = id;
            }

            public void setBarcode(String barcode) {
                this.barcode = barcode;
            }

            public void setFileToDelete(String fileToDelete) {
                this.fileToDelete = fileToDelete;
            }

            public void setFileToUpload(String fileToUpload) {
                this.fileToUpload = fileToUpload;
            }

            public void setDoctype(String doctype) {
                this.doctype = doctype;
            }

            public void setDate(String date) {
                this.date = date;
            }

            public void setRequestedBy(String requestedBy) {
                this.requestedBy = requestedBy;
            }

            public void setStatus(String status) {
                this.status = status;
            }

            public String getId() {
                return id;
            }

            public String getBarcode() {
                return barcode;
            }

            public String getFileToDelete() {
                return fileToDelete;
            }

            public String getFileToUpload() {
                return fileToUpload;
            }

            public String getDoctype() {
                return doctype;
            }

            public String getDate() {
                return date;
            }

            public String getRequestedBy() {
                return requestedBy;
            }

            public String getStatus() {
                return status;
            }

    }

вспомогательный класс-

 public class UploadUtil {

        public ObservableList<Record> readCSV(String filePath) {

            ObservableList<Record> dataList = FXCollections.observableArrayList();
            String FieldDelimiter = ",";

            BufferedReader br;

            try {
                br = new BufferedReader(new FileReader(filePath));

                String line;
      Integer id = 0;
                while ((line = br.readLine()) != null) {
                    if (id > 0) {
                        String[] fields = line.split(FieldDelimiter, -1);

                        Record record = new Record(id.toString(), fields[0], fields[1], fields[2],
                                fields[3], fields[4], fields[5], "Ready for Upload");
                        dataList.add(record);
                    }
                    id++;
                }

            } catch (FileNotFoundException ex) {

            } catch (IOException ex) {

            }
            return dataList;
        }
    }

Я отладил код, и значения извлекаются из файла CSV и задаются в таблице, но не отображаются.

1 Ответ

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

Я скопировал и вставил ваш код и смог воспроизвести проблему.

Следующие исправления необходимы для получения рабочего кода.

  1. Идентификатор табличного представлениядолжно быть таким же, как определенное поле:

    <TableView fx:id="tableView"
    
  2. Не создавать представление таблицы вручную:

       @FXML
       private TableView<Record> tableView;
    
  3. Для некоторыхПо этой причине кнопка была отключена.Я изменил на включен:

    <Button fx:id="readCSVButton" disable="false"
    

Достаточно исправить упомянутую проблему.Я издевался над методом readCSV() и могу видеть обновленную таблицу по тестовым данным.

Также я бы порекомендовал также следующие улучшения:

  1. Вызов setCellValueFactory() один разво время инициализации панели также смотрите фиксированные идентификаторы для некоторых столбцов:

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        col_ID.setCellValueFactory(new PropertyValueFactory<>("id"));
        col_barcode.setCellValueFactory(new PropertyValueFactory<>("barcode"));
        col_date.setCellValueFactory(new PropertyValueFactory<>("date"));
        col_docType.setCellValueFactory(new PropertyValueFactory<>("docType"));
        col_fileToDelete.setCellValueFactory(new PropertyValueFactory<>("fileToDelete"));
        col_fileToUpload.setCellValueFactory(new PropertyValueFactory<>("fileToUpload"));
        col_requestBY.setCellValueFactory(new PropertyValueFactory<>("requestedBy"));
        col_status.setCellValueFactory(new PropertyValueFactory<>("status"));
    }
    
  2. Сделайте readCSV() статическим и верните тип List:

    static List<Record> readCSV(String filePath) {
    

    В этом случае вам не следует каждый раз создавать UploadUtil объект.Интерфейса List достаточно для метода tableView.getItems().setAll().

  3. Обеспечить защиту на случай, когда пользователь не выбрал файл:

    if (selectedFile != null) { 
        tableView.getItems().setAll(
            uploadtUtil.readCSV(selectedFile.getAbsolutePath()));
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...