In questo momento, il mio principale chiama solo una GUI con 10 righe. Sulla base di quante di queste righe hanno il testo, vengono chiamate 1 delle 9 classi (due righe devono avere il testo). La classe chiamata esegue calcoli a cui vorrei associare la barra di avanzamento. Ecco un esempio di una delle classi chiamate (ogni classe è simile, ma abbastanza diversa da giustificare una nuova classe.) Credo che il problema sia una violazione delle regole EDT, ma tutti gli esempi che ho visto su di essi riguardano una discussione. La cornice viene visualizzata quando viene eseguito il codice, ma la barra di avanzamento non si aggiorna fino al completamento di tutti i calcoli.È possibile utilizzare una barra di avanzamento in una classe esterna a main?
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class twoLoan extends JFrame {
static JFrame progressFrame;
static JProgressBar progressBar;
static Container pane;
double amountSaved = 0;
int i = 0;
public void runCalcs(Double MP, Double StepAmt,
Double L1, Double L2, Double C1, Double C2,
Double IM1, Double IM2, Double M1Start, Double M2Start) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
}
int iterations = (int) (MP - (M1Start * M2Start));
//Create all components
progressFrame = new JFrame("Calculation Progress");
progressFrame.setSize(300, 100);
pane = progressFrame.getContentPane();
pane.setLayout(null);
progressFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
progressBar = new JProgressBar(0, iterations);
//Add components to pane
pane.add(progressBar);
//Position controls (X, Y, width, height)
progressBar.setBounds(10, 10, 280, 20);
//Make frame visible
progressFrame.setResizable(false); //No resize
progressFrame.setVisible(true);
double M1 = M1Start;
double M2 = M2Start;
// Set MinLoop as maximum to start
// Loan 1
double N1 = (Math.log10(1 - IM1 * L1/M1) * -1)/Math.log10(1 + IM1);
double M1Sum = M1 * N1;
// Loan 2
double N2 = (Math.log10(1 - IM2 * L2/M2) * -1)/Math.log10(1 + IM2);
double M2Sum = M2 * N2;
double minLoop = M1Sum + M2Sum;
double MTotal = 0;
// Define variables for mins
double MP1 = 0;
double MP2 = 0;
double NP1 = 0;
double NP2 = 0;
double MP1Sum = 0;
double MP2Sum = 0;
while (M1 <= MP - M2Start && M2 >= M2Start) {
N1 = (Math.log10(1 - IM1 * L1/M1) * -1)/Math.log10(1 + IM1);
M1Sum = N1 * M1;
N2 = (Math.log10(1 - IM2 * L2/M2) * -1)/Math.log10(1 + IM2);
M2Sum = N2 * M2;
MTotal = M1Sum + M2Sum;
if (MTotal < minLoop) {
minLoop = MTotal;
MP1 = M1;
MP2 = M2;
NP1 = N1;
NP2 = N2;
MP1Sum = M1Sum;
MP2Sum = M2Sum;
} // end if
M1 = M1 + StepAmt;
M2 = MP - M1;
// Reset monthly sums
M1Sum = 0;
M2Sum = 0;
i++;
progressBar.setValue(i);
progressBar.repaint();
if (i >= iterations) {
progressFrame.dispose();
}
} // end while
// if there's a value for current payments, calculate amount saved
if (C1 > 0) {
double CN1 = (Math.log10(1 - IM1 * L1/C1) * -1)/Math.log10(1 + IM1);
double CT1 = CN1 * C1;
double CN2 = (Math.log10(1 - IM2 * L2/C2) * -1)/Math.log10(1 + IM2);
double CT2 = CN2 * C2;
double CTotal = CT1 + CT2;
amountSaved = CTotal - minLoop;
}
} // end method runCalcs
//Workbook wb = new HSSFWorkbook();
public double savedReturn() {
return amountSaved;
}
} // end class twoLoans
BTW, 'main()' è solo un metodo che registra un 'Runnable' nel thread di invio dell'evento. Quel 'Runnable' quindi costruisce la GUI e chiama' execute() 'su un'istanza di' TwoWorker'. – trashgod
Come posso eseguire questo se in un'azionePerformato? Sarebbe ancora necessario un invokeLater o potrei semplicemente istanziare SwingWorker ed eseguirlo direttamente? –
Quest'ultimo, come mostrato [qui] (https://sites.google.com/site/drjohnbmatthews/randomdata). – trashgod