2013-10-23 7 views
-1

데이터베이스에 큰 BLOB를 넣는 동안 FXML에 포함 된 "진행 창"을 약간 보여주고 싶습니다.JavaFX - "진행 창"

문제는 삽입이 실행될 때까지 창이 나타나지 않는 것입니다.

FXML 로더가 너무 느려서 문제가 될 수도 있습니다. 그 때문에 창을 표시 할 수 없습니다.

또한 ProgressIndicator를 직접 내 양식의 FXML에 추가하고 작업 버튼을 누르면 표시되도록했습니다.

동일한 것 - .setVisible 삽입이 완료 될 때까지 메서드가 작동하지 않습니다.

이것은 매우 털이 많은 문제입니다.

관리 도구를 개발 중이며 사용자가 큰 파일을 삽입하도록 허용하고 진행 중인지 여부에 관계없이 응답하지 않습니다!

누구나이 문제에 대한 해결책이 있다면 괜찮을까요?

고마워요!

+1

DB 작업은 JavaFX UI 스레드가 아닌 다른 스레드에서 수행해야합니다. 그렇지 않으면 UI는 DB 작업이 완료 될 때까지 일시적으로 대기/고정됩니다. 이 [검색 결과] (http://stackoverflow.com/search?q=%5Bjavafx%5D+or+%5Bjavafx-2%5D+progress+bar+task+is%3Aquestion)를 조사하십시오. –

+0

음 ... 이제 점점 더 복잡해 졌어.하지만 ... 힌트를 주셔서 감사합니다! – downdrown

답변

3

음 ... Uluk Biy에서 힌트를 얻은 후에 나는 주변에서 시도하기 시작했습니다. 6 시간 후 나는 다음과 같이 트릭을했다 :

이것은 필요한 작업을 반환하는 나의 방법이다.

public static Task saveNewAccoounting(final Accounting a){ 
    Task<Integer> saveNewAccountingTask = new Task<Integer>() { 
     @Override protected Integer call() throws Exception { 
      try { 
       run.logger.log(Level.FINE, "Started saveNewAccounting Task!"); 
       PreparedStatement newAcc; 
         newAcc = Connect.con.prepareStatement("INSERT INTO `ACCOUNTING`(`ACCNUMBER`, `ACCDATE`, `SHOP`, `CUSTOMER`, `CATEGORIES`, `WRITTENBY`, `DATE`, `DESCRIPTION`, `NOTE`, `PRICE`, `FILEORIGINAL`, `FILEBYTE`) VALUES (null,null,?,?,?,?,?,?,?,?,?,?)"); 
         newAcc.setInt(1, a.getShop()); 
         newAcc.setInt(2, a.getCustomer()); 
         newAcc.setInt(3, a.getCategories()); 
         newAcc.setInt(4, Credentials.getUserid()); 
         newAcc.setDate(5, a.getDate()); 
         newAcc.setString(6, a.getDescription()); 
         if (a.getNote().equals("")){ 
         newAcc.setNull(7, java.sql.Types.VARCHAR); 
         } else { 
         newAcc.setString(7, a.getNote());  
         } 
         newAcc.setDouble(8, a.getPrice()); 
         if(a.getAttachment() != null){ 
          newAcc.setString(9, a.getAttachment().getName()); 
          newAcc.setBlob(10, new FileInputStream(a.getAttachment())); 
         } else { 
          newAcc.setNull(9, java.sql.Types.VARCHAR); 
          newAcc.setNull(10, java.sql.Types.BLOB); 
         } 
         if(!newAcc.execute()){ 
          newAcc.close(); 
          run.logger.log(Level.FINE, "Successfully completed saveNewAccounting Task!"); 
          return 1; 
         } else { 
          newAcc.close(); 
          run.logger.log(Level.FINE, "Completed saveNewAccounting Task with Failures!"); 
          return 0; 
         } 
      } catch (SQLException ex) { 
       run.dblogger.log(Level.SEVERE, ex.getMessage()); 
       run.logger.log(Level.FINE, "Completed saveNewAccounting Task with Failures!"); 
       return 0; 
      } catch (FileNotFoundException f){ 
       run.iologger.log(Level.SEVERE, f.getMessage()); 
       run.logger.log(Level.FINE, "Completed saveNewAccounting Task with Failures!"); 
       return 0; 
      } 
     } 
    }; 
    return saveNewAccountingTask; 
} 

당신이해야 할 일은 반환 된 작업으로 스레드를 인스턴스화하고 실행하기 만하면됩니다.

//Make your Progress visible here 
final Task saveTask = SaveTasks.saveNewAccoounting(acc); 
Thread saveThread = new Thread(saveTask); 
saveThread.setDaemon(true); 
saveThread.start(); 

이제 Listener를 작업에 추가하면 작업이 완료됩니다.

희망이 있으면 나중에 도움이 될 것입니다.