2017-10-23 5 views
0

Ich schrieb den folgenden Code ein, dass ich dachte funktionieren würde, ich wollte eine neue JFrame auf einer Schaltfläche klicken öffnen, die einen Fortschrittsbalken zeigt, das aktualisiert wird:Wie man JProgressBar mit SwingWorker reparieren kann?

b3.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
    int numOfRows = getRows();//function that returns number of rows 
    int numOfColumns = getColumns();//function that returns number of columns 

    String myquery = "select * from foo_table"; 
    rs = null;   
    try { 
     rs = st.executeQuery(myquery); 
     // extract column information 
     ResultSetMetaData rsmd = rs.getMetaData(); 
     int columnCount = rsmd.getColumnCount(); 
     columnData = new ArrayList<String>(columnCount); 
     for (int i = 1; i <= columnCount; i++) { 
     columnData.add(rsmd.getColumnName(i)); 
     } 
     // sql result data 
     table_ResQues.setModel(new ListTableModel(Collections.<List<Object>>emptyList(), Collections.<String>emptyList())); 
     rowData = new ArrayList<List<Object>>(); 
     final JFrame progFrame = new JFrame("Processing..."); 
     JPanel mainPPanel = new JPanel(new BorderLayout()); 
     JProgressBar progBar = new JProgressBar(0,100); 
     progFrame.setBounds(850,300,400,100); 
     progFrame.setVisible(true);  
     progBar = new JProgressBar(0,100); 
     mainPPanel.add(progBar, BorderLayout.NORTH); 
     progFrame.add(mainPPanel); 
     progFrame.setVisible(true); 

     int countRows = 0; 
     int area = numOfRows*numOfColumns; 
     int totalTime = area % 200000; 
     int xPerSec = totalTime/100; 

     while (rs.next()) { 
     row = new ArrayList<Object>(columnCount); 
     for (int i = 0; i < columnCount; i++) { 
      row.add(rs.getObject(i + 1)); 
     } 
     rowData.add(row); 
     countRows++; 
     if(countRows*numOfColumns == 200000){ 
      progBar.setValue(xPerSec++); 
      countRows = 0; 
     } 
     }  
     table_ResQues.setModel(new ListTableModel(rowData, columnData)); 

    }catch (SQLException e1) { 
     JOptionPane.showMessageDialog(frame, e1.getMessage(), "SQL Exception", JOptionPane.ERROR_MESSAGE); 
     e1.printStackTrace(); 
    }  
    }); 

Aber wenn ich mein Problem googeln erkennen, dass es eine ist Threading-Problem, und ich hatte nie Erfahrung mit Threading oder SwingWorker, kann mir jemand helfen, was ich mit SwingWorker implementieren will? Sollte meine While-Schleife die sein, die im Hintergrund läuft? sollte es eine Klasse für sich sein? Tut mir leid, ich bin wirklich verwirrt.

+1

Einen Schritt zurück für eine Sekunde. Sie müssen zunächst die UI-Logik von der Datenbanklogik trennen. Die gesamte Datenbanklogik muss in die "doInBackground" -Methode des "SwingWorker" gehen. Sie müssen dann den Fortschritt "veröffentlichen", der von der "process" -Methode verwendet wird, um die Benutzeroberfläche zu aktualisieren, und schließlich können Sie in der 'done'-Methode die von der' doInBackground'-Methode zurückgegebenen Ergebnisse abrufen – MadProgrammer

+1

* " Öffnen Sie einen neuen JFrame "* Siehe [Die Verwendung mehrerer JFrames, gute/schlechte Praxis?] (http://stackoverflow.com/q/9554636/418556) –

Antwort

0

Ich habe es gelöst, indem ich eine neue Klasse erstellt habe, die SwingWorker erweitert und seine Methoden überschreibt. Danke für die Hilfe in den Kommentaren.