지금, 내 메인 그냥 10 행 gui를 호출합니다. 텍스트가있는 행의 수를 기준으로 9 개의 클래스 중 1 개가 호출됩니다 (2 개의 행에는 텍스트가 있어야 함). 호출 된 클래스는 진행률 막대를 연결하려는 계산을 수행합니다. 다음은 호출 된 클래스 중 하나의 예제입니다 (각 클래스는 비슷하지만 새 클래스를 보증 할만큼 충분히 다릅니다.). 문제는 EDT 규칙을 위반하는 것으로 생각되지만, 필자가 본 모든 예제는 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
사실,'main()'은 이벤트 디스패치 스레드에'Runnable'을 게시하는 메소드 일뿐입니다. 그러면 Runnable은 GUI를 생성하고'TwoWorker'의 인스턴스에서'execute()'를 호출합니다. – trashgod
actionPerformed에서 어떻게 실행합니까? invokeLater가 여전히 필요하거나 SwingWorker를 인스턴스화하고 직접 실행할 수 있습니까? –
후자는 [여기] (https://sites.google.com/site/drjohnbmatthews/randomdata)와 같이 표시됩니다. – trashgod