Некоторые пояснения ... Читая ваш код, я вижу только то, что ваш класс WellParameters реализует интерфейсы FocusListener и ActionListener (не статические классы). Насколько я могу понять из вашего кода, методы focusGained (FocusEvent e) и focusLost (FocusEvent e) реализованы из прежнего интерфейса и обновляют значения статического класса. и вы зависите от тех же вычисленных значений в событии ActionListener actionPerformed () . Проблема, с которой вы здесь сталкиваетесь, - это состояние гонки относительно статических значений экземпляров.
http://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html
А.3.4 Недоступен
Объект переходит в недоступное состояние
когда нет более сильных ссылок на него
существовать. Когда объект недоступен,
это кандидат на сбор. Заметка
формулировка: только потому, что объект
кандидат на сбор не
значит, это будет немедленно собрано.
JVM может отложить сбор
пока нет срочной необходимости
память, используемая
объект. Важно отметить, что
не просто сильная ссылка
держать объект в памяти. Эти должны
быть ссылки на эту цепь из
корень сборки мусора. Корни GC
специальный класс переменных, который
включает в себя
Временные переменные в стеке (любого потока)
Статические переменные (из любого класса)
Специальные ссылки из нативного кода JNI
Основываясь на этой документации по сборке мусора, я подозреваю, что ВСЕ статические ссылки вашего класса KillWellCalculations были пригодны для сбора мусора после вызова методов FocusEvent, и поэтому они недоступны к моменту запуска события actionPerformed () .
Вы все еще можете использовать статические методы класса KillWellCalculations в качестве служебного класса, только если этот класс используется другими классами. Если нет, вы можете преобразовать его в класс Value, который содержит вычисления для вас, БЕЗ статических ссылок. Поскольку вам нужно иметь ссылку на экземпляр класса, который содержит значения вычислений ... Например:
public Class CalculatedValues {
private int measuredDepth;
private double mudInActivePits;
public static CalculatedValues makeNew() {
return new CalculatedValues();
}
public void setMeasuredDepth(String measuredDepthTString) {
if (measuredDepthTString == null) {
throw new IllegalArgumentException("The measured depth must be provided.");
}
try {
this.measuredDepth = Integer.parseInt(measuredDepthTString);
} catch(NumberFormatException nfe) {
throw new IllegalArgumentException("The value provided is not an interger.");
}
}
public int getMeasuredDepth() {
return measuredDepth;
}
public void setMudInActivePitsT(String mudInActivePitsTString) {
if (mudInActivePitsTString == null) {
throw new IllegalArgumentException("The measured mudInActivePits must be provided.");
}
try {
this.mudInActivePits = Double.parseDouble(measuredDepthTString);
} catch(NumberFormatException nfe) {
throw new IllegalArgumentException("The value provided is not an double.");
}
}
public double getMeasuredDepth() {
return mudInActivePits;
}
//...
//...
// MORE THE OTHER VALUES/PROPERTIES IMPORTANT/NEEDED BY THE CALCULATION.
public void doAllCalculations() {
// YOU HAVE TO IMPLEMENT THE LOGIC FOR THOSE ONES, OPTIONALLY USING THE SAME UTILITY/HELPER STATIC METHODS FROM
setPressureBeforeCasingBurstAndFormationFracture();
setCirculatingPressures();
setTriplexPumpCapacity();
}
}
Затем измените конструктор класса, чтобы получить экземпляр объекта значения:
...
...
// THE VALUE OBJECT REFERENCE WITH THE VALUES YOU NEED TO HOLD DURING THE FORM INTERACTION
private CalculatedValues calculatedValues;
WellParameters() {
super("Well Parameters", true, true, false, true);
this.setBounds(0, 0, 600, 385);
this.setVisible(true);
this.setLayout(new BorderLayout());
...//GUI Stuff
this.add(submitButtonPanel, BorderLayout.SOUTH);
// THE VALUE OBJECT REFERENCE...
calculatedValues = CalculatedValues.makeNew();
}
Затем обновите ссылку с расчетом:
@Override
public void focusLost(FocusEvent e) {
try {
if(e.getSource() == measuredDepthT) {
//KillWellCalculations.measuredDepth = Integer.parseInt(measuredDepthT.getText());
// the exceptions thrown can be caught in the catch below and you can display the error message from the value class.
calculatedValues.setMeasuredDepth(measuredDepthT.getText());
...//Others
// collect other values as well...
} else if(e.getSource() == mudInActivePitsT) {
//KillWellCalculations.mudInActivePits = Double.parseDouble(mudInActivePitsT.getText());
// do try/catch for the possible runtime exception and display an error message
calculatedValues.setMudInActivePitsT(mudInActivePitsT.getText());
}
} catch (Exception ignore) {
}
}
Обновления на последнем шаге также с использованием ссылки на экземпляр:
@Override
public void actionPerformed(ActionEvent e) {
try {
if(e.getSource() == submitButton) {
System.out.println(KillWellCalculations.pumpEfficiency);
// THE REFERENCES THAT THIS STATIC METHOD USE WERE ALL GARBAGE-COLLECTED AT THE TIME OF THE CALL... IF SHOULD HAVE THE CALCULATED METHODS IN THE VALUE CLASS. SOMETHING LIKE THE FOLLOWING:
// KillWellCalculations.setPressureBeforeCasingBurstAndFormationFracture(); //Doesn't work
//KillWellCalculations.setCirculatingPressures();
//KillWellCalculations.setTriplexPumpCapacity();
//System.out.println(KillWellCalculations.mudInActivePits);
//System.out.println(KillWellCalculations.pumpFactor);
//System.out.println(KillWellCalculations.finalCirculatingPressure);}
// DO THE FINAL CALCULATION IN A SINGLE METHOD IN THE VALUE OBJECT.
calculatedValues.doAllCalculations();
// HERE ARE THE GETTERS FROM THE CALCULATED VALUES OF THE DO ALL CALCULATIONS YOU HAVE TO IMPLEMENT.
System.out.println(calculatedValues.getMudInActivePits());
System.out.println(calculatedValues.getPumpFactor());
System.out.println(calculatedValues.getFinalCirculatingPressure());}
// CONSIDERING YOU'RE DONE WITH THE VALUES, JUST CLEAR THE INSTANCE VALUES
// AS THIS REFERENCE IS NOT STATIC AND IT WILL NOT BE GARBAGE-COLLECTED.
calculatedValues.clearValues();
}
catch(Exception ignore) {}
}
Я проделал некоторую работу в обратном направлении, связанную с графическим интерфейсом ... Вы можете увидеть очень похожий пример на http://code.google.com/p/marcellodesales-cs-research/source/browse/trunk/grad-ste-ufpe-brazil/ptf-add-on-dev/src/br/ufpe/cin/stp/ptfaddon/view/swing/execution/JWizardInternalFrame.java
Удачи!