内部クラスからイベントを発生させようとしていますが、機能していません。これは私のコードです:
抽象モデル:
public abstract class AbstractModel {
public PropertyChangeSupport propertyChangeSupport;
public AbstractModel() {
propertyChangeSupport = new PropertyChangeSupport(this);
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.removePropertyChangeListener(listener);
}
protected void firePropertyChange(String propertyName, Object oldValue,
Object newValue) {
propertyChangeSupport.firePropertyChange(propertyName, oldValue,
newValue);
}
}
モデル:
public class GUImodel extends AbstractModel {
// Variables
private final ArrayList tempResultsTable = new ArrayList();
private static boolean done;
//
// RUN PROGRAM
//
public ArrayList run(ArrayList iF) {
try {
final BackgroundThread myThread = new BackgroundThread();
myThread.init(iF);
myThread.execute();
} catch (Exception e) {
e.printStackTrace();
}
return tempResultsTable;
}
public void done() {
System.out.println("done() called");
boolean oldValue = done;
done = true;
firePropertyChange(GUIcontroller.DONE_PROPERTY, oldValue, done);
}
class BackgroundThread extends SwingWorker<Void, Void> {
private ArrayList inputsFilesDataList;
public void init(ArrayList iF) {
inputsFilesDataList = iF;
done = false;
}
@Override
public Void doInBackground() throws Exception {
for (int i = 0; i < inputsFilesDataList.size(); i++) {
System.out.println(i);
}
return null;
}
@Override
protected void done() {
try {
boolean oldValue = done;
done = true;
firePropertyChange(GUIcontroller.DONE_PROPERTY, oldValue, done);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
見る:
public class GUIview{
...
public void propertyChange(final PropertyChangeEvent event) {
if (event.getPropertyName().equals(GUIcontroller.DONE_PROPERTY)) {
String newTab = (String)event.getNewValue();
updateTab(newTab);
}
}
...
}
抽象コントローラー:
public abstract class AbstractController implements PropertyChangeListener {
public final ArrayList<AbstractFrame> registeredViews;
public final ArrayList<AbstractModel> registeredModels;
public AbstractController() {
registeredViews = new ArrayList();
registeredModels = new ArrayList();
}
public void addModel(AbstractModel model) {
registeredModels.add(model);
model.addPropertyChangeListener(this);
}
public void removeModel(AbstractModel model) {
registeredModels.remove(model);
model.removePropertyChangeListener(this);
}
public void addView(GUIview view) {
registeredViews.add(view);
}
public void removeView(AbstractFrame view) {
registeredViews.remove(view);
}
@Override
public void propertyChange(PropertyChangeEvent event) {
for (AbstractFrame view : registeredViews) {
view.propertyChange(event);
}
}
}
コントローラ
public class GUIcontroller extends AbstractController {
public static final String DONE_PROPERTY = "done";
ArrayList inputsFilesList = m_model.loadFromExcel();
@Override
public void propertyChange(PropertyChangeEvent event) {
if (event.getPropertyName().equals(GUIcontroller.DONE_PROPERTY)) {
m_view.getResultsModel().updateResultsTableDataList(
m_model.getTempResultsTable());
} else {
for (AbstractFrame view : registeredViews) {
view.propertyChange(event);
}
}
}
public runProgram(){
m_model.run(inputsFilesList);
}
}
主要。
public class GUImain {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
createGUI();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public static void createGUI() {
InputsModel inputsModel = new InputsModel();
ResultsModel resultsModel = new ResultsModel();
GUImodel model = new GUImodel();
GUIcontroller controller = new GUIcontroller();
controller.addModel(model);
GUIview view = new GUIview(controller, model, inputsModel, resultsModel);
controller.addControllerListerners();
view.setVisible(true);
}
}
問題について何か考えはありますか?
バックグラウンド スレッドでいくつかのメソッドを実行する必要があるため、SwingWorker を拡張する内部クラスを使用しています。そのスレッドが終了したら、イベントを発生させて、変更をコントローラーに報告する必要があります。
done() メソッド内の「firePropertyChange(...)」行は実行されていません。
関連する質問: 特定のクラス ClassA が ClassAA を拡張し、その内部クラス ClassB が ClassBB を拡張する場合、内部クラス ClassB も ClassAA を拡張しますか?