Ășt 31. 3. 2020 v 4:22 odesĂlatel Sean Carrick <s...@pekinsoft.com> 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 > s...@pekinsoft.com > (309) 989-0672 >