Процесс platform.runLater не может отображаться в метке или тексте FXML - PullRequest
0 голосов
/ 15 октября 2018

Я хочу, чтобы отображались данные импорта данных из Excel в данные в формате Label или Text FXML.Процесс может отображаться в командной строке, но для текста или метки FXML может отображать только последние данные.

Это мой код:

package com.donykis.datasaham.view;

import com.donykis.datasaham.interfaces.KoneksiDB;
import javafx.application.Platform;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.text.Text;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Row;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ResourceBundle;

public class RuangUploadHargaSahamController implements Initializable {

    private Stage dialogStage;
    public  File selectedFile;
    @FXML
    public  Text actionStatus;
    @FXML
    public  Label lbltext;
    @FXML
    public TextField actionText;
    @FXML
    private Button Btnupload;
    @FXML
    private Button Btncancel;

    public RuangUploadHargaSahamController() {
    }

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

    }


    @FXML
    private void btnImport(ActionEvent event) throws FileNotFoundException, IOException {


        FileChooser fileChooser = new FileChooser();
        fileChooser.setTitle("Pilih File Excel");
        FileChooser.ExtensionFilter extFilter = new 
FileChooser.ExtensionFilter("Excel files (*.xls)", "*.xls");
        fileChooser.getExtensionFilters().add(extFilter);
        selectedFile = fileChooser.showOpenDialog(dialogStage);

        if ( selectedFile != null) {

            System.out.println("File selected: " + selectedFile.getName());
            String stringText = selectedFile.getName();
            lbltext.setText("File selected: " + stringText);
            actionStatus.setText("File selected: " + stringText);
            startTask();


        } else {
 //           actionStatus.setText("File selection cancelled.");
            lbltext.setText(null);
            actionStatus.setText(null);
        }

    }

В приведенном выше коде я хочу убедиться, что файлможно прочитать, как на картинке ниже, поэтому я знаю имя файла, который был взят Image 1

Затем файл читается и выполняется, когда данные из Excel извлекаются и вводятся вбаза данных.Я пытался использовать FXML Label и Text.

Затем код обрабатывает данные из Excel в базу данных вместе со следующим кодом:

public void startTask()
    {
// Create a Runnable
Runnable task = new Runnable()   
{      
public void run()
{
   runTask();  
           }
       };

       // Run the task in a background thread
       Thread backgroundThread = new Thread(task);

       // Terminate the running thread if the application exits
       backgroundThread.setDaemon(true);

       // Start the thread
       backgroundThread.start();

   }

   public void runTask()
  {

       final int[] i = new int[1];
       int numRow;
       Label lblRow1;
       Connection con;
       PreparedStatement s5 = null;
       final PreparedStatement[] s6 = {null};
       con = KoneksiDB.getKoneksi();  
       FileInputStream input = null;
       try {
         input = new FileInputStream(new File(String.valueOf(selectedFile)));
   } catch (FileNotFoundException e) {
      e.printStackTrace();
    }
   POIFSFileSystem fis = null;
   try {
       fis = new POIFSFileSystem(input);
  } catch (IOException e) {
       e.printStackTrace();
   }
   HSSFWorkbook workbook = null;
   try {
       workbook = new HSSFWorkbook(fis);
   } catch (IOException e) {
       e.printStackTrace();
   }
   HSSFSheet sheet = workbook.getSheetAt(0);
   numRow = sheet.getPhysicalNumberOfRows();
   final Row[] row = new Row[1];
   {
      try
      {
          // Get the Status


        // Update the Label on the JavaFx Application Thread
           Platform.runLater(new Runnable()
           {
                  @Override
                  public void run()
                  {
                      for (i[0] = 1; i[0] <= sheet.getLastRowNum(); i[0]++) 
{
                          row[0] = sheet.getRow(i[0]);

                          String col9 = 
row[0].getCell(1).getStringCellValue();
                         double col10 = 
row[0].getCell(9).getNumericCellValue();

                       String sqlcommand9 = "UPDATE hg_saham SET 
harga_harian= '" + col10 + "' WHERE kode_saham='" + col9 + "'";

                       try {
                           s6[0] = (PreparedStatement) 
con.prepareStatement(sqlcommand9);
                       } catch (SQLException e) {
                           e.printStackTrace();
                       }
                       try {
                           s6[0].addBatch();
                       } catch (SQLException e) {
                           e.printStackTrace();
                       }
                       try {
                           s6[0].executeBatch();
                       } catch (SQLException e) {
                           e.printStackTrace();
                       }
                       System.out.println("Processing " + i[0] + " of " + 
sheet.getLastRowNum());

                    }
                   String status = "Processing " + i[0] + " of " + 
sheet.getLastRowNum();
                   actionStatus.setText(status);
                   lbltext.setText(status);
               }
           });

           Thread.sleep(1000);

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


   @FXML
   private void handleKembali(ActionEvent event) {
       dialogStage.close();

   }
   public void setDialog(Stage dialogStage) {
    this.dialogStage = dialogStage;
   }
}

В командной строке этот процесс четко видени работает хорошо, как на картинке Image 2

В тексте и на этикетке будут отображаться только последние данные, как на изображении

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...