1

内部クラスからイベントを発生させようとしていますが、機能していません。これは私のコードです:

抽象モデル:

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 を拡張しますか?

4

2 に答える 2