• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 297
  • Last Modified:

Same result as selecting menu option in code?

I have a JMenuItem with an ActionListener (a separate class), the result is that if you select the menuitem then a filechooser opens to select a file (action A).

Now, when another menu item is chosen and a file value is empty then I want action A to occur as well. How do I do this'? I can add an ActionListener and check if the value is empty but at that point I cannot then add the other actionlistner code....

Any thoughts?
0
boardtc
Asked:
boardtc
  • 9
  • 9
1 Solution
 
sciuriwareCommented:
You can add an ActionListener to multiple controls.
May be they are to be different Listeners and to call a common method,
but you don't have to.

Make the ActionListener a class with static (global) state variables.

;JOOP!
0
 
boardtcAuthor Commented:
the 2nd menu option needs to check a string class member of the frame (not the ActionListener class) is empty before  "executing the first ActionListener"...
0
 
sciuriwareCommented:
Well, make that String static ...................................

;JOOP!
0
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
boardtcAuthor Commented:
When the 2nd menu item is chosen and a file value is empty then I want action A to occur, if it is not empty i want Action B to occur. Not sure how this second ActionListener could resuse the first one re a static String property?
0
 
sciuriwareCommented:
Of course such a static member belongs in the top of your GUI class, common to all controls.

;JOOP!
0
 
boardtcAuthor Commented:
When the 2nd menu item is chosen and a file value is empty then I want action A to occur, if it is not empty i want Action B to occur. Not sure how this second ActionListener could resuse the first one re a static String property in my main JFrame descendant class?
0
 
boardtcAuthor Commented:
Your one liners are not giving me enough to go on...how can I call the 1st actionlistener from within a 2ns actionlistenmer
JMenuItem 2ndMenuItem = new JMenuItem("2nd");
2ndMenuItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
	 			if (fileName.getText().isEmpty()) {
	 				// call actionlister from 1stMenuItem?
				} else {
	 				Do2nd();	
	 			}
			}
		});        

Open in new window

0
 
sciuriwareCommented:
That's not the way to go.
Your ActionListeners should be:
- or separate classes,
- or classes that only implement ActionListener and thus 'actionPerformed()'

The construct your code has I call "just-in-time-classes".
Advantage: simple coding,
Disadvantage: severe access problems.

My style: if I need only 1 actionlistener, I make the GUI class implement ActionListener,
If I need several I first try to split off the action in separate methods you can call at will,
or otherwise I make a new class.
The latter is clumsy and is rare with me.
Remember always that the actionPerformed() will find out what control fired,
so I can (I suppose) always chose what action(s) to call at any event.

;JOOP!
0
 
boardtcAuthor Commented:
@scuriware... the code example was to try and get a response other than a one liner. The actionListener I want to call is a separate class..I am now looking at passing the parent (JFrame) as a variable to a static method in it (so I can call the do2nd()) which first checks the string value...

...how can I find out the calling component from the actionEvent (in actionPerformed) as you describe?
0
 
sciuriwareCommented:
// Example for 2 buttons, just the same for menu items:

public class MyGui implements ActionListener
{
.................................................................... intervening code............
JButton button1 = new JButton("One");
JButton button2 = new JButton("Two");
.................................................................... intervening code............
    button1.addActionListener(this);
    button2.addActionListener(this);
.................................................................... intervening code............
   /** (non-Javadoc)
    * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
    * @param a action event.
    */
   public void actionPerformed(ActionEvent a)
   {
      Object o = a.getSource();

      if(o == button1)
      {
         doCallAction1();
      }
      else if(o == button2)
      {
         doCallAction2();
         doCallAction1();
      }

;JOOP!
0
 
boardtcAuthor Commented:
as ok, so a.getSource(); will not point to calling frame button/menuitem....does nto seem to be a solution other than including JFrame ref in the ActionListener class :-(
0
 
sciuriwareCommented:
>>> will not point to calling frame button/menuitem

It WILL point!

>>> does nto seem to be a solution

I wonder why you persist your construction? This is a much more open solution.

;JOOP!
0
 
sciuriwareCommented:
I object. The questioner is a bit stubborn.

;JOOP!
0
 
boardtcAuthor Commented:
so i will have to give points for free?
0
 
sciuriwareCommented:
You got a sincere advice: that's an answer.
You can redraw your question if there was no solution.

But, it's your decision .........................................................

;JOOP!
0
 
boardtcAuthor Commented:
forced by expert to give points
0
 
sciuriwareCommented:
I can live with that.
Please re-consider my advice.

;JOOP!
0
 
boardtcAuthor Commented:
will be requesting expert not to add comments to my questions in future
0

Featured Post

Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

  • 9
  • 9
Tackle projects and never again get stuck behind a technical roadblock.
Join Now