Ășt 31. 3. 2020 v 4:22 odesĂlatel Sean Carrick <[email protected]> napsal:
> Hello, Dev List!
>
> I am somewhat new at designing RCPs on the NetBeans Platform and have run
> into a small issue. If anyone can point me in the right direction, I will
> be very grateful.
>
> I am working on a singleton class, FuelPurchaseManager, which stores the
> data for the Proof of Concept for my project for making fuel purchases. I
> have created a menu, Maintenance/Post Journals to Ledger. On this menu, I
> have created the following Action:
>
> package com.northwind.fuel.controller;
> import com.northwind.fuel.model.FuelPurchaseManager;import
> java.awt.event.ActionEvent;import java.awt.event.ActionListener;import
> org.openide.loaders.DataObject;import org.openide.awt.ActionID;import
> org.openide.awt.ActionReference;import
> org.openide.awt.ActionRegistration;import
> org.openide.util.NbBundle.Messages;
>
> @ActionID(
> category = "Maintenance",
> id = "com.northwind.fuel.controller.PostJournalToGL"
> )@ActionRegistration(
> iconBase = "com/northwind/fuel/postToGL.png",
> displayName = "#CTL_PostJournalToGL"
> )@ActionReference(path = "Menu/Maintenance/Journals", position =
> 3233)@Messages("CTL_PostJournalToGL=Post Fuel Journal")public final
> class PostJournalToGL implements ActionListener {
>
> private final FuelPurchaseManager context;
>
> public PostJournalToGL(FuelPurchaseManager context) {
> this.context = context;
> }
>
> @Override
> public void actionPerformed(ActionEvent ev) {
> FuelPurchaseManager.getInstance().actionPerformed(ev);
>
Wrong. Don't use singleton. Use `context`.
> }
> }
>
>
> I have set up the FuelPurchaseManager singleton as follows:
>
> public class FuelPurchaseManager extends AbstractAction
> implements LookupListener, ContextAwareAction {
>
Remove `extends AbstractAction implements LookupListener,
ContextAwareAction` keep just the business logic.
Then just make sure a TopComponent with instance of `FuelPurchaceManager`
in its lookup is opened - on startup - on some other action - etc.:
```
TopComponent tc = new TopComponent() {
{
associateLookup(Lookups.singleton(new
FuelPurchaceManager()));
}
};
tc.open();
tc.requestActive();
```
Your `PostJournalToGL` action is going to be enabled when your TopComponent
is focused and disabled otherwise.
-jt
PS:
https://www.slideshare.net/guestb9a4bf/mvcdci-in-netbeans-by-jaroslav-tulach
PPS: http://wiki.apidesign.org/wiki/DCI
> public static final long serialVersionUID = 6597346658963L;
>
> private static FuelPurchaseManager mgr = null;
> private Lookup context;
> Lookup.Result<FuelPurchaseManager> lkpInfo;
>
> private final ArrayList<FuelPurchase> journal;
>
> private FuelPurchaseManager() {
> this.journal = new ArrayList<>();
>
> /*
> *********************************************************************
> * DEBUGGING CODE: The following code, until the "END
> DEBUGGING" * * comment is for the Proof of Concept
> only. It will need to be * * updated to ***actual***
> business logic before we create a release * * build.
> *
> ********************************************************************/
> DateTimeFormatter fmt = DateTimeFormatter.ofPattern("MMM dd,
> yyyy");
> this.journal.add(new FuelPurchase(
> LocalDate.parse("Jan 14, 2020", fmt), // Tx date
> 540312, // Odometer
> 102.890, // # of gallons
> 2.765, // Price per gallon
> 284.49)); // Total price
> this.journal.add(new FuelPurchase(
> LocalDate.parse("Jan 17, 2020", fmt),
> 541990,
> 134.880,
> 2.493,
> 336.26));
> this.journal.add(new FuelPurchase(
> LocalDate.parse("Jan 20, 2020", fmt),
> 542766,
> 151.460,
> 2.420,
> 366.46));
> this.journal.add(new FuelPurchase(
> LocalDate.parse("Jan 21, 2020", fmt),
> 543088,
> 92.730,
> 2.306,
> 213.80));
> this.journal.add(new FuelPurchase(
> LocalDate.parse("Jan 23, 2020", fmt),
> 545317,
> 161.060,
> 2.620,
> 421.99));
> this.journal.add(new FuelPurchase(
> LocalDate.parse("Jan 25, 2020", fmt),
> 546525,
> 127.360,
> 2.706,
> 344.66));
> this.journal.add(new FuelPurchase(
> LocalDate.parse("Jan 29, 2020", fmt),
> 547184,
> 168.880,
> 2.315,
> 390.87));
> /*
> ********************************************************************
> * END OF DEBUGGING CODE: Remove the above before release
> build. *
> *******************************************************************/
> }
>
> private FuelPurchaseManager(Lookup context) {
> this();
>
> putValue(Action.NAME,
> NbBundle.getMessage(FuelPurchaseManager.class,
> "LBL_Action"));
> this.context = context;
> }
>
> void init() {
> assert SwingUtilities.isEventDispatchThread()
> : "this shall be called just from AWT thread";
>
> if ( lkpInfo != null ) {
> return;
> }
> }
>
> public static FuelPurchaseManager getInstance() {
> if ( mgr == null )
> mgr = new FuelPurchaseManager();
>
> return mgr;
> }
>
> @Override
> public boolean isEnabled() {
> init();
> return super.isEnabled();
> }
>
> @Override
> public void actionPerformed(ActionEvent e) {
> init();
>
>
> throw new UnsupportedOperationException("`FuelPurchaseManager."
> + "actionPerformed(ActionEvent e)` Not supported yet.");
> }
>
> @Override
> public void resultChanged(LookupEvent le) {
> setEnabled(!lkpInfo.allInstances().isEmpty());
> }
>
> @Override
> public Action createContextAwareInstance(Lookup lkp) {
> return FuelPurchaseManager.getInstance();
> }
>
> /* Many other data storage, retrieval, and manipulation methods
> below here */
> }
>
> Now, since the PostJournalToGL action class is set up as conditional,
> shouldn't it enable the menu item whenever there is a change to the data in
> the FuelPurchaseManager class?
>
> I have Googled this using every possible set of keywords that I am able to
> think up, but to no avail. I cannot seem to find anything that points me in
> the correct direction for making this work. Everything that I have found is
> dealing with visual elements in the application, mostly using Nodes to
> conditionally enable menu items and toolbar buttons.
>
> If you could possibly point me in the correct direction for solving this, I
> will be so grateful! However, if this is not possible, I can go with my
> only hope (which I hoped would just be temporary), which is creating a
> visual journal window for each module that contains a journal of financial
> transactions that will need to be posted to the General Ledger.
>
> Thanks for any help that you are able to provide with this issue.
>
> Sincerely,
>
> Sean Carrick
> Owner - PekinSOFT Systems
> [email protected]
> (309) 989-0672
>