2012-07-07 59 views
0

如何將SQL連接傳遞給Action Listener。我想要一個無限循環,睡100ms。假設循環的每一次迭代都要查詢數據庫。擺動計時器是做這件事的最好方法嗎?如果是的話,我怎樣才能將連接傳遞給Action Listener。如果沒有,有人可以請告知如何做到這一點。非常感謝。將SQL連接傳遞給ActionListener(線程)

代碼:

public static void main(String[] args) throws InterruptedException { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        AdminManager frame = new AdminManager(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

      } 
     }); 

     BoneCP connectionPool = null; 
     Connection connection = null; 

     try { 
      Class.forName("com.mysql.jdbc.Driver"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return; 
     } 

     try { 
      // setup the connection pool 
      BoneCPConfig config = new BoneCPConfig(); 
      config.setJdbcUrl("jdbc:mysql://192.162.0.0"); 
      config.setUsername("root"); 
      config.setPassword(""); 
      connectionPool = new BoneCP(config); // setup the connection pool 

      connection = connectionPool.getConnection(); // fetch a connection 

      if (connection != null){ 
       System.out.println("Connection successful!"); 
      } 

     } catch (SQLException e) { 
      e.printStackTrace(); 
     } finally { 
      if (connection != null) { 
       try { 
        connection.close(); 
       } catch (SQLException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 


     // Define listner 
     ActionListener taskPerformer = new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent evt) { 
       //...Perform a task... 

       String sql = "SELECT * table;"; 
       Statement st = connection.createStatement(); 
       ResultSet rs = st.executeQuery(sql); 
       while(rs.next()) { 
        String symbol = rs.getString("name"); 
        System.out.println(symbol); 
       } 

      } 
      }; 
     Timer timer = new Timer(100 , taskPerformer); 
     timer.setRepeats(true); 
     timer.start(); 

     Thread.sleep(1000); 

     //connectionPool.shutdown(); // shutdown connection pool. 
} 
+0

你爲什麼使用'javax.swing.Timer'?我沒有看到你在使用任何Swing組件。也許你應該使用'Executors' /'ScheduledExecutorService'類? – user1329572 2012-07-07 21:07:44

回答

1

不要javax.swing.Timer類定期執行非Swing任務。相反,使用ScheduleExecutorService

ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor(); 
exec.schedule(new Runnable(){ 
    @Override 
    public void run(){ 
     // query database 
    } 
}, 0, 100, TimeUnit.MILLISECONDS); 
+0

所以我應該把ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();部分在我的主類,然後把其餘的另一種方法,並調用該方法? – scriptdiddy 2012-07-07 21:46:17

+0

好的,但是如何將連接傳遞到ScheduledExecutorService? – scriptdiddy 2012-07-08 17:32:19

1

如果後臺任務必須不斷更新Swing組件,使用SwingWorkerprocess()定期更新組件的模型。在此example中,使用從H2數據庫獲得的數據更新JTextArea