Jaroslav, Thank you for your input. I checked out your slideshow and I believe that this is going to help me a great deal!
I guess my problem is that this is my first foray into designing on the NetBeans Platform, so some old habits are dying rather hard. I will get this though, because I have loved NetBeans since somewhere around version 3 and am bound and determined to use the Platform for my application. Sincerely, Sean Carrick Owner - PekinSOFT Systems [email protected] (309) 989-0672 On Sat, Apr 4, 2020 at 12:51 AM Jaroslav Tulach <[email protected]> wrote: > Ăș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 > > >
