2016-07-21 5 views
0

Java 데이터베이스에서 일부 정보를 검색 한 다음 응용 프로그램을 화면의 JTable에 표시하는 Java 응용 프로그램을 만들고 있습니다.결과 집합이 JTable에 항상 표시되지 않는 경우

정보를 가져 와서 DefaultListModel <에 넣으려는 코드는 아래와 같습니다. 그런 다음 DefaultListModel <>이 정보를 화면에 표시하는 JTable에 공급됩니다.

SwingWorker<Void, Void> worker = new SwingWorker< Void, Void>() { 

     @Override 
     public Void doInBackground() { 

      String SQL = "SELECT * FROM AddABill"; 

      try { 
       Statement stmt = GlobalVars.conn.createStatement(); 

       ResultSet rs = stmt.executeQuery(SQL); 

       menuOptions.clear(); 

       while(rs.next()){ 

        menuOptions.addElement(rs.getString(1) + " - " + rs.getString(2)); 
       } 

       rs.close(); 
       stmt.close(); 
      } 

      catch (SQLException e) { 
       System.out.println("An Error Was Detected! :/"); 
      } 

      return null; 
     } 

     @Override 
     public void done(){ 
      loadingGif.setVisible(false); 
     } 

    }; 

    worker.execute(); 

내가 겪고있는 문제는 정보가 화면에 표시되는 경우가 있으며 때로는 그렇지 않은 경우입니다. 사용 된 쿼리에 변경 사항이 없으므로 MySQL 연결과 관련이 있다고 가정합니다.

JTable로하고 MenuOptions이

menuOptions = new DefaultListModel<>(); 
menuOptions.addElement(""); 

menuList = new JList<>(menuOptions); 
menuList.setFont(new Font("Myriad Hebrew", Font.PLAIN, 32)); 
menuList.setBackground(Color.decode("#005952")); 
menuList.setForeground(Color.decode("#BEC423")); 
menuList.setSelectionBackground(Color.decode("#660033")); 
menuList.setSelectionForeground(Color.decode("#FFFFFF")); 

같은 설정이 그래서 궁금 문제는 내가 정보가 항상 화면에 표시되어 있는지 확인 할 수있는 방법입니다 수 있습니다. 표시되고 표시되지 않는 그림은 아래와 같습니다.

표시 :

Displayed

을 표시하지 않음 :

마지막 주에 Not Displayed

내가이 때까지 코드를 실행 다시 계속해야 보여주기 위해 정보를 얻을 수 결국 나타났다.

도움을 주시면 감사하겠습니다. 도움말들에 대한

+2

1.'doInBackground()'안에있는 모든 것은'EDT' 밖에 있습니다.'publish()'--->'process()','setProcess()'또는'done() ',''JTable'! = DefaultListModel' 3.'DefaultListModel'을 리셋하기 위해서,'publish() ---> process()','setProcess()'또는'done() 내부에서'SwingWorker'를 실행하십시오. ''DefaultListModel'에 새'Item'을 추가하고, 코드 나 설명에 아무것도 쓰지 않습니다. – mKorbel

+0

@mKorbel 1) 나머지 애플리케이션에서는'doInBackground()'의 GUI 변경 사항이 적용되었습니다. 2)'DefaultListMenu'가'JTable'에 정보를 제공한다는 것을 알고 있습니다. 'doInBackground()'함수에서 코드를 변경했기 때문에 문제가 발생한 경우 가끔은 제대로 동작하지 않는 경우가 종종 있습니다. – thomasjcf21

+1

_sometimes_에서 작동하지만 신뢰할 수 없습니다. 더 [여기] (http://stackoverflow.com/a/7158505/230513) 및 [여기] (http://stackoverflow.com/a/38499763/230513). – trashgod

답변

0

@trashgod @mKorbel

덕분에, 나는 다() 함수에서 테이블에 정보를 추가하여 문제를 해결했다. 코드는

SwingWorker<Void, Void> worker = new SwingWorker< Void, Void>() { 

     String[] billItems = null; 

     @Override 
     public Void doInBackground() { 

      String SQL = "SELECT * FROM AddABill"; 

      try { 
       Statement stmt = GlobalVars.conn.createStatement(); 

       ResultSet rs = stmt.executeQuery(SQL); 

       //Set The Cursor To Last Position 
       rs.last(); 

       int totalRows = rs.getRow(); 

       billItems = new String[totalRows]; 

       //Set The Cursor Back To The Start 
       rs.beforeFirst(); 

       while(rs.next()){ 
        int rowNum = rs.getRow() - 1; 
        billItems[rowNum] = rs.getString(1) + " - " + rs.getString(2); 
       } 

       rs.close(); 
       stmt.close(); 
      } 

      catch (SQLException e) { 
       System.out.println("An Error Was Detected! :/"); 
      } 

      return null; 
     } 

     @Override 
     public void done(){ 
      menuOptions.clear(); 

      for(int i = 0; i < billItems.length; i++){ 
       menuOptions.addElement(billItems[i]); 
      } 

      loadingGif.setVisible(false); 
     } 

    }; 

감사합니다 아래

토마스입니다.