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