Peut une barre de progression de être utilisés dans une classe en dehors des principales?
Droit maintenant, mon principal appelle simplement une interface graphique avec 10 lignes. Basé sur le nombre de ces lignes de texte, 1 des 9 classes (deux lignes doivent avoir le texte). La classe appelée effectue des calculs que j'aimerais avoir la barre de progression liée à l'. Voici un exemple de l'une des classes (chaque classe est similaire, mais suffisamment différentes pour justifier une nouvelle classe.) Je crois que le problème est une violation de l'EDT règles, mais tous les exemples que j'ai vu sur leur associer un argument principal. L'image s'affiche lorsque le code est exécuté, mais la barre de progression n'est pas mis à jour jusqu'à ce que tous les calculs sont terminés.
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
Vous devez vous connecter pour publier un commentaire.
SwingWorker
est idéal pour cela. L'exemple ci-dessous effectue une simple itération en arrière-plan, tandis que la présentation des progrès et des résultats intermédiaires dans une fenêtre. Vous pouvez entrer ce que paramètres dont vous avez besoin dans unSwingWorker
constructeur.main()
est juste une méthode qui affiche uneRunnable
à l'event dispatch thread. QueRunnable
construit alors le GUI et les appelsexecute()
sur une instance deTwoWorker
.JFreeChart
exemple.Je pense que vous prémonition est droit, vous devez adhérer à Swing filetage règles.
Alors que faire?
Tout d'abord, je ne suis pas sûr de savoir comment votre application est conçue exactement. Vous dites que vous avez une trame principale avec un tas de lignes, et, potentiellement, chacun pourrait éventuellement appeler l'une des 9 classes, et ils se ressemblent tous comme ci-dessus. Il semble que ces classes permettent de générer leurs propres
JFrame
. Je suppose que ce nouveau cadre est uniquement utilisé pour la barre de progression. Je vais supposer que c'est la conception et de proposer en conséquence.Je vous suggérons d'effectuer quelques actions dans les instances de
Runnable
, et vous le déposez cesRunnable
instances dansSwingUtilities.invokeLater
à les exécuter sur l'EDT. En même temps, je voudrais prendre le temps de réorganiser votre code pour plus de facilité si la lecture.Merci pour l'aide. J'ai commencé par essayer d'utiliser la première réponse, mais je ne pouvais pas la barre pour s'exécuter simultanément, et il a couru lorsque le programme est terminé. Je suis sûr que ça marcherait, mais je n'étais pas en mesure de le comprendre. À l'aide de trashgod de réponse et de quelques autres exemples, j'ai été capable de le faire fonctionner à l'aide de
SwingWorker
. Malheureusement, je ne suis pas totalement comprendre comment il fonctionne, mais je vais le prendre pour l'instant.L'interface graphique et la méthode à exécuter les calculs sont appelés dans une autre classe de première:
Puis il se déroule comme suit: