2014-11-27 3 views
0

У меня есть много вещей, реализованных в ComponentAdapter Java. Поскольку он загружает данные из базы данных и отображает их в JTable, я добавил их в другой поток. Я покажу вам один метод, который вызывается таким ComponentAdapterПриложение замораживается, когда база данных называется

private class DisplayInitialRevenue_Thread implements Runnable 
    { 

     @Override 
     public void run() 
     { 
      displayInitialRevenue_Method(); 
     } 

    } 

    private void displayInitialRevenue_Method() 
    { 
     //Get the dates from the combo 
     String selectedCouple = revenueYearCombo.getSelectedItem().toString(); 

     if(selectedCouple.equals("Select Year")) 
     { 
      return; 
     } 

     String[] split = selectedCouple.split("/"); 


     //Related to DB 
     double totalamountInvested; 



      //Get data from the database 
      dbConnector = new DBHandler(); 
      dbConnector.makeConnection(); 

      DefaultTableModel model = (DefaultTableModel) initialRevenueTable.getModel(); 
      model.setRowCount(0); 



      ResultSet selectAllDetails = dbConnector.selectAllDetails("SQL CODE HERE "); 

      try 
      { 
       if(selectAllDetails.isBeforeFirst()==false) 
       { 
        JOptionPane.showMessageDialog(null,"This table is empty"); 
       } 
       else 
       { 
        while(selectAllDetails.next()) 
        { 
         String clientName = selectAllDetails.getString("Client Name"); 
         String providerName = selectAllDetails.getString("Provider Name"); 
         Double amountInvested = selectAllDetails.getDouble("Invest_Amount"); 


         //Get Other Data 


         //Update the table 
         Object[]row = {dateS,clientName,providerName,amountInvested}; 

         model.addRow(row); 

         //Get the total 
         amountInvested = amountInvested+amountInvested; 

        } 

        //Add the sum 
        Object[]blankRow = {null,null,null,null}; 
        model.addRow(blankRow); 

         Object[]row = {dateS,clientName,providerName,amountInvested}; 
       } 
      } 
      catch(SQLException sql) 
      { 
       JOptionPane.showMessageDialog(null,sql.getLocalizedMessage()); 
      } 
    } 

И это выше нить можно назвать 3 способами. То есть на ItemListener прилагается к JComboBox, ActionListener прилагается к JMenu и ComponentListener.

ComponentListener

private class DisplayInitialRevenue extends ComponentAdapter 
    { 
     public void componentShown(ComponentEvent e) 
     { 
      formMemorizer = FormMemorizer.Initial_Revenue; 
      //displayInitialRevenue_Method(); 

      DisplayInitialRevenue_Thread t = new DisplayInitialRevenue_Thread(); 
      t.run(); 
     } 


    } 

ItemListener

private class RevenueYearComboAction implements ItemListener 
    { 

     @Override 
     public void itemStateChanged(ItemEvent e) 
     { 
      if(e.getStateChange() == ItemEvent.SELECTED) 
      { 
       int selection = formMemorizer; 

       if(selection==-1) 
       { 
        return; 
       } 
       else if(selection==FormMemorizer.Initial_Revenue) 
       { 
        //displayInitialRevenue_Method(); 
        DisplayInitialRevenue_Thread t = new DisplayInitialRevenue_Thread(); 
        t.run(); 
       } 
     } 
} 

У меня есть много такого рода методов, чтобы получить данные из базы данных и кормить JTable: и принимать данные из графического интерфейса и сохранить в базе данных.

Теперь, мой вопрос в том, что все это иногда замерзает, когда происходит вызов базы данных. Я думал, что это Bcs проблемы Thread, поэтому я сделал выше DisplayInitialRevenue_Thread для вызова displayInitialRevenue_Method() в качестве теста. Затем я вызывал только область, связанную с вызовом этого метода, но иногда зависает! Мои другие методы базы данных не находятся в отдельных потоках, но это метод, поэтому почему даже вызов «только» этого метода приводит к его замораживанию? Это в потоке!

Для заметки стороны, я нахожусь на Java 8, используя версию MySQL Server: 5.6.16 - Сервер сообщества MySQL (GPL), который поставляется с XAMPP.

+0

пожалуйста, где замерзает, есть некоторый JProfiler используется, как, Что выход из, но описания говорить о блокировании EDT, :-) Oracle учебника - Event диспетчерского тему, мое предложение дон 't использовать SwingWorker для производственного кода, – mKorbel

+0

голосование закрывается как слишком широкое – mKorbel

+0

@mKorbel: В одном из нижеприведенных ответов говорится: «Используйте SwingWorker» –

ответ

2

Вызов t.start(), чтобы начать новый Thread, вызывая Thread#run делает ничего более не вызывает run метод Thread в том же контексте нить ...

Сказав, что свинг не поточно, Swing требует, чтобы все обновления для пользовательского интерфейса выполняются из контекста потока Dispatching Event. Вместо использования Thread вы должны рассмотреть возможность использования SwingWorker, который позволяет выполнять длительные задачи в фоновом потоке, но который обеспечивает удобство использования методов и вызовов done, когда он завершается, которые выполняются в контексте EDT для вас.

См Worker Threads and SwingWorker для более подробной информации

+0

Слава богу, что вы здесь ... Пожалуйста, дайте мне больше советов .. –

+0

* «Пожалуйста, дайте мне больше советов» * - Не делайте то, что вы делаете , используйте 'SwingWorker'. Возможно, вам захочется прочитать [Кодовые обозначения для языка программирования Java TM] (http://www.oracle.com/technetwork/java/codeconvtoc-136057.html), это облегчит людям читать ваш код, а для вас читать другие – MadProgrammer

+0

:-) не использовать SwingWorker для JDBC, предназначен для использования – mKorbel

Смежные вопросы